{"id":2230789,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230789/?format=json","web_url":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260430040427.4672-4-baohua@kernel.org/","project":{"id":2,"url":"http://patchwork.ozlabs.org/api/1.1/projects/2/?format=json","name":"Linux PPC development","link_name":"linuxppc-dev","list_id":"linuxppc-dev.lists.ozlabs.org","list_email":"linuxppc-dev@lists.ozlabs.org","web_url":"https://github.com/linuxppc/wiki/wiki","scm_url":"https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git","webscm_url":"https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/"},"msgid":"<20260430040427.4672-4-baohua@kernel.org>","date":"2026-04-30T04:04:25","name":"[v2,3/5] mm: Move folio_lock_or_retry() and drop __folio_lock_or_retry()","commit_ref":null,"pull_url":null,"state":"handled-elsewhere","archived":false,"hash":"cf65e0fe1a223a6a2343e271b995d895065910c4","submitter":{"id":48512,"url":"http://patchwork.ozlabs.org/api/1.1/people/48512/?format=json","name":"Barry Song","email":"baohua@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260430040427.4672-4-baohua@kernel.org/mbox/","series":[{"id":502184,"url":"http://patchwork.ozlabs.org/api/1.1/series/502184/?format=json","web_url":"http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=502184","date":"2026-04-30T04:04:27","name":"mm: reduce mmap_lock contention and improve page fault performance","version":2,"mbox":"http://patchwork.ozlabs.org/series/502184/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2230789/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2230789/checks/","tags":{},"headers":{"Return-Path":"\n <linuxppc-dev+bounces-20328-incoming=patchwork.ozlabs.org@lists.ozlabs.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linuxppc-dev@lists.ozlabs.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=HVHmp1Z+;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-20328-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)","lists.ozlabs.org;\n arc=none smtp.remote-ip=\"2600:3c04:e001:324:0:1991:8:25\"","lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org","lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=HVHmp1Z+;\n\tdkim-atps=neutral","lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=kernel.org\n (client-ip=2600:3c04:e001:324:0:1991:8:25; helo=tor.source.kernel.org;\n envelope-from=baohua@kernel.org; receiver=lists.ozlabs.org)"],"Received":["from lists.ozlabs.org (lists.ozlabs.org\n [IPv6:2404:9400:21b9:f100::1])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1 raw public key)\n server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5gr80NrSz1yHv\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 14:17:44 +1000 (AEST)","from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4g5gr64NH6z2xl5;\n\tThu, 30 Apr 2026 14:17:42 +1000 (AEST)","from tor.source.kernel.org (tor.source.kernel.org\n [IPv6:2600:3c04:e001:324:0:1991:8:25])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4g5gYg44xXz2xMY\n\tfor <linuxppc-dev@lists.ozlabs.org>; Thu, 30 Apr 2026 14:05:11 +1000 (AEST)","from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n\tby tor.source.kernel.org (Postfix) with ESMTP id 85F7B61141;\n\tThu, 30 Apr 2026 04:05:09 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 52BA2C2BCB8;\n\tThu, 30 Apr 2026 04:05:04 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1777521912;\n\tcv=none;\n b=ih7nzZw5+US2qaqVGhcv1ixS6V+7sZgC1rmnxV2EEEdgp5zwiY7Ou2YmPGHosfSGlNjW6V4MPOm57sMKiIkWDo/5topSXt5C+9qLIVVgpzfePKXWsW51fyyK8V7CpRZDzTWQKX/OVIydrr8eLMlZwD9asQXtyc8sFPtahcnUk8/L4GKlIXMFqzbTpl7GPbJTjHgTQSOyCkLr5XaeDkM5gjgLcSEJSFWRaiJGz/9hlRdFux0XiMb9T8OFzVz1C4fyEyJHPiBYbAv9WnifG3UsfZ3Np1aCDE85Q5S+sJhoY2EdCrXN2tJ5MsKSf2XxKEzSU8q4iNA+/5b986UeDmHnjA==","ARC-Message-Signature":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1777521912; c=relaxed/relaxed;\n\tbh=91miQC+6ESWqee34eo4YVmoqoVtggz6DZAL6gngZUZw=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t MIME-Version;\n b=JAPKLoh5tpz8yWJ4QAPWLAqAdOvs2DU98xW2f5o0a64uEnRncPBRbDS3A786HPOgiqMNanbpsHXdDECZ5hAZBQFAVkRpgPMMeQFmNS75oOWT53S78TeG7OGaLX8qTYtwKk4uElL+HDsDLlcDsFIRnkvd3N647QbD2ZjixMc8EOcxbza7NqrVa0Vc+EgAi7pxtQsJmtuEVW7b9GxWniDANyeCpq/5sRn+M9MFSe3yBUVUB/t86HoWIYuwrgMl7h1V2R8zKR7HEbBaaEWC6gbHCm+rv3Dj8AwqCOujWIuI2oDIZ/coGx3W67gPuui3ygNXy3XWs6UMAwbyMjXFMiMC4Q==","ARC-Authentication-Results":"i=1; lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org;\n dkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=HVHmp1Z+; dkim-atps=neutral;\n spf=pass (client-ip=2600:3c04:e001:324:0:1991:8:25;\n helo=tor.source.kernel.org; envelope-from=baohua@kernel.org;\n receiver=lists.ozlabs.org) smtp.mailfrom=kernel.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1777521909;\n\tbh=IOVfryRIB//G7TP35s/rdTIpoHZE33+XU/HgNFu89vQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=HVHmp1Z+siadLb4Q4UHbDBBFXRgvKznPzVZgfJaZuDYbe4T7jnjjPpsDtJInwZIeE\n\t 4+I5FPsV3n+vKdFvmZlaVSvEPy/79jVItKW9FKiSkpofZcGT8gtPXTdJbnuWCRBQ7C\n\t IotyNjhp+vK1JXwZXT1524wwOq3YNWA8MbefdUygDl892tC+sKqCeBWIognUzoFWBz\n\t 1ZfPBOz5ggtDlvNtoxkZ97/ykVcs4f1SLEbGN/iXyxKX9lzWM6c+fEG+I0aotBh4/p\n\t pL2UOnf780mijkJBKnrAw7yfy8qSdrHqgtuQ3Q+6qcVgHDWif223rrlC6SFHrfHNEh\n\t uuxK+cvO1oYsg==","From":"\"Barry Song (Xiaomi)\" <baohua@kernel.org>","To":"akpm@linux-foundation.org,\n\tlinux-mm@kvack.org,\n\twilly@infradead.org","Cc":"david@kernel.org,\n\tljs@kernel.org,\n\tliam@infradead.org,\n\tvbabka@kernel.org,\n\trppt@kernel.org,\n\tsurenb@google.com,\n\tmhocko@suse.com,\n\tjack@suse.cz,\n\tpfalcato@suse.de,\n\twanglian@kylinos.cn,\n\tchentao@kylinos.cn,\n\tlianux.mm@gmail.com,\n\tkunwu.chan@gmail.com,\n\tliyangouwen1@oppo.com,\n\tchrisl@kernel.org,\n\tkasong@tencent.com,\n\tshikemeng@huaweicloud.com,\n\tnphamcs@gmail.com,\n\tbhe@redhat.com,\n\tyoungjun.park@lge.com,\n\tlinux-arm-kernel@lists.infradead.org,\n\tlinux-kernel@vger.kernel.org,\n\tloongarch@lists.linux.dev,\n\tlinuxppc-dev@lists.ozlabs.org,\n\tlinux-riscv@lists.infradead.org,\n\tlinux-s390@vger.kernel.org,\n\t\"Barry Song (Xiaomi)\" <baohua@kernel.org>","Subject":"[PATCH v2 3/5] mm: Move folio_lock_or_retry() and drop\n __folio_lock_or_retry()","Date":"Thu, 30 Apr 2026 12:04:25 +0800","Message-Id":"<20260430040427.4672-4-baohua@kernel.org>","X-Mailer":"git-send-email 2.39.3 (Apple Git-146)","In-Reply-To":"<20260430040427.4672-1-baohua@kernel.org>","References":"<20260430040427.4672-1-baohua@kernel.org>","X-Mailing-List":"linuxppc-dev@lists.ozlabs.org","List-Id":"<linuxppc-dev.lists.ozlabs.org>","List-Help":"<mailto:linuxppc-dev+help@lists.ozlabs.org>","List-Owner":"<mailto:linuxppc-dev+owner@lists.ozlabs.org>","List-Post":"<mailto:linuxppc-dev@lists.ozlabs.org>","List-Archive":"<https://lore.kernel.org/linuxppc-dev/>,\n  <https://lists.ozlabs.org/pipermail/linuxppc-dev/>","List-Subscribe":"<mailto:linuxppc-dev+subscribe@lists.ozlabs.org>,\n  <mailto:linuxppc-dev+subscribe-digest@lists.ozlabs.org>,\n  <mailto:linuxppc-dev+subscribe-nomail@lists.ozlabs.org>","List-Unsubscribe":"<mailto:linuxppc-dev+unsubscribe@lists.ozlabs.org>","Precedence":"list","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Spam-Status":"No, score=-0.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED,\n\tDKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS\n\tautolearn=disabled version=4.0.1 OzLabs 8","X-Spam-Checker-Version":"SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org"},"content":"folio_lock_or_retry() is effectively only used in mm/memory.c,\nnot in the filemap code. Move it there and make it static.\n\nThe helper __folio_lock_or_retry() can be folded into\nfolio_lock_or_retry(), allowing it to be removed.\n\nSigned-off-by: Barry Song (Xiaomi) <baohua@kernel.org>\n---\n include/linux/pagemap.h | 17 -------------\n mm/filemap.c            | 45 ----------------------------------\n mm/memory.c             | 53 +++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 53 insertions(+), 62 deletions(-)","diff":"diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h\nindex 1f50991b43e3..500ab783bf70 100644\n--- a/include/linux/pagemap.h\n+++ b/include/linux/pagemap.h\n@@ -1101,7 +1101,6 @@ static inline bool wake_page_match(struct wait_page_queue *wait_page,\n \n void __folio_lock(struct folio *folio);\n int __folio_lock_killable(struct folio *folio);\n-vm_fault_t __folio_lock_or_retry(struct folio *folio, struct vm_fault *vmf);\n void unlock_page(struct page *page);\n void folio_unlock(struct folio *folio);\n \n@@ -1198,22 +1197,6 @@ static inline int folio_lock_killable(struct folio *folio)\n \treturn 0;\n }\n \n-/*\n- * folio_lock_or_retry - Lock the folio, unless this would block and the\n- * caller indicated that it can handle a retry.\n- *\n- * Return value and mmap_lock implications depend on flags; see\n- * __folio_lock_or_retry().\n- */\n-static inline vm_fault_t folio_lock_or_retry(struct folio *folio,\n-\t\t\t\t\t     struct vm_fault *vmf)\n-{\n-\tmight_sleep();\n-\tif (!folio_trylock(folio))\n-\t\treturn __folio_lock_or_retry(folio, vmf);\n-\treturn 0;\n-}\n-\n /*\n  * This is exported only for folio_wait_locked/folio_wait_writeback, etc.,\n  * and should not be used directly.\ndiff --git a/mm/filemap.c b/mm/filemap.c\nindex a045b771e8de..b532d6cbafc8 100644\n--- a/mm/filemap.c\n+++ b/mm/filemap.c\n@@ -1740,51 +1740,6 @@ static int __folio_lock_async(struct folio *folio, struct wait_page_queue *wait)\n \treturn ret;\n }\n \n-/*\n- * Return values:\n- * 0 - folio is locked.\n- * non-zero - folio is not locked.\n- *     mmap_lock or per-VMA lock has been released (mmap_read_unlock() or\n- *     vma_end_read()), unless flags had both FAULT_FLAG_ALLOW_RETRY and\n- *     FAULT_FLAG_RETRY_NOWAIT set, in which case the lock is still held.\n- *\n- * If neither ALLOW_RETRY nor KILLABLE are set, will always return 0\n- * with the folio locked and the mmap_lock/per-VMA lock is left unperturbed.\n- */\n-vm_fault_t __folio_lock_or_retry(struct folio *folio, struct vm_fault *vmf)\n-{\n-\tunsigned int flags = vmf->flags;\n-\n-\tif (fault_flag_allow_retry_first(flags)) {\n-\t\t/*\n-\t\t * CAUTION! In this case, mmap_lock/per-VMA lock is not\n-\t\t * released even though returning VM_FAULT_RETRY.\n-\t\t */\n-\t\tif (flags & FAULT_FLAG_RETRY_NOWAIT)\n-\t\t\treturn VM_FAULT_RETRY;\n-\n-\t\trelease_fault_lock(vmf);\n-\t\tif (flags & FAULT_FLAG_KILLABLE)\n-\t\t\tfolio_wait_locked_killable(folio);\n-\t\telse\n-\t\t\tfolio_wait_locked(folio);\n-\t\treturn VM_FAULT_RETRY;\n-\t}\n-\tif (flags & FAULT_FLAG_KILLABLE) {\n-\t\tbool ret;\n-\n-\t\tret = __folio_lock_killable(folio);\n-\t\tif (ret) {\n-\t\t\trelease_fault_lock(vmf);\n-\t\t\treturn VM_FAULT_RETRY;\n-\t\t}\n-\t} else {\n-\t\t__folio_lock(folio);\n-\t}\n-\n-\treturn 0;\n-}\n-\n /**\n  * page_cache_next_miss() - Find the next gap in the page cache.\n  * @mapping: Mapping.\ndiff --git a/mm/memory.c b/mm/memory.c\nindex 00ee1599d637..0c740ca363cc 100644\n--- a/mm/memory.c\n+++ b/mm/memory.c\n@@ -4442,6 +4442,59 @@ void unmap_mapping_range(struct address_space *mapping,\n }\n EXPORT_SYMBOL(unmap_mapping_range);\n \n+/*\n+ * folio_lock_or_retry - Lock the folio, unless this would block and the\n+ * caller indicated that it can handle a retry.\n+ *\n+ * Return values:\n+ * 0 - folio is locked.\n+ * non-zero - folio is not locked.\n+ *     mmap_lock or per-VMA lock has been released (mmap_read_unlock() or\n+ *     vma_end_read()), unless flags had both FAULT_FLAG_ALLOW_RETRY and\n+ *     FAULT_FLAG_RETRY_NOWAIT set, in which case the lock is still held.\n+ *\n+ * If neither ALLOW_RETRY nor KILLABLE are set, will always return 0\n+ * with the folio locked and the mmap_lock/per-VMA lock is left unperturbed.\n+ */\n+static inline vm_fault_t folio_lock_or_retry(struct folio *folio,\n+\t\t\t\t\t     struct vm_fault *vmf)\n+{\n+\tunsigned int flags = vmf->flags;\n+\n+\tmight_sleep();\n+\tif (folio_trylock(folio))\n+\t\treturn 0;\n+\n+\tif (fault_flag_allow_retry_first(flags)) {\n+\t\t/*\n+\t\t * CAUTION! In this case, mmap_lock/per-VMA lock is not\n+\t\t * released even though returning VM_FAULT_RETRY.\n+\t\t */\n+\t\tif (flags & FAULT_FLAG_RETRY_NOWAIT)\n+\t\t\treturn VM_FAULT_RETRY;\n+\n+\t\trelease_fault_lock(vmf);\n+\t\tif (flags & FAULT_FLAG_KILLABLE)\n+\t\t\tfolio_wait_locked_killable(folio);\n+\t\telse\n+\t\t\tfolio_wait_locked(folio);\n+\t\treturn VM_FAULT_RETRY;\n+\t}\n+\tif (flags & FAULT_FLAG_KILLABLE) {\n+\t\tbool ret;\n+\n+\t\tret = __folio_lock_killable(folio);\n+\t\tif (ret) {\n+\t\t\trelease_fault_lock(vmf);\n+\t\t\treturn VM_FAULT_RETRY;\n+\t\t}\n+\t} else {\n+\t\t__folio_lock(folio);\n+\t}\n+\n+\treturn 0;\n+}\n+\n /*\n  * Restore a potential device exclusive pte to a working pte entry\n  */\n","prefixes":["v2","3/5"]}