From: Dev Jain <dev.jain@arm.com>
To: akpm@linux-foundation.org, david@redhat.com,
catalin.marinas@arm.com, will@kernel.org
Cc: lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com,
vbabka@suse.cz, rppt@kernel.org, surenb@google.com,
mhocko@suse.com, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, suzuki.poulose@arm.com,
steven.price@arm.com, gshan@redhat.com,
linux-arm-kernel@lists.infradead.org, Dev Jain <dev.jain@arm.com>
Subject: [PATCH 1/3] mm: Allow pagewalk without locks
Date: Fri, 30 May 2025 14:34:05 +0530 [thread overview]
Message-ID: <20250530090407.19237-2-dev.jain@arm.com> (raw)
In-Reply-To: <20250530090407.19237-1-dev.jain@arm.com>
It is noted at [1] that KFENCE can manipulate kernel pgtable entries during
softirqs. It does this by calling set_memory_valid() -> __change_memory_common().
This being a non-sleepable context, we cannot take the init_mm mmap lock.
Therefore, add PGWALK_NOLOCK to enable walk_page_range_novma() usage without
locks.
[1] https://lore.kernel.org/linux-arm-kernel/89d0ad18-4772-4d8f-ae8a-7c48d26a927e@arm.com/
Signed-off-by: Dev Jain <dev.jain@arm.com>
---
include/linux/pagewalk.h | 2 ++
mm/pagewalk.c | 12 ++++++++----
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/include/linux/pagewalk.h b/include/linux/pagewalk.h
index 9700a29f8afb..9bc8853ed3de 100644
--- a/include/linux/pagewalk.h
+++ b/include/linux/pagewalk.h
@@ -14,6 +14,8 @@ enum page_walk_lock {
PGWALK_WRLOCK = 1,
/* vma is expected to be already write-locked during the walk */
PGWALK_WRLOCK_VERIFY = 2,
+ /* no lock is needed */
+ PGWALK_NOLOCK = 3,
};
/**
diff --git a/mm/pagewalk.c b/mm/pagewalk.c
index e478777c86e1..9657cf4664b2 100644
--- a/mm/pagewalk.c
+++ b/mm/pagewalk.c
@@ -440,6 +440,8 @@ static inline void process_vma_walk_lock(struct vm_area_struct *vma,
case PGWALK_RDLOCK:
/* PGWALK_RDLOCK is handled by process_mm_walk_lock */
break;
+ default:
+ break;
}
#endif
}
@@ -640,10 +642,12 @@ int walk_page_range_novma(struct mm_struct *mm, unsigned long start,
* specified address range from being freed. The caller should take
* other actions to prevent this race.
*/
- if (mm == &init_mm)
- mmap_assert_locked(walk.mm);
- else
- mmap_assert_write_locked(walk.mm);
+ if (ops->walk_lock != PGWALK_NOLOCK) {
+ if (mm == &init_mm)
+ mmap_assert_locked(walk.mm);
+ else
+ mmap_assert_write_locked(walk.mm);
+ }
return walk_pgd_range(start, end, &walk);
}
--
2.30.2
next prev parent reply other threads:[~2025-05-30 9:09 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-30 9:04 [PATCH 0/3] Enable huge-vmalloc permission change Dev Jain
2025-05-30 9:04 ` Dev Jain [this message]
2025-05-30 10:33 ` [PATCH 1/3] mm: Allow pagewalk without locks Ryan Roberts
2025-05-30 21:33 ` Yang Shi
2025-05-30 10:57 ` Lorenzo Stoakes
2025-06-06 9:21 ` Dev Jain
2025-06-06 9:33 ` Dev Jain
2025-06-06 10:02 ` Lorenzo Stoakes
2025-05-30 9:04 ` [PATCH 2/3] arm64: pageattr: Use walk_page_range_novma() to change memory permissions Dev Jain
2025-05-30 12:53 ` Ryan Roberts
2025-06-02 4:35 ` Dev Jain
2025-06-06 9:49 ` Lorenzo Stoakes
2025-06-06 10:39 ` Dev Jain
2025-06-06 10:56 ` Lorenzo Stoakes
2025-06-06 11:08 ` Dev Jain
2025-06-09 9:41 ` Dev Jain
2025-06-09 11:00 ` Lorenzo Stoakes
2025-06-09 11:31 ` Dev Jain
2025-05-30 9:04 ` [PATCH 3/3] mm/pagewalk: Add pre/post_pte_table callback for lazy MMU on arm64 Dev Jain
2025-05-30 11:14 ` Lorenzo Stoakes
2025-05-30 12:12 ` Ryan Roberts
2025-05-30 12:18 ` Lorenzo Stoakes
2025-05-30 9:24 ` [PATCH 0/3] Enable huge-vmalloc permission change Dev Jain
2025-05-30 10:03 ` Ryan Roberts
2025-05-30 10:10 ` Dev Jain
2025-05-30 10:37 ` Ryan Roberts
2025-05-30 10:42 ` Dev Jain
2025-05-30 10:51 ` Ryan Roberts
2025-05-30 11:11 ` Dev Jain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250530090407.19237-2-dev.jain@arm.com \
--to=dev.jain@arm.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=catalin.marinas@arm.com \
--cc=david@redhat.com \
--cc=gshan@redhat.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mhocko@suse.com \
--cc=rppt@kernel.org \
--cc=steven.price@arm.com \
--cc=surenb@google.com \
--cc=suzuki.poulose@arm.com \
--cc=vbabka@suse.cz \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.