From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 49883C7EE2E for ; Fri, 9 Jun 2023 20:54:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B5EF56B0072; Fri, 9 Jun 2023 16:54:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B0F6D6B0074; Fri, 9 Jun 2023 16:54:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9B0378E0002; Fri, 9 Jun 2023 16:54:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 8C2AC6B0072 for ; Fri, 9 Jun 2023 16:54:25 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 535B412024D for ; Fri, 9 Jun 2023 20:54:25 +0000 (UTC) X-FDA: 80884412490.21.AA8CB99 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf28.hostedemail.com (Postfix) with ESMTP id B213AC0009 for ; Fri, 9 Jun 2023 20:54:21 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=g9WK6tIE; spf=pass (imf28.hostedemail.com: domain of peterx@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=peterx@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1686344063; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=BtXUpcsSOoMANhYIjxCH4S5rCaK3q7YtG7uZtBil9Bg=; b=waPLXHNW4tgbYYdI1YhjDs+btTTut31aUGaaRnNyGvuBB5TdVYgOWqNGJ+ZJeqbtK298Hi oslrW/gMUB9xy87eDo2mnialF0qEB+TptOK1iqcP8orInxgoX6uDUpVSQ2HF22C7nh7w84 CAOFwE7dDE7MmhEK8IpLixCpmlub8PU= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=g9WK6tIE; spf=pass (imf28.hostedemail.com: domain of peterx@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=peterx@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1686344063; a=rsa-sha256; cv=none; b=cdsCKEd2vWmYjlsCjK2CPuFZ+J0ek81uwTsicdRtHNl8rutjy81/7oWBZ27NcuU6JC5OK7 meqfZLKCUQAUlNBnXoY1hKuxXlkB1jhtkNtqDEN0jIE8Lkum7k76j6CoOUO+nPDEGKMPQP uhT/Wh5ocBJIfJ2R2bdNJF0L8yT5m5U= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1686344061; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=BtXUpcsSOoMANhYIjxCH4S5rCaK3q7YtG7uZtBil9Bg=; b=g9WK6tIESTDPOhCkmYf1ecHTZ81YOd8Xpna8LjavHfxDUhPXWCpuj/OsldTmET7bLptm/9 raKyXxM55l1+mnJSRcdmkkFBi+DagC9vkdy/xJyTpEGqqkBFsqZjLU3Xe3gcLM+G+VhcSw izd4IXSdz+ZTEcvjmKxlzxi7MJDqPEk= Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-159-FRA7McsUNCuIaATZVQkLjg-1; Fri, 09 Jun 2023 16:54:18 -0400 X-MC-Unique: FRA7McsUNCuIaATZVQkLjg-1 Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-62849c5e9f0so3573916d6.1 for ; Fri, 09 Jun 2023 13:54:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686344058; x=1688936058; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=BtXUpcsSOoMANhYIjxCH4S5rCaK3q7YtG7uZtBil9Bg=; b=h29n7oMsjemHa/XugzlHiSO94ltVTsuOxoWxSmiJ2XyhzJEWj+ozermuB7NawmOSsl JIMCXuAyJjNipL/05ekNalF3NUwSWV6yaSBawsuj5ydu1r3UURfWpZX68hBrpOyiKG6P Tob/id65h6F9dDMoyCPY21fNvg0L3Fj/55DlqJXpzagyIYpV4OH0M/PYBVLZpYY9Rg23 m+KxZ93o/qPmK9nwBsArF5/dczzmfCbUpQX/FHn1xUvQCtT3pNFVE/U4uxXatgKzm2wb b0TI96cbiAkJ0frQe+xrSja1ko+L0ZaBxXyD9Fw/wIxgUaAHjltteksYuVLpwiq2Hcta UpnQ== X-Gm-Message-State: AC+VfDzX7pAHUSOG5oEvWYxGlZ2VIHjS2UeraqiGN+b0CkBg2/VPo1Ai 52w5WiM6CjPfoGc38hgKhO4qj8Daw7W0sNQuNw6u8GQrfTNeMt2wX1TmZGHbbjotlKQEOsatrM3 GDYYReOvuLXA= X-Received: by 2002:a05:6214:411b:b0:622:265e:3473 with SMTP id kc27-20020a056214411b00b00622265e3473mr3267157qvb.1.1686344057856; Fri, 09 Jun 2023 13:54:17 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7VmR+n9mJc3ncQaU9/pPLVR1AT84gvlgTZNz1yYb5YR/q3ykKIdaxPnpKT6M4foeVkkKwQcw== X-Received: by 2002:a05:6214:411b:b0:622:265e:3473 with SMTP id kc27-20020a056214411b00b00622265e3473mr3267135qvb.1.1686344057488; Fri, 09 Jun 2023 13:54:17 -0700 (PDT) Received: from x1n (cpe5c7695f3aee0-cm5c7695f3aede.cpe.net.cable.rogers.com. [99.254.144.39]) by smtp.gmail.com with ESMTPSA id j14-20020a0cf50e000000b0062595cd1972sm1411236qvm.82.2023.06.09.13.54.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 09 Jun 2023 13:54:16 -0700 (PDT) Date: Fri, 9 Jun 2023 16:54:14 -0400 From: Peter Xu To: Suren Baghdasaryan Cc: akpm@linux-foundation.org, willy@infradead.org, hannes@cmpxchg.org, mhocko@suse.com, josef@toxicpanda.com, jack@suse.cz, ldufour@linux.ibm.com, laurent.dufour@fr.ibm.com, michel@lespinasse.org, liam.howlett@oracle.com, jglisse@google.com, vbabka@suse.cz, minchan@google.com, dave@stgolabs.net, punit.agrawal@bytedance.com, lstoakes@gmail.com, hdanton@sina.com, apopple@nvidia.com, ying.huang@intel.com, david@redhat.com, yuzhao@google.com, dhowells@redhat.com, hughd@google.com, viro@zeniv.linux.org.uk, brauner@kernel.org, pasha.tatashin@soleen.com, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@android.com Subject: Re: [PATCH v2 5/6] mm: implement folio wait under VMA lock Message-ID: References: <20230609005158.2421285-1-surenb@google.com> <20230609005158.2421285-6-surenb@google.com> MIME-Version: 1.0 In-Reply-To: <20230609005158.2421285-6-surenb@google.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Disposition: inline X-Rspamd-Queue-Id: B213AC0009 X-Rspam-User: X-Stat-Signature: ka5sf6h5is6wxnn48hrwn9fqwstbnuxf X-Rspamd-Server: rspam01 X-HE-Tag: 1686344061-174262 X-HE-Meta: U2FsdGVkX18GPxoafc8JejOsZGfd3m5rW9ETPfD6cxVV955Ian3xT6/0Y+FRjCJ8c1Ta5Y/gtqerNHX5873cFsz9RtycQiiOVIp7BfEfaLMOTn60Ej+qJZNZQ4r1zvCBsP6hnXAAwEnsFILI39nEDbzXsZ2UtboTZXIOhkB+bZpNnJ8LWlPMubQXgmPbuppFrY8xHdXBte5TvzI1tMbXZwAEA0HkHOuVSULPcJqD0Xw96nTOlHYc61nyefUzBX56h0wj4d0JW8gasWcN0MFu9NZXoIhtK9IIXoFrYWoBvPYvi8ynOxu1MFPuPH1eZO0hfNjzwCYT65F+bf8CyMRO7VLcran2xf1qQPU2m7F4bHKVOIvUY3sq8IoB2r7OPMjeZczzpKVNhfOLat3INTnHmJwvKtiU+d54hNMo+C7T/pscYp1wE/Djn0VaAhn1+IwfAkV5Ngf8+JhlEHWjAS7pRtu75NmfqPnSrEx+ZTQv4iJS8y5CA7UjwpxcLjJOesXD7rJUsdF2aGSLYpRCKGupqwBB9tyxtfTV9Kjqkd+2JjrQY8wVRffKDpgHjU7St/ww12S/wkOhnY0Mrc/G8I/esNX4926cG5kdB2V+JVmqtKBF7SswAaSxFlVwoHe1Nk4KHxKnsZy1xVytSL0r/RaT2D3oovY4ZkWQEkuY8N1R3DsRNYLGHlRHyLx0IdryCihK9CAzyM/o+okJtuGqLXGGDuxVwT1/42n5OiB6v98SEy/rqefS92IX0p79AVNvr9fSKUeIXZil7sf2K1nXVQlWvflgPq+DYGBRvDFNGy1ebQuwwNKS2bQg/TlpXIjaa4IYta9CHCrQIB4Iudv1p6uwknoIGO2pqxBh4NzQHhNWKOOCmCudKYZIiLntSE+VlnHUcGE6j+CmDsY1AiHEw/Lz/n2gi23n8L++2z57SJTdJX1NIHq6MO+pKlglxh4q+wSOn6QHtiuiHB6e6EV0DDb oXNCrc91 s//PBB/1cLJvZOh3y8LBUij62AipsPW1/ueOtisIbZ7QW591sdxrAQ56/LqIMlUSOjIIYLSfgx/uOSHQNycDJKe1PO4v8twpcyG77lFaXNnh1qNXD3uVUeKNWYP9WYz7zDrTHqG9B8ysfperCwcMiGc5jmrn+CpILYpMf5Y4Pg2lpubSzW88RFVu03HBli9QS/fc8fSlwPKbzMhf2X8dxd8fVEWOu37x/kEf/iVPUANLhIMU1Qh/yDLdqamv/pWhyDkEN4LS3NdFm6NVZuzMefmrphwL4lAK5FIBIOGC7CED3brYK94BLyvyAtIyLhu2aWrGXHAkG/FMoPwlY3VUsycJ0zvLcRxl0ey3Q4ZlhhL/2j47QtPDX7ugLFGgCr0mkYNgM04X0eJBdV1s= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Thu, Jun 08, 2023 at 05:51:57PM -0700, Suren Baghdasaryan wrote: > Follow the same pattern as mmap_lock when waiting for folio by dropping > VMA lock before the wait and retrying once folio is available. > > Signed-off-by: Suren Baghdasaryan > --- > include/linux/pagemap.h | 14 ++++++++++---- > mm/filemap.c | 43 ++++++++++++++++++++++------------------- > mm/memory.c | 13 ++++++++----- > 3 files changed, 41 insertions(+), 29 deletions(-) > > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h > index a56308a9d1a4..6c9493314c21 100644 > --- a/include/linux/pagemap.h > +++ b/include/linux/pagemap.h > @@ -896,8 +896,8 @@ static inline bool wake_page_match(struct wait_page_queue *wait_page, > > void __folio_lock(struct folio *folio); > int __folio_lock_killable(struct folio *folio); > -bool __folio_lock_or_retry(struct folio *folio, struct mm_struct *mm, > - unsigned int flags); > +bool __folio_lock_or_retry(struct folio *folio, struct vm_area_struct *vma, > + unsigned int flags, bool *lock_dropped); > void unlock_page(struct page *page); > void folio_unlock(struct folio *folio); > > @@ -1002,10 +1002,16 @@ static inline int folio_lock_killable(struct folio *folio) > * __folio_lock_or_retry(). > */ > static inline bool folio_lock_or_retry(struct folio *folio, > - struct mm_struct *mm, unsigned int flags) > + struct vm_area_struct *vma, unsigned int flags, > + bool *lock_dropped) > { > might_sleep(); > - return folio_trylock(folio) || __folio_lock_or_retry(folio, mm, flags); > + if (folio_trylock(folio)) { > + *lock_dropped = false; > + return true; > + } > + > + return __folio_lock_or_retry(folio, vma, flags, lock_dropped); > } > > /* > diff --git a/mm/filemap.c b/mm/filemap.c > index 7cb0a3776a07..838955635fbc 100644 > --- a/mm/filemap.c > +++ b/mm/filemap.c > @@ -1701,37 +1701,35 @@ static int __folio_lock_async(struct folio *folio, struct wait_page_queue *wait) > > /* > * Return values: > - * true - folio is locked; mmap_lock is still held. > + * true - folio is locked. > * false - folio is not locked. > - * mmap_lock has been released (mmap_read_unlock(), unless flags had both > - * FAULT_FLAG_ALLOW_RETRY and FAULT_FLAG_RETRY_NOWAIT set, in > - * which case mmap_lock is still held. > - * If flags had FAULT_FLAG_VMA_LOCK set, meaning the operation is performed > - * with VMA lock only, the VMA lock is still held. > + * > + * lock_dropped indicates whether mmap_lock/VMA lock got dropped. > + * mmap_lock/VMA lock is dropped when function fails to lock the folio, > + * unless flags had both FAULT_FLAG_ALLOW_RETRY and FAULT_FLAG_RETRY_NOWAIT > + * set, in which case mmap_lock/VMA lock is still held. This seems to be a separate change to have "lock_dropped", would it worth a separate patch for it if needed? I do agree it's confusing and it might be the reason of this change, but I think it may or may not help much.. as long as VM_FAULT_RETRY semantics kept unchanged iiuc (it doesn't always imply mmap lock released, only if !NOWAIT, which can be confusing too). Especially that doesn't seem like a must for the vma change. IIUC to support vma lock here we can simply keep everything as before, but only release proper lock based on the fault flag should work. But maybe I just missed something, so that relies on the answer to previous patch... > * > * If neither ALLOW_RETRY nor KILLABLE are set, will always return true > - * with the folio locked and the mmap_lock unperturbed. > + * with the folio locked and the mmap_lock/VMA lock unperturbed. > */ > -bool __folio_lock_or_retry(struct folio *folio, struct mm_struct *mm, > - unsigned int flags) > +bool __folio_lock_or_retry(struct folio *folio, struct vm_area_struct *vma, > + unsigned int flags, bool *lock_dropped) > { > - /* Can't do this if not holding mmap_lock */ > - if (flags & FAULT_FLAG_VMA_LOCK) > - return false; > - > if (fault_flag_allow_retry_first(flags)) { > - /* > - * CAUTION! In this case, mmap_lock is not released > - * even though return 0. > - */ > - if (flags & FAULT_FLAG_RETRY_NOWAIT) > + if (flags & FAULT_FLAG_RETRY_NOWAIT) { > + *lock_dropped = false; > return false; > + } > > - mmap_read_unlock(mm); > + if (flags & FAULT_FLAG_VMA_LOCK) > + vma_end_read(vma); > + else > + mmap_read_unlock(vma->vm_mm); > if (flags & FAULT_FLAG_KILLABLE) > folio_wait_locked_killable(folio); > else > folio_wait_locked(folio); > + *lock_dropped = true; > return false; > } > if (flags & FAULT_FLAG_KILLABLE) { > @@ -1739,13 +1737,18 @@ bool __folio_lock_or_retry(struct folio *folio, struct mm_struct *mm, > > ret = __folio_lock_killable(folio); > if (ret) { > - mmap_read_unlock(mm); > + if (flags & FAULT_FLAG_VMA_LOCK) > + vma_end_read(vma); > + else > + mmap_read_unlock(vma->vm_mm); > + *lock_dropped = true; > return false; > } > } else { > __folio_lock(folio); > } > > + *lock_dropped = false; > return true; > } > > diff --git a/mm/memory.c b/mm/memory.c > index c234f8085f1e..acb09a3aad53 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -3568,6 +3568,7 @@ static vm_fault_t remove_device_exclusive_entry(struct vm_fault *vmf) > struct folio *folio = page_folio(vmf->page); > struct vm_area_struct *vma = vmf->vma; > struct mmu_notifier_range range; > + bool lock_dropped; > > /* > * We need a reference to lock the folio because we don't hold > @@ -3580,8 +3581,10 @@ static vm_fault_t remove_device_exclusive_entry(struct vm_fault *vmf) > if (!folio_try_get(folio)) > return 0; > > - if (!folio_lock_or_retry(folio, vma->vm_mm, vmf->flags)) { > + if (!folio_lock_or_retry(folio, vma, vmf->flags, &lock_dropped)) { > folio_put(folio); > + if (lock_dropped && vmf->flags & FAULT_FLAG_VMA_LOCK) > + return VM_FAULT_VMA_UNLOCKED | VM_FAULT_RETRY; > return VM_FAULT_RETRY; > } > mmu_notifier_range_init_owner(&range, MMU_NOTIFY_EXCLUSIVE, 0, > @@ -3704,7 +3707,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) > bool exclusive = false; > swp_entry_t entry; > pte_t pte; > - int locked; > + bool lock_dropped; > vm_fault_t ret = 0; > void *shadow = NULL; > > @@ -3837,9 +3840,9 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) > goto out_release; > } > > - locked = folio_lock_or_retry(folio, vma->vm_mm, vmf->flags); > - > - if (!locked) { > + if (!folio_lock_or_retry(folio, vma, vmf->flags, &lock_dropped)) { > + if (lock_dropped && vmf->flags & FAULT_FLAG_VMA_LOCK) > + ret |= VM_FAULT_VMA_UNLOCKED; > ret |= VM_FAULT_RETRY; > goto out_release; > } > -- > 2.41.0.162.gfafddb0af9-goog > -- Peter Xu