* [PATCH 0/8] mm: introduce for_each_process_rcu and for_each_thread_rcu
@ 2026-09-04 8:29 Ye Liu
2026-09-04 8:29 ` [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu Ye Liu
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Ye Liu @ 2026-09-04 8:29 UTC (permalink / raw)
To: Andrew Morton, Michal Hocko, Peter Zijlstra, Paul E. McKenney,
Ingo Molnar, Steven Rostedt, Josh Poimboeuf,
Mickaël Salaün
Cc: Ye Liu, David Hildenbrand, Miaohe Lin, Naoya Horiguchi,
Rafael J. Wysocki, linux-mm, linux-kernel, linux-pm, rcu,
linux-trace-kernel, linux-fsdevel, linux-security-module,
Günther Noack
From: Ye Liu <liuye@kylinos.cn>
Introduce for_each_process_rcu(), for_each_thread_rcu() and
for_each_process_thread_rcu() macros that combine the existing
iteration macros with scoped_guard(rcu), so that the RCU read lock
is automatically acquired before iteration and released when the
loop exits — including via break, goto, or return.
The rest of the series converts manual rcu_read_lock()/
rcu_read_unlock() and guard(rcu)() pairs across mm/, kernel/, fs/,
lib/ and security/ to use the new macros.
Patch 1 may trigger checkpatch "Macros with complex values should be
enclosed in parentheses" errors. These are false positives — the
scoped_guard() pattern is a control-flow construct, not a multi-
statement macro, and the same idiom is used elsewhere in the kernel.
Suggested by Michal Hocko for the oom_kill path [1].
[1] https://lore.kernel.org/all/20260813092933.562028-1-ye.liu@linux.dev/
Ye Liu (8):
mm: introduce for_each_process_rcu and for_each_thread_rcu
mm/oom_kill: convert process/thread iterators to for_each_*_rcu
mm/ksm: convert process iterator to for_each_process_rcu
mm/memory-failure: convert process iterator to for_each_process_rcu
kernel: convert process/thread iterators to for_each_*_rcu
fs: convert process/thread iterators to for_each_*_rcu
lib: convert process iterator to for_each_process_rcu
security/landlock: convert thread iterator to for_each_thread_rcu
fs/proc/base.c | 4 +---
fs/resctrl/rdtgroup.c | 8 ++------
include/linux/sched/signal.h | 19 +++++++++++++++++++
kernel/cpu.c | 4 +---
kernel/freezer.c | 4 +---
kernel/hung_task.c | 7 ++-----
kernel/locking/lockdep.c | 4 +---
kernel/rcu/update.c | 4 +---
kernel/sched/core.c | 3 +--
kernel/sched/debug.c | 4 +---
kernel/trace/fgraph.c | 8 ++------
kernel/unwind/deferred.c | 3 +--
lib/is_single_threaded.c | 5 +----
mm/ksm.c | 4 +---
mm/memory-failure.c | 16 ++++------------
mm/oom_kill.c | 20 +++++---------------
security/landlock/tsync.c | 8 ++------
17 files changed, 46 insertions(+), 79 deletions(-)
Signed-off-by: Ye Liu <liuye@kylinos.cn>
--
2.25.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu
2026-09-04 8:29 [PATCH 0/8] mm: introduce for_each_process_rcu and for_each_thread_rcu Ye Liu
@ 2026-09-04 8:29 ` Ye Liu
2026-09-04 11:04 ` Michal Hocko
2026-09-05 0:32 ` SJ Park
2026-09-04 8:29 ` [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu Ye Liu
2026-09-04 8:29 ` [PATCH 4/8] mm/memory-failure: " Ye Liu
2 siblings, 2 replies; 10+ messages in thread
From: Ye Liu @ 2026-09-04 8:29 UTC (permalink / raw)
To: Michal Hocko, Andrew Morton
Cc: Ye Liu, David Rientjes, Shakeel Butt, linux-mm, linux-kernel
From: Ye Liu <liuye@kylinos.cn>
Replace the manual rcu_read_lock()/rcu_read_unlock() pairs wrapping
for_each_process()/for_each_thread() loops with for_each_process_rcu()
and for_each_thread_rcu(), so that the RCU read-side critical section
is scoped to the loop body.
No functional change.
Signed-off-by: Ye Liu <liuye@kylinos.cn>
---
mm/oom_kill.c | 20 +++++---------------
1 file changed, 5 insertions(+), 15 deletions(-)
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 5f372f6e26fa..8dd025965810 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -94,8 +94,7 @@ static bool oom_cpuset_eligible(struct task_struct *start,
bool ret = false;
const nodemask_t *mask = oc->nodemask;
- rcu_read_lock();
- for_each_thread(start, tsk) {
+ for_each_thread_rcu(start, tsk) {
if (mask) {
/*
* If this is a mempolicy constrained oom, tsk's
@@ -114,7 +113,6 @@ static bool oom_cpuset_eligible(struct task_struct *start,
if (ret)
break;
}
- rcu_read_unlock();
return ret;
}
@@ -368,11 +366,9 @@ static void select_bad_process(struct oom_control *oc)
else {
struct task_struct *p;
- rcu_read_lock();
- for_each_process(p)
+ for_each_process_rcu(p)
if (oom_evaluate_task(p, oc))
break;
- rcu_read_unlock();
}
}
@@ -430,14 +426,12 @@ static void dump_tasks(struct oom_control *oc)
struct task_struct *p;
int i = 0;
- rcu_read_lock();
- for_each_process(p) {
+ for_each_process_rcu(p) {
/* Avoid potential softlockup warning */
if ((++i & 1023) == 0)
touch_softlockup_watchdog();
dump_task(p, oc);
}
- rcu_read_unlock();
}
}
@@ -894,8 +888,7 @@ static bool task_will_free_mem(struct task_struct *task)
* are dying as well to make sure that a) nobody pins its mm and
* b) the task is also reapable by the oom reaper.
*/
- rcu_read_lock();
- for_each_process(p) {
+ for_each_process_rcu(p) {
if (!process_shares_mm(p, mm))
continue;
if (same_thread_group(task, p))
@@ -904,7 +897,6 @@ static bool task_will_free_mem(struct task_struct *task)
if (!ret)
break;
}
- rcu_read_unlock();
return ret;
}
@@ -960,8 +952,7 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
* That thread will now get access to memory reserves since it has a
* pending fatal signal.
*/
- rcu_read_lock();
- for_each_process(p) {
+ for_each_process_rcu(p) {
if (!process_shares_mm(p, mm))
continue;
if (same_thread_group(p, victim))
@@ -982,7 +973,6 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
continue;
do_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_TGID);
}
- rcu_read_unlock();
if (can_oom_reap)
queue_oom_reaper(victim);
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu
2026-09-04 8:29 [PATCH 0/8] mm: introduce for_each_process_rcu and for_each_thread_rcu Ye Liu
2026-09-04 8:29 ` [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu Ye Liu
@ 2026-09-04 8:29 ` Ye Liu
2026-09-04 11:04 ` Michal Hocko
2026-09-05 0:33 ` SJ Park
2026-09-04 8:29 ` [PATCH 4/8] mm/memory-failure: " Ye Liu
2 siblings, 2 replies; 10+ messages in thread
From: Ye Liu @ 2026-09-04 8:29 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand
Cc: Ye Liu, Xu Xin, Chengming Zhou, linux-mm, linux-kernel
From: Ye Liu <liuye@kylinos.cn>
Replace the manual rcu_read_lock()/rcu_read_unlock() pair combined
with for_each_process() loop in mm/ksm.c with for_each_process_rcu().
No functional change.
Signed-off-by: Ye Liu <liuye@kylinos.cn>
---
mm/ksm.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/mm/ksm.c b/mm/ksm.c
index 49d48d1e0998..fa5e4c47fb1b 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -3280,8 +3280,7 @@ void collect_procs_ksm(const struct folio *folio, const struct page *page,
struct anon_vma *av = rmap_item->anon_vma;
anon_vma_lock_read(av);
- rcu_read_lock();
- for_each_process(tsk) {
+ for_each_process_rcu(tsk) {
struct anon_vma_chain *vmac;
const unsigned long addr = rmap_item->address & PAGE_MASK;
const unsigned long index = rmap_item->linear_page_index;
@@ -3298,7 +3297,6 @@ void collect_procs_ksm(const struct folio *folio, const struct page *page,
}
}
}
- rcu_read_unlock();
anon_vma_unlock_read(av);
}
}
--
2.25.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/8] mm/memory-failure: convert process iterator to for_each_process_rcu
2026-09-04 8:29 [PATCH 0/8] mm: introduce for_each_process_rcu and for_each_thread_rcu Ye Liu
2026-09-04 8:29 ` [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu Ye Liu
2026-09-04 8:29 ` [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu Ye Liu
@ 2026-09-04 8:29 ` Ye Liu
2026-09-04 11:05 ` Michal Hocko
2026-09-05 0:39 ` SJ Park
2 siblings, 2 replies; 10+ messages in thread
From: Ye Liu @ 2026-09-04 8:29 UTC (permalink / raw)
To: Miaohe Lin, Andrew Morton; +Cc: Ye Liu, Naoya Horiguchi, linux-mm, linux-kernel
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_rcu().
No functional change.
Signed-off-by: Ye Liu <liuye@kylinos.cn>
---
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..63a2ff08ee33 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_rcu(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_rcu(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_rcu(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_rcu(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
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu
2026-09-04 8:29 ` [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu Ye Liu
@ 2026-09-04 11:04 ` Michal Hocko
2026-09-05 0:32 ` SJ Park
1 sibling, 0 replies; 10+ messages in thread
From: Michal Hocko @ 2026-09-04 11:04 UTC (permalink / raw)
To: Ye Liu
Cc: Andrew Morton, Ye Liu, David Rientjes, Shakeel Butt, linux-mm,
linux-kernel
On Fri 04-09-26 16:29:54, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Replace the manual rcu_read_lock()/rcu_read_unlock() pairs wrapping
> for_each_process()/for_each_thread() loops with for_each_process_rcu()
> and for_each_thread_rcu(), so that the RCU read-side critical section
> is scoped to the loop body.
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
> ---
> mm/oom_kill.c | 20 +++++---------------
> 1 file changed, 5 insertions(+), 15 deletions(-)
>
> diff --git a/mm/oom_kill.c b/mm/oom_kill.c
> index 5f372f6e26fa..8dd025965810 100644
> --- a/mm/oom_kill.c
> +++ b/mm/oom_kill.c
> @@ -94,8 +94,7 @@ static bool oom_cpuset_eligible(struct task_struct *start,
> bool ret = false;
> const nodemask_t *mask = oc->nodemask;
>
> - rcu_read_lock();
> - for_each_thread(start, tsk) {
> + for_each_thread_rcu(start, tsk) {
> if (mask) {
> /*
> * If this is a mempolicy constrained oom, tsk's
> @@ -114,7 +113,6 @@ static bool oom_cpuset_eligible(struct task_struct *start,
> if (ret)
> break;
> }
> - rcu_read_unlock();
>
> return ret;
> }
> @@ -368,11 +366,9 @@ static void select_bad_process(struct oom_control *oc)
> else {
> struct task_struct *p;
>
> - rcu_read_lock();
> - for_each_process(p)
> + for_each_process_rcu(p)
> if (oom_evaluate_task(p, oc))
> break;
> - rcu_read_unlock();
> }
> }
>
> @@ -430,14 +426,12 @@ static void dump_tasks(struct oom_control *oc)
> struct task_struct *p;
> int i = 0;
>
> - rcu_read_lock();
> - for_each_process(p) {
> + for_each_process_rcu(p) {
> /* Avoid potential softlockup warning */
> if ((++i & 1023) == 0)
> touch_softlockup_watchdog();
> dump_task(p, oc);
> }
> - rcu_read_unlock();
> }
> }
>
> @@ -894,8 +888,7 @@ static bool task_will_free_mem(struct task_struct *task)
> * are dying as well to make sure that a) nobody pins its mm and
> * b) the task is also reapable by the oom reaper.
> */
> - rcu_read_lock();
> - for_each_process(p) {
> + for_each_process_rcu(p) {
> if (!process_shares_mm(p, mm))
> continue;
> if (same_thread_group(task, p))
> @@ -904,7 +897,6 @@ static bool task_will_free_mem(struct task_struct *task)
> if (!ret)
> break;
> }
> - rcu_read_unlock();
>
> return ret;
> }
> @@ -960,8 +952,7 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
> * That thread will now get access to memory reserves since it has a
> * pending fatal signal.
> */
> - rcu_read_lock();
> - for_each_process(p) {
> + for_each_process_rcu(p) {
> if (!process_shares_mm(p, mm))
> continue;
> if (same_thread_group(p, victim))
> @@ -982,7 +973,6 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
> continue;
> do_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_TGID);
> }
> - rcu_read_unlock();
>
> if (can_oom_reap)
> queue_oom_reaper(victim);
> --
> 2.25.1
--
Michal Hocko
SUSE Labs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu
2026-09-04 8:29 ` [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu Ye Liu
@ 2026-09-04 11:04 ` Michal Hocko
2026-09-05 0:33 ` SJ Park
1 sibling, 0 replies; 10+ messages in thread
From: Michal Hocko @ 2026-09-04 11:04 UTC (permalink / raw)
To: Ye Liu
Cc: Andrew Morton, David Hildenbrand, Ye Liu, Xu Xin, Chengming Zhou,
linux-mm, linux-kernel
On Fri 04-09-26 16:29:55, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Replace the manual rcu_read_lock()/rcu_read_unlock() pair combined
> with for_each_process() loop in mm/ksm.c with for_each_process_rcu().
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
> ---
> mm/ksm.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/mm/ksm.c b/mm/ksm.c
> index 49d48d1e0998..fa5e4c47fb1b 100644
> --- a/mm/ksm.c
> +++ b/mm/ksm.c
> @@ -3280,8 +3280,7 @@ void collect_procs_ksm(const struct folio *folio, const struct page *page,
> struct anon_vma *av = rmap_item->anon_vma;
>
> anon_vma_lock_read(av);
> - rcu_read_lock();
> - for_each_process(tsk) {
> + for_each_process_rcu(tsk) {
> struct anon_vma_chain *vmac;
> const unsigned long addr = rmap_item->address & PAGE_MASK;
> const unsigned long index = rmap_item->linear_page_index;
> @@ -3298,7 +3297,6 @@ void collect_procs_ksm(const struct folio *folio, const struct page *page,
> }
> }
> }
> - rcu_read_unlock();
> anon_vma_unlock_read(av);
> }
> }
> --
> 2.25.1
>
--
Michal Hocko
SUSE Labs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 4/8] mm/memory-failure: convert process iterator to for_each_process_rcu
2026-09-04 8:29 ` [PATCH 4/8] mm/memory-failure: " Ye Liu
@ 2026-09-04 11:05 ` Michal Hocko
2026-09-05 0:39 ` SJ Park
1 sibling, 0 replies; 10+ messages in thread
From: Michal Hocko @ 2026-09-04 11:05 UTC (permalink / raw)
To: Ye Liu
Cc: Miaohe Lin, Andrew Morton, Ye Liu, Naoya Horiguchi, linux-mm,
linux-kernel
On Fri 04-09-26 16:29:56, Ye Liu wrote:
> 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_rcu().
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
> ---
> 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..63a2ff08ee33 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_rcu(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_rcu(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_rcu(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_rcu(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
>
--
Michal Hocko
SUSE Labs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu
2026-09-04 8:29 ` [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu Ye Liu
2026-09-04 11:04 ` Michal Hocko
@ 2026-09-05 0:32 ` SJ Park
1 sibling, 0 replies; 10+ messages in thread
From: SJ Park @ 2026-09-05 0:32 UTC (permalink / raw)
To: Ye Liu
Cc: SJ Park, Michal Hocko, Andrew Morton, Ye Liu, David Rientjes,
Shakeel Butt, linux-mm, linux-kernel
On Fri, 4 Sep 2026 16:29:54 +0800 Ye Liu <ye.liu@linux.dev> wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Replace the manual rcu_read_lock()/rcu_read_unlock() pairs wrapping
> for_each_process()/for_each_thread() loops with for_each_process_rcu()
> and for_each_thread_rcu(), so that the RCU read-side critical section
> is scoped to the loop body.
Looks clean to me :)
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
Reviewed-by: SJ Park <sj@kernel.org>
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu
2026-09-04 8:29 ` [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu Ye Liu
2026-09-04 11:04 ` Michal Hocko
@ 2026-09-05 0:33 ` SJ Park
1 sibling, 0 replies; 10+ messages in thread
From: SJ Park @ 2026-09-05 0:33 UTC (permalink / raw)
To: Ye Liu
Cc: SJ Park, Andrew Morton, David Hildenbrand, Ye Liu, Xu Xin,
Chengming Zhou, linux-mm, linux-kernel
On Fri, 4 Sep 2026 16:29:55 +0800 Ye Liu <ye.liu@linux.dev> wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Replace the manual rcu_read_lock()/rcu_read_unlock() pair combined
> with for_each_process() loop in mm/ksm.c with for_each_process_rcu().
>
> No functional change.
Looks clean to me, thank you.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
Reviewed-by: SJ Park <sj@kernel.org>
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 4/8] mm/memory-failure: convert process iterator to for_each_process_rcu
2026-09-04 8:29 ` [PATCH 4/8] mm/memory-failure: " Ye Liu
2026-09-04 11:05 ` Michal Hocko
@ 2026-09-05 0:39 ` SJ Park
1 sibling, 0 replies; 10+ messages in thread
From: SJ Park @ 2026-09-05 0:39 UTC (permalink / raw)
To: Ye Liu
Cc: SJ Park, Miaohe Lin, Andrew Morton, Ye Liu, Naoya Horiguchi,
linux-mm, linux-kernel
On Fri, 4 Sep 2026 16:29:56 +0800 Ye Liu <ye.liu@linux.dev> wrote:
> 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_rcu().
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> ---
> 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..63a2ff08ee33 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_rcu(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_rcu(tsk) {
> struct task_struct *t = task_early_kill(tsk, force_early);
> unsigned long addr;
This moves pgoff assignment out of the RCU critical section. Is this fine and
making no real functional change? If it is fine and no functiona change, could
we clarify the reasons on the commit message?
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-09-05 0:39 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-04 8:29 [PATCH 0/8] mm: introduce for_each_process_rcu and for_each_thread_rcu Ye Liu
2026-09-04 8:29 ` [PATCH 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rcu Ye Liu
2026-09-04 11:04 ` Michal Hocko
2026-09-05 0:32 ` SJ Park
2026-09-04 8:29 ` [PATCH 3/8] mm/ksm: convert process iterator to for_each_process_rcu Ye Liu
2026-09-04 11:04 ` Michal Hocko
2026-09-05 0:33 ` SJ Park
2026-09-04 8:29 ` [PATCH 4/8] mm/memory-failure: " Ye Liu
2026-09-04 11:05 ` Michal Hocko
2026-09-05 0:39 ` SJ Park
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox