{"id":2230791,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230791/?format=json","web_url":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260430040427.4672-2-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-2-baohua@kernel.org>","date":"2026-04-30T04:04:23","name":"[v2,1/5] mm/filemap: Retry fault by VMA lock if the lock was released for I/O","commit_ref":null,"pull_url":null,"state":"handled-elsewhere","archived":false,"hash":"1e86f9179e7d4d116be0224bd2a1e8c4dc87109a","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-2-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/2230791/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2230791/checks/","tags":{},"headers":{"Return-Path":"\n <linuxppc-dev+bounces-20330-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=tDZQx6oM;\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-20330-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=tDZQx6oM;\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)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5grP4wHMz1yHv\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 14:17:57 +1000 (AEST)","from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4g5grP0yZhz2xlm;\n\tThu, 30 Apr 2026 14:17:57 +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 4g5gYS6vLlz2xMY\n\tfor <linuxppc-dev@lists.ozlabs.org>; Thu, 30 Apr 2026 14:05:00 +1000 (AEST)","from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n\tby tor.source.kernel.org (Postfix) with ESMTP id E5C8561141;\n\tThu, 30 Apr 2026 04:04:58 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id BA3EFC2BCC7;\n\tThu, 30 Apr 2026 04:04:53 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1777521901;\n\tcv=none;\n b=MGQ9gsF8j+JtNmIa4ta1jOHU0amtxDfTJM/eFji0Lod4vTLjJtnyM1bsSpFJ8KRK2msesHIk5Czij4lZJecXPNv8eSAHUqdI36lYaFYqrRH629hucLQQaDpUeNBorPh9uVHrBGMyhpsdokZWCIuHZvV2kyCHKWoZ3SBu+ylQf7n2iE0ar5/wBUTmWQ27O27BPuj4SwZ9rEjCnTaEVlH7khwoAK+MUJnTX+LoDZqfNtqDmB/hUXVrhVrnFI2EfrPLPx741sk7kCb/rVrmZEiLVLCNsZoYtPLCsFADu/Y4AvowNY+zWLDOZXeqmWXHXN76fTmceuwdj214lEr51Ww8Jg==","ARC-Message-Signature":"i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1777521901; c=relaxed/relaxed;\n\tbh=bf7vm9FSShse5cDViAIh5UivYdtJOMGEwi5WpcSQ7Is=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t MIME-Version;\n b=Zauxn8pFr6am060TjowCr9k0E3Iju14MKoOFpacZFKlt8y1txh56QpdYJoBUoTcjaWx0ZAsynBFTmusWfAI+iN3VLaRGI8JTMYcUaNgQuUiLXd5vNKVfSQ2jerBM4Tf6Yr2FibtUEkcccn49VzzI0FTAg39FBLbxssx875nFEAXWYysmJm4bjLvJUUKXu4ysxC7QBkmi2yotUMrXre8m4XKb1KbkKKK9wT4FYlpksmVUPG1l1uRNgGofmegA2wKr6nCpXZ7uHkXNY6l45KxPVaF/1/zhgI5QleQoSvkiH2RvaL50p6XEyS+ab5TM743ZsbkbjTBh43ZNgfliMrXrSw==","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=tDZQx6oM; 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=1777521898;\n\tbh=Bph0u8wp8/lT6x+zIK7zTGylHyQ++q1X8M3Sbba/pLg=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=tDZQx6oMyj/Pbp4oBZWlhtLtNlz20xltWaQQB7lkuzfNAsCqOFPj1LDkODNunAa/l\n\t 2By5McbFvCHbx4vd1YOH1CgGYWq47II+aDe8CMmYB3kuvppesXkGksqverSZ3qGPIU\n\t VKF7cIFaSqdwzevlCnjgHtL/gURYNW12fE4YtXp4gq3rPI4AQcGoZQHGnEYTMVrI99\n\t T88uENlzRWQhIDjN/pZcjvAfUvgg81aDjgHE6Gwn7VPmdmS8mvmNv0wWK/a+u+e/6G\n\t Saw+bXv1YLhhn5fwyqZhztWdHAozVqlrG2Vsrs64/3e0lRUNv1XjbrN+Qi0mKHxbyF\n\t M0Zmb6n7L2IMw==","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\tBarry Song <baohua@kernel.org>","Subject":"[PATCH v2 1/5] mm/filemap: Retry fault by VMA lock if the lock was\n released for I/O","Date":"Thu, 30 Apr 2026 12:04:23 +0800","Message-Id":"<20260430040427.4672-2-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":"From: Oven Liyang <liyangouwen1@oppo.com>\n\nIf the current page fault is using the per-VMA lock, and we only released\nthe lock to wait for I/O completion (e.g., using folio_lock()), then when\nthe fault is retried after the I/O completes, it should still qualify for\nthe per-VMA-lock path.\n\nAcked-by: Pedro Falcato <pfalcato@suse.de>\nTested-by: Wang Lian <wanglian@kylinos.cn>\nTested-by: Kunwu Chan <chentao@kylinos.cn>\nReviewed-by: Wang Lian <lianux.mm@gmail.com>\nReviewed-by: Kunwu Chan <kunwu.chan@gmail.com>\nSigned-off-by: Oven Liyang <liyangouwen1@oppo.com>\nCo-developed-by: Barry Song <baohua@kernel.org>\nSigned-off-by: Barry Song <baohua@kernel.org>\n---\n arch/arm/mm/fault.c       | 5 +++++\n arch/arm64/mm/fault.c     | 5 +++++\n arch/loongarch/mm/fault.c | 4 ++++\n arch/powerpc/mm/fault.c   | 5 ++++-\n arch/riscv/mm/fault.c     | 4 ++++\n arch/s390/mm/fault.c      | 4 ++++\n arch/x86/mm/fault.c       | 4 ++++\n include/linux/mm_types.h  | 9 +++++----\n mm/filemap.c              | 5 ++++-\n 9 files changed, 39 insertions(+), 6 deletions(-)","diff":"diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c\nindex e62cc4be5adf..5971e02845f7 100644\n--- a/arch/arm/mm/fault.c\n+++ b/arch/arm/mm/fault.c\n@@ -391,6 +391,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)\n \tif (!(flags & FAULT_FLAG_USER))\n \t\tgoto lock_mmap;\n \n+retry_vma:\n \tvma = lock_vma_under_rcu(mm, addr);\n \tif (!vma)\n \t\tgoto lock_mmap;\n@@ -420,6 +421,10 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)\n \t\t\tgoto no_context;\n \t\treturn 0;\n \t}\n+\n+\t/* If the first try is only about waiting for the I/O to complete */\n+\tif (fault & VM_FAULT_RETRY_VMA)\n+\t\tgoto retry_vma;\n lock_mmap:\n \n retry:\ndiff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c\nindex 739800835920..d0362a3e11b7 100644\n--- a/arch/arm64/mm/fault.c\n+++ b/arch/arm64/mm/fault.c\n@@ -673,6 +673,7 @@ static int __kprobes do_page_fault(unsigned long far, unsigned long esr,\n \tif (!(mm_flags & FAULT_FLAG_USER))\n \t\tgoto lock_mmap;\n \n+retry_vma:\n \tvma = lock_vma_under_rcu(mm, addr);\n \tif (!vma)\n \t\tgoto lock_mmap;\n@@ -719,6 +720,10 @@ static int __kprobes do_page_fault(unsigned long far, unsigned long esr,\n \t\t\tgoto no_context;\n \t\treturn 0;\n \t}\n+\n+\t/* If the first try is only about waiting for the I/O to complete */\n+\tif (fault & VM_FAULT_RETRY_VMA)\n+\t\tgoto retry_vma;\n lock_mmap:\n \n retry:\ndiff --git a/arch/loongarch/mm/fault.c b/arch/loongarch/mm/fault.c\nindex 2c93d33356e5..738f495560c0 100644\n--- a/arch/loongarch/mm/fault.c\n+++ b/arch/loongarch/mm/fault.c\n@@ -219,6 +219,7 @@ static void __kprobes __do_page_fault(struct pt_regs *regs,\n \tif (!(flags & FAULT_FLAG_USER))\n \t\tgoto lock_mmap;\n \n+retry_vma:\n \tvma = lock_vma_under_rcu(mm, address);\n \tif (!vma)\n \t\tgoto lock_mmap;\n@@ -265,6 +266,9 @@ static void __kprobes __do_page_fault(struct pt_regs *regs,\n \t\t\tno_context(regs, write, address);\n \t\treturn;\n \t}\n+\t/* If the first try is only about waiting for the I/O to complete */\n+\tif (fault & VM_FAULT_RETRY_VMA)\n+\t\tgoto retry_vma;\n lock_mmap:\n \n retry:\ndiff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c\nindex 806c74e0d5ab..cb7ffc20c760 100644\n--- a/arch/powerpc/mm/fault.c\n+++ b/arch/powerpc/mm/fault.c\n@@ -487,6 +487,7 @@ static int ___do_page_fault(struct pt_regs *regs, unsigned long address,\n \tif (!(flags & FAULT_FLAG_USER))\n \t\tgoto lock_mmap;\n \n+retry_vma:\n \tvma = lock_vma_under_rcu(mm, address);\n \tif (!vma)\n \t\tgoto lock_mmap;\n@@ -516,7 +517,9 @@ static int ___do_page_fault(struct pt_regs *regs, unsigned long address,\n \n \tif (fault_signal_pending(fault, regs))\n \t\treturn user_mode(regs) ? 0 : SIGBUS;\n-\n+\t/* If the first try is only about waiting for the I/O to complete */\n+\tif (fault & VM_FAULT_RETRY_VMA)\n+\t\tgoto retry_vma;\n lock_mmap:\n \n \t/* When running in the kernel we expect faults to occur only to\ndiff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c\nindex 04ed6f8acae4..b94cf57c2b9a 100644\n--- a/arch/riscv/mm/fault.c\n+++ b/arch/riscv/mm/fault.c\n@@ -347,6 +347,7 @@ void handle_page_fault(struct pt_regs *regs)\n \tif (!(flags & FAULT_FLAG_USER))\n \t\tgoto lock_mmap;\n \n+retry_vma:\n \tvma = lock_vma_under_rcu(mm, addr);\n \tif (!vma)\n \t\tgoto lock_mmap;\n@@ -376,6 +377,9 @@ void handle_page_fault(struct pt_regs *regs)\n \t\t\tno_context(regs, addr);\n \t\treturn;\n \t}\n+\t/* If the first try is only about waiting for the I/O to complete */\n+\tif (fault & VM_FAULT_RETRY_VMA)\n+\t\tgoto retry_vma;\n lock_mmap:\n \n retry:\ndiff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c\nindex 191cc53caead..e0576e629f65 100644\n--- a/arch/s390/mm/fault.c\n+++ b/arch/s390/mm/fault.c\n@@ -294,6 +294,7 @@ static void do_exception(struct pt_regs *regs, int access)\n \t\tflags |= FAULT_FLAG_WRITE;\n \tif (!(flags & FAULT_FLAG_USER))\n \t\tgoto lock_mmap;\n+retry_vma:\n \tvma = lock_vma_under_rcu(mm, address);\n \tif (!vma)\n \t\tgoto lock_mmap;\n@@ -318,6 +319,9 @@ static void do_exception(struct pt_regs *regs, int access)\n \t\t\thandle_fault_error_nolock(regs, 0);\n \t\treturn;\n \t}\n+\t/* If the first try is only about waiting for the I/O to complete */\n+\tif (fault & VM_FAULT_RETRY_VMA)\n+\t\tgoto retry_vma;\n lock_mmap:\n retry:\n \tvma = lock_mm_and_find_vma(mm, address, regs);\ndiff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c\nindex f0e77e084482..0589fc693eea 100644\n--- a/arch/x86/mm/fault.c\n+++ b/arch/x86/mm/fault.c\n@@ -1322,6 +1322,7 @@ void do_user_addr_fault(struct pt_regs *regs,\n \tif (!(flags & FAULT_FLAG_USER))\n \t\tgoto lock_mmap;\n \n+retry_vma:\n \tvma = lock_vma_under_rcu(mm, address);\n \tif (!vma)\n \t\tgoto lock_mmap;\n@@ -1351,6 +1352,9 @@ void do_user_addr_fault(struct pt_regs *regs,\n \t\t\t\t\t\t ARCH_DEFAULT_PKEY);\n \t\treturn;\n \t}\n+\t/* If the first try is only about waiting for the I/O to complete */\n+\tif (fault & VM_FAULT_RETRY_VMA)\n+\t\tgoto retry_vma;\n lock_mmap:\n \n retry:\ndiff --git a/include/linux/mm_types.h b/include/linux/mm_types.h\nindex a308e2c23b82..5907200ea587 100644\n--- a/include/linux/mm_types.h\n+++ b/include/linux/mm_types.h\n@@ -1678,10 +1678,11 @@ enum vm_fault_reason {\n \tVM_FAULT_NOPAGE         = (__force vm_fault_t)0x000100,\n \tVM_FAULT_LOCKED         = (__force vm_fault_t)0x000200,\n \tVM_FAULT_RETRY          = (__force vm_fault_t)0x000400,\n-\tVM_FAULT_FALLBACK       = (__force vm_fault_t)0x000800,\n-\tVM_FAULT_DONE_COW       = (__force vm_fault_t)0x001000,\n-\tVM_FAULT_NEEDDSYNC      = (__force vm_fault_t)0x002000,\n-\tVM_FAULT_COMPLETED      = (__force vm_fault_t)0x004000,\n+\tVM_FAULT_RETRY_VMA      = (__force vm_fault_t)0x000800,\n+\tVM_FAULT_FALLBACK       = (__force vm_fault_t)0x001000,\n+\tVM_FAULT_DONE_COW       = (__force vm_fault_t)0x002000,\n+\tVM_FAULT_NEEDDSYNC      = (__force vm_fault_t)0x004000,\n+\tVM_FAULT_COMPLETED      = (__force vm_fault_t)0x008000,\n \tVM_FAULT_HINDEX_MASK    = (__force vm_fault_t)0x0f0000,\n };\n \ndiff --git a/mm/filemap.c b/mm/filemap.c\nindex ab34cab2416a..a045b771e8de 100644\n--- a/mm/filemap.c\n+++ b/mm/filemap.c\n@@ -3525,6 +3525,7 @@ vm_fault_t filemap_fault(struct vm_fault *vmf)\n \tstruct folio *folio;\n \tvm_fault_t ret = 0;\n \tbool mapping_locked = false;\n+\tbool retry_by_vma_lock = false;\n \n \tmax_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);\n \tif (unlikely(index >= max_idx))\n@@ -3621,6 +3622,8 @@ vm_fault_t filemap_fault(struct vm_fault *vmf)\n \t */\n \tif (fpin) {\n \t\tfolio_unlock(folio);\n+\t\tif (vmf->flags & FAULT_FLAG_VMA_LOCK)\n+\t\t\tretry_by_vma_lock = true;\n \t\tgoto out_retry;\n \t}\n \tif (mapping_locked)\n@@ -3671,7 +3674,7 @@ vm_fault_t filemap_fault(struct vm_fault *vmf)\n \t\tfilemap_invalidate_unlock_shared(mapping);\n \tif (fpin)\n \t\tfput(fpin);\n-\treturn ret | VM_FAULT_RETRY;\n+\treturn ret | VM_FAULT_RETRY | (retry_by_vma_lock ? VM_FAULT_RETRY_VMA : 0);\n }\n EXPORT_SYMBOL(filemap_fault);\n \n","prefixes":["v2","1/5"]}