[PATCH v2 4/8] mm/memory-failure: convert process iterator to for_each_process_rculock
From: Ye Liu <hidden>
Date: 2026-09-07 08:14:42
Also in:
linux-fsdevel, linux-mm, linux-pm, linux-security-module, lkml, rcu
Subsystem:
hwpoison memory failure handling, memory management, the rest · Maintainers:
Miaohe Lin, Andrew Morton, Linus Torvalds
From: Ye Liu <liuye@kylinos.cn> Replace the manual rcu_read_lock()/rcu_read_unlock() pairs combined with for_each_process() loop in mm/memory-failure.c with for_each_process_rculock(), which scopes the RCU read lock to the loop body via scoped_guard(rcu). In collect_procs_file(), the page_pgoff() call now falls outside the RCU read-side critical section. This is safe because page_pgoff() only reads folio->index and does not traverse any RCU-protected structures. Signed-off-by: Ye Liu <liuye@kylinos.cn> Acked-by: Michal Hocko <mhocko@suse.com> Acked-by: Miaohe Lin <linmiaohe@huawei.com> --- Changes in v2: - Rename *_rcu to *_rculock - Clarify page_pgoff() safety outside RCU lock (SJ Park) mm/memory-failure.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index a8b03e2920ba..7d93deb1f7b3 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c@@ -555,8 +555,7 @@ static void collect_procs_anon(const struct folio *folio, return; pgoff = page_pgoff(folio, page); - rcu_read_lock(); - for_each_process(tsk) { + for_each_process_rculock(tsk) { struct vm_area_struct *vma; struct anon_vma_chain *vmac; struct task_struct *t = task_early_kill(tsk, force_early);
@@ -572,7 +571,6 @@ static void collect_procs_anon(const struct folio *folio, add_to_kill_anon_file(t, page, vma, to_kill, addr); } } - rcu_read_unlock(); anon_vma_unlock_read(av); }
@@ -589,9 +587,8 @@ static void collect_procs_file(const struct folio *folio, pgoff_t pgoff; i_mmap_lock_read(mapping); - rcu_read_lock(); pgoff = page_pgoff(folio, page); - for_each_process(tsk) { + for_each_process_rculock(tsk) { struct task_struct *t = task_early_kill(tsk, force_early); unsigned long addr;
@@ -611,7 +608,6 @@ static void collect_procs_file(const struct folio *folio, add_to_kill_anon_file(t, page, vma, to_kill, addr); } } - rcu_read_unlock(); i_mmap_unlock_read(mapping); }
@@ -635,8 +631,7 @@ static void collect_procs_fsdax(const struct page *page, struct task_struct *tsk; i_mmap_lock_read(mapping); - rcu_read_lock(); - for_each_process(tsk) { + for_each_process_rculock(tsk) { struct task_struct *t = tsk; /*
@@ -653,7 +648,6 @@ static void collect_procs_fsdax(const struct page *page, add_to_kill_fsdax(t, page, vma, to_kill, pgoff); } } - rcu_read_unlock(); i_mmap_unlock_read(mapping); } #endif /* CONFIG_FS_DAX */
@@ -2288,8 +2282,7 @@ static void collect_procs_pfn(struct pfn_address_space *pfn_space, struct address_space *mapping = pfn_space->mapping; i_mmap_lock_read(mapping); - rcu_read_lock(); - for_each_process(tsk) { + for_each_process_rculock(tsk) { struct task_struct *t = tsk; t = task_early_kill(tsk, true);
@@ -2303,7 +2296,6 @@ static void collect_procs_pfn(struct pfn_address_space *pfn_space, add_to_kill_pgoff(t, vma, to_kill, pgoff); } } - rcu_read_unlock(); i_mmap_unlock_read(mapping); }
--
2.25.1