On Mon, Sep 07, 2026 at 04:13:30PM +0800, Ye Liu wrote: > From: Ye Liu <[email protected]> > > 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 <[email protected]> > Acked-by: Michal Hocko <[email protected]> > Acked-by: Miaohe Lin <[email protected]>
LGTM so: Reviewed-by: Lorenzo Stoakes (ARM) <[email protected]> > --- > 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 > -- Cheers, Lorenzo
