Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock
@ 2026-09-07  8:13 Ye Liu
  2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
                   ` (8 more replies)
  0 siblings, 9 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Andrew Morton, Michal Hocko, Peter Zijlstra, Paul E. McKenney,
	Ingo Molnar, Steven Rostedt, Josh Poimboeuf,
	Mickaël Salaün, Oleg Nesterov, Thomas Gleixner
  Cc: Ye Liu, David Hildenbrand, Miaohe Lin, Naoya Horiguchi,
	Rafael J. Wysocki, Günther Noack, Lorenzo Stoakes, SJ Park,
	linux-mm, linux-kernel, linux-pm, rcu, linux-trace-kernel,
	linux-fsdevel, linux-security-module, rientjes, shakeel.butt,
	xu.xin16, chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger

From: Ye Liu <liuye@kylinos.cn>

Introduce for_each_process_rculock(), for_each_thread_rculock() and
for_each_process_thread_rculock() 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.

Changes since v1 [1]:
  - Rename macros from *_rcu to *_rculock, as suggested by Steven
    Rostedt and acked by Thomas Gleixner, to avoid confusion with
    existing *_rcu() list iterators that expect the caller to hold
    the RCU read lock.
  - Improve the comment on for_each_process_thread_rculock() to
    document that 'break' only exits the inner loop and 'goto' is
    needed to exit both loops (Thomas Gleixner).
  - Rename the stale 'unlock:' label to 'out:' in hung_task.c, as
    noted by Günther Noack.
  - Clarify in patch 4 that page_pgoff() is safe outside the RCU
    read-side critical section (SJ Park).
  - CC all relevant maintainers on every patch (Lorenzo Stoakes).
  - Drop the mm: prefix from patch 1, as the macros are in
    include/linux/sched/signal.h (Michal Hocko).

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 [2].

[1] https://lore.kernel.org/all/20260904083001.553587-1-ye.liu@linux.dev/
[2] https://lore.kernel.org/all/20260813092933.562028-1-ye.liu@linux.dev/

Ye Liu (8):
  sched: introduce for_each_process_rculock and for_each_thread_rculock
  mm/oom_kill: convert process/thread iterators to for_each_*_rculock
  mm/ksm: convert process iterator to for_each_process_rculock
  mm/memory-failure: convert process iterator to for_each_process_rculock
  kernel: convert process/thread iterators to for_each_*_rculock
  fs: convert process/thread iterators to for_each_*_rculock
  lib: convert process iterator to for_each_process_rculock
  security/landlock: convert thread iterator to for_each_thread_rculock

 fs/proc/base.c               |  4 +---
 fs/resctrl/rdtgroup.c        |  8 ++------
 include/linux/sched/signal.h | 25 +++++++++++++++++++++++++
 kernel/cpu.c                 |  4 +---
 kernel/freezer.c             |  4 +---
 kernel/hung_task.c           | 11 ++++-------
 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, 54 insertions(+), 81 deletions(-)

Signed-off-by: Ye Liu <liuye@kylinos.cn>

--
2.25.1


^ permalink raw reply	[flat|nested] 36+ messages in thread

* [PATCH v2 1/8] sched: introduce for_each_process_rculock and for_each_thread_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07  8:30   ` Lorenzo Stoakes (ARM)
                     ` (3 more replies)
  2026-09-07  8:13 ` [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock Ye Liu
                   ` (7 subsequent siblings)
  8 siblings, 4 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Oleg Nesterov, Peter Zijlstra (Intel), Marco Elver, Ye Liu,
	Tejun Heo, Christian Brauner, Bart Van Assche, Yi Tao
  Cc: Michal Hocko, paulmck, mingo, rostedt, jpoimboe, mic, tglx, akpm,
	david, linmiaohe, nao.horiguchi, rafael, gnoack3000, ljs, sj,
	rientjes, shakeel.butt, xu.xin16, chengming.zhou, will, boqun,
	frederic, neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

From: Ye Liu <liuye@kylinos.cn>

Introduce for_each_process_rculock(), for_each_thread_rculock() and
for_each_process_thread_rculock() macros that acquire the RCU read
lock before the iteration starts and release it when the loop is left,
so that the RCU read-side critical section is scoped to the loop body
instead of an externally managed rcu_read_lock()/rcu_read_unlock()
pair.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
---
Changes in v2:
  - Rename macros from *_rcu to *_rculock (Steven Rostedt, Thomas Gleixner)
  - Improve comment on for_each_process_thread_rculock() double loop
  - Change prefix from mm: to sched: (Michal Hocko)
 include/linux/sched/signal.h | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h
index 584ae88b435e..110ea9f131f3 100644
--- a/include/linux/sched/signal.h
+++ b/include/linux/sched/signal.h
@@ -2,6 +2,7 @@
 #ifndef _LINUX_SCHED_SIGNAL_H
 #define _LINUX_SCHED_SIGNAL_H
 
+#include <linux/cleanup.h>
 #include <linux/rculist.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
@@ -663,6 +664,30 @@ extern bool current_is_single_threaded(void);
 #define for_each_process_thread(p, t)	\
 	for_each_process(p) for_each_thread(p, t)
 
+/*
+ * Variants of for_each_process(), for_each_thread() and
+ * for_each_process_thread() that automatically acquire and release the
+ * RCU read lock via scoped_guard(rcu).  The lock is held for the
+ * duration of the loop and released on exit, including via break,
+ * goto, or return.
+ */
+#define for_each_process_rculock(p) \
+	scoped_guard(rcu) \
+	for (p = &init_task ; (p = next_task(p)) != &init_task ; )
+
+#define for_each_thread_rculock(p, t) \
+	scoped_guard(rcu) \
+	__for_each_thread((p)->signal, t)
+
+/*
+ * Double loop: 'break' only exits the inner for_each_thread() loop.
+ * Use 'goto' to exit both loops; the RCU read lock is released
+ * automatically when the scoped_guard scope is left.
+ */
+#define for_each_process_thread_rculock(p, t) \
+	scoped_guard(rcu) \
+	for_each_process(p) for_each_thread(p, t)
+
 typedef int (*proc_visitor)(struct task_struct *p, void *data);
 void walk_process_tree(struct task_struct *top, proc_visitor, void *);
 
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
  2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07  8:35   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:42   ` Gregory Price
  2026-09-07  8:13 ` [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock Ye Liu
                   ` (6 subsequent siblings)
  8 siblings, 2 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Michal Hocko, Andrew Morton
  Cc: Ye Liu, SJ Park, peterz, paulmck, mingo, rostedt, jpoimboe, mic,
	oleg, tglx, david, linmiaohe, nao.horiguchi, rafael, gnoack3000,
	ljs, rientjes, shakeel.butt, xu.xin16, chengming.zhou, will,
	boqun, frederic, neeraj.upadhyay, joelagnelf, josh, urezki,
	juri.lelli, vincent.guittot, tony.luck, reinette.chatre, x86,
	paul, jmorris, serge, pavel, lance.yang, mhiramat, pmladek,
	longman, mathieu.desnoyers, jiangshanlai, qiang.zhang,
	dietmar.eggemann, bsegall, mgorman, vschneid, kprateek.nayak,
	mark.rutland, Dave.Martin, james.morse, babu.moger, linux-mm,
	linux-kernel, linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

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_rculock()
and for_each_thread_rculock(), which scope the RCU read lock to the
loop body via scoped_guard(rcu).

No functional change.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
Reviewed-by: SJ Park <sj@kernel.org>
---
Changes in v2:
  - Rename *_rcu to *_rculock
 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..ef2e1c423c1d 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_rculock(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_rculock(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_rculock(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_rculock(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_rculock(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] 36+ messages in thread

* [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
  2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
  2026-09-07  8:13 ` [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07  8:36   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:43   ` Gregory Price
  2026-09-07  8:13 ` [PATCH v2 4/8] mm/memory-failure: " Ye Liu
                   ` (5 subsequent siblings)
  8 siblings, 2 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Andrew Morton, David Hildenbrand
  Cc: Ye Liu, Michal Hocko, SJ Park, peterz, paulmck, mingo, rostedt,
	jpoimboe, mic, oleg, tglx, linmiaohe, nao.horiguchi, rafael,
	gnoack3000, ljs, rientjes, shakeel.butt, xu.xin16, chengming.zhou,
	will, boqun, frederic, neeraj.upadhyay, joelagnelf, josh, urezki,
	juri.lelli, vincent.guittot, tony.luck, reinette.chatre, x86,
	paul, jmorris, serge, pavel, lance.yang, mhiramat, pmladek,
	longman, mathieu.desnoyers, jiangshanlai, qiang.zhang,
	dietmar.eggemann, bsegall, mgorman, vschneid, kprateek.nayak,
	mark.rutland, Dave.Martin, james.morse, babu.moger, linux-mm,
	linux-kernel, linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

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_rculock(),
which scopes the RCU read lock to the loop body via scoped_guard(rcu).

No functional change.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
Reviewed-by: SJ Park <sj@kernel.org>
---
Changes in v2:
  - Rename *_rcu to *_rculock
 mm/ksm.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/mm/ksm.c b/mm/ksm.c
index 49d48d1e0998..69d30e80a090 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_rculock(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] 36+ messages in thread

* [PATCH v2 4/8] mm/memory-failure: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
                   ` (2 preceding siblings ...)
  2026-09-07  8:13 ` [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07 11:05   ` Lorenzo Stoakes (ARM)
                     ` (2 more replies)
  2026-09-07  8:13 ` [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock Ye Liu
                   ` (4 subsequent siblings)
  8 siblings, 3 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Miaohe Lin, Andrew Morton
  Cc: Ye Liu, Michal Hocko, peterz, paulmck, mingo, rostedt, jpoimboe,
	mic, oleg, tglx, david, nao.horiguchi, rafael, gnoack3000, ljs,
	sj, rientjes, shakeel.butt, xu.xin16, chengming.zhou, will, boqun,
	frederic, neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

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



^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
                   ` (3 preceding siblings ...)
  2026-09-07  8:13 ` [PATCH v2 4/8] mm/memory-failure: " Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07 12:20   ` Lorenzo Stoakes (ARM)
                     ` (2 more replies)
  2026-09-07  8:13 ` [PATCH v2 6/8] fs: " Ye Liu
                   ` (3 subsequent siblings)
  8 siblings, 3 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Thomas Gleixner, Peter Zijlstra, Rafael J. Wysocki, Andrew Morton,
	Ingo Molnar, Will Deacon, Boqun Feng, Paul E. McKenney,
	Frederic Weisbecker, Neeraj Upadhyay, Joel Fernandes,
	Josh Triplett, Uladzislau Rezki, Juri Lelli, Vincent Guittot,
	Steven Rostedt, Masami Hiramatsu, Josh Poimboeuf
  Cc: Ye Liu, Michal Hocko, mic, oleg, david, linmiaohe, nao.horiguchi,
	gnoack3000, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, pmladek, longman, mathieu.desnoyers,
	jiangshanlai, qiang.zhang, dietmar.eggemann, bsegall, mgorman,
	vschneid, kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

From: Ye Liu <liuye@kylinos.cn>

Replace the manual rcu_read_lock()/rcu_read_unlock() and guard(rcu)
pairs combined with for_each_process(), for_each_thread() and
for_each_process_thread() loops across kernel/ with the
for_each_*_rculock() macros, which scope the RCU read lock to the
loop body via scoped_guard(rcu).

No functional change.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
---
Changes in v2:
  - Rename *_rcu to *_rculock
  - Rename stale 'unlock:' label to 'out:' in hung_task.c (Günther Noack)
 kernel/cpu.c             |  4 +---
 kernel/freezer.c         |  4 +---
 kernel/hung_task.c       | 11 ++++-------
 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 +--
 9 files changed, 13 insertions(+), 32 deletions(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index b3c8553d7bd6..00638d2abc0f 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -1254,8 +1254,7 @@ void clear_tasks_mm_cpumask(int cpu)
 	 * full-fledged tasklist_lock.
 	 */
 	WARN_ON(cpu_online(cpu));
-	rcu_read_lock();
-	for_each_process(p) {
+	for_each_process_rculock(p) {
 		struct task_struct *t;
 
 		/*
@@ -1268,7 +1267,6 @@ void clear_tasks_mm_cpumask(int cpu)
 		arch_clear_mm_cpumask_cpu(cpu, t->mm);
 		task_unlock(t);
 	}
-	rcu_read_unlock();
 }
 
 /* Take this CPU down. */
diff --git a/kernel/freezer.c b/kernel/freezer.c
index a76bf957fb32..7a870f71dcf6 100644
--- a/kernel/freezer.c
+++ b/kernel/freezer.c
@@ -217,11 +217,9 @@ void thaw_process(struct task_struct *p)
 {
 	struct task_struct *t;
 
-	rcu_read_lock();
-	for_each_thread(p, t) {
+	for_each_thread_rculock(p, t) {
 		__thaw_task(t);
 	}
-	rcu_read_unlock();
 }
 
 /**
diff --git a/kernel/hung_task.c b/kernel/hung_task.c
index 6fcc94ce4ca9..73a5ad3be9a8 100644
--- a/kernel/hung_task.c
+++ b/kernel/hung_task.c
@@ -315,13 +315,12 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
 		return;
 
 	this_round_count = 0;
-	rcu_read_lock();
-	for_each_process_thread(g, t) {
+	for_each_process_thread_rculock(g, t) {
 		if (!max_count--)
-			goto unlock;
+			goto out;
 		if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) {
 			if (!rcu_lock_break(g, t))
-				goto unlock;
+				goto out;
 			last_break = jiffies;
 		}
 
@@ -337,9 +336,7 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
 			hung_task_info(t, timeout, this_round_count);
 		}
 	}
- unlock:
-	rcu_read_unlock();
-
+out:
 	if (!this_round_count)
 		return;
 
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index c56a7f91d72e..ea218dc75ad5 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -6834,15 +6834,13 @@ void debug_show_all_locks(void)
 	}
 	pr_warn("\nShowing all locks held in the system:\n");
 
-	rcu_read_lock();
-	for_each_process_thread(g, p) {
+	for_each_process_thread_rculock(g, p) {
 		if (!p->lockdep_depth)
 			continue;
 		lockdep_print_held_locks(p);
 		touch_nmi_watchdog();
 		touch_all_softlockup_watchdogs();
 	}
-	rcu_read_unlock();
 
 	pr_warn("\n");
 	pr_warn("=============================================\n\n");
diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c
index 2a778b8ab4ad..d8e0b5896db9 100644
--- a/kernel/rcu/update.c
+++ b/kernel/rcu/update.c
@@ -548,15 +548,13 @@ void synchronize_rcu_trivial_preempt(void)
 	struct task_struct *t;
 
 	smp_mb(); // Order prior accesses before grace-period start.
-	rcu_read_lock(); // Protect task list.
-	for_each_process_thread(g, t) {
+	for_each_process_thread_rculock(g, t) {
 		if (t == current)
 			continue;  // Don't deadlock on ourselves!
 		// Order later rcu_read_lock() on other tasks after QS.
 		while (smp_load_acquire(&t->rcu_trivial_preempt_nesting))
 			continue;
 	}
-	rcu_read_unlock();
 }
 EXPORT_SYMBOL_GPL(synchronize_rcu_trivial_preempt);
 #endif // #if IS_ENABLED(CONFIG_TRIVIAL_PREEMPT_RCU)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 0697ed0f1c3d..fd5bdd2cb798 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2005,8 +2005,7 @@ static void uclamp_sync_util_min_rt_default(void)
 	smp_mb__after_spinlock();
 	read_unlock(&tasklist_lock);
 
-	guard(rcu)();
-	for_each_process_thread(g, p)
+	for_each_process_thread_rculock(g, p)
 		uclamp_update_util_min_rt_default(p);
 }
 
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index 72236db67983..cdae165b98f7 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -1029,14 +1029,12 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
 #endif
 		   "\n");
 
-	rcu_read_lock();
-	for_each_process_thread(g, p) {
+	for_each_process_thread_rculock(g, p) {
 		if (task_cpu(p) != rq_cpu)
 			continue;
 
 		print_task(m, rq, p);
 	}
-	rcu_read_unlock();
 }
 
 void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c
index 40d373d65f9b..f797ce119223 100644
--- a/kernel/trace/fgraph.c
+++ b/kernel/trace/fgraph.c
@@ -1057,11 +1057,10 @@ static int alloc_retstack_tasklist(unsigned long **ret_stack_list)
 		}
 	}
 
-	rcu_read_lock();
-	for_each_process_thread(g, t) {
+	for_each_process_thread_rculock(g, t) {
 		if (start == end) {
 			ret = -EAGAIN;
-			goto unlock;
+			goto free;
 		}
 
 		if (t->ret_stack == NULL) {
@@ -1074,9 +1073,6 @@ static int alloc_retstack_tasklist(unsigned long **ret_stack_list)
 			t->ret_stack = ret_stack_list[start++];
 		}
 	}
-
-unlock:
-	rcu_read_unlock();
 free:
 	for (i = start; i < end; i++)
 		kmem_cache_free(fgraph_stack_cachep, ret_stack_list[i]);
diff --git a/kernel/unwind/deferred.c b/kernel/unwind/deferred.c
index 5bea47314254..ecfe1336095e 100644
--- a/kernel/unwind/deferred.c
+++ b/kernel/unwind/deferred.c
@@ -319,9 +319,8 @@ void unwind_deferred_cancel(struct unwind_work *work)
 
 	synchronize_srcu(&unwind_srcu);
 
-	guard(rcu)();
 	/* Clear this bit from all threads */
-	for_each_process_thread(g, t) {
+	for_each_process_thread_rculock(g, t) {
 		atomic_long_andnot(BIT(bit),
 				   &t->unwind_info.unwind_mask);
 		if (t->unwind_info.cache)
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH v2 6/8] fs: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
                   ` (4 preceding siblings ...)
  2026-09-07  8:13 ` [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
                     ` (2 more replies)
  2026-09-07  8:13 ` [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock Ye Liu
                   ` (2 subsequent siblings)
  8 siblings, 3 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Tony Luck, Reinette Chatre, x86, Christian Brauner, Andrew Morton,
	Jann Horn, Mike Rapoport (Microsoft), David Hildenbrand (arm),
	Alexey Dobriyan, Lorenzo Stoakes, Oleg Nesterov
  Cc: Ye Liu, Michal Hocko, peterz, paulmck, mingo, rostedt, jpoimboe,
	mic, tglx, linmiaohe, nao.horiguchi, rafael, gnoack3000, sj,
	rientjes, shakeel.butt, xu.xin16, chengming.zhou, will, boqun,
	frederic, neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

From: Ye Liu <liuye@kylinos.cn>

Replace the manual rcu_read_lock()/rcu_read_unlock() pairs combined
with for_each_process() and for_each_process_thread() loops in fs/
with the for_each_*_rculock() macros, which scope the RCU read lock
to the loop body via scoped_guard(rcu).

No functional change.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
---
Changes in v2:
  - Rename *_rcu to *_rculock
 fs/proc/base.c        | 4 +---
 fs/resctrl/rdtgroup.c | 8 ++------
 2 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/fs/proc/base.c b/fs/proc/base.c
index 6a39de424f62..3de4f4557e4c 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1160,8 +1160,7 @@ static int __set_oom_adj(struct file *file, int oom_adj, bool legacy)
 	if (mm) {
 		struct task_struct *p;
 
-		rcu_read_lock();
-		for_each_process(p) {
+		for_each_process_rculock(p) {
 			if (same_thread_group(task, p))
 				continue;
 
@@ -1177,7 +1176,6 @@ static int __set_oom_adj(struct file *file, int oom_adj, bool legacy)
 			}
 			task_unlock(p);
 		}
-		rcu_read_unlock();
 		mmdrop(mm);
 	}
 err_unlock:
diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
index 5dcbb0a964e8..b14df8b23f1a 100644
--- a/fs/resctrl/rdtgroup.c
+++ b/fs/resctrl/rdtgroup.c
@@ -709,14 +709,12 @@ int rdtgroup_tasks_assigned(struct rdtgroup *r)
 
 	lockdep_assert_held(&rdtgroup_mutex);
 
-	rcu_read_lock();
-	for_each_process_thread(p, t) {
+	for_each_process_thread_rculock(p, t) {
 		if (is_closid_match(t, r) || is_rmid_match(t, r)) {
 			ret = 1;
 			break;
 		}
 	}
-	rcu_read_unlock();
 
 	return ret;
 }
@@ -826,15 +824,13 @@ static void show_rdt_tasks(struct rdtgroup *r, struct seq_file *s)
 	struct task_struct *p, *t;
 	pid_t pid;
 
-	rcu_read_lock();
-	for_each_process_thread(p, t) {
+	for_each_process_thread_rculock(p, t) {
 		if (is_closid_match(t, r) || is_rmid_match(t, r)) {
 			pid = task_pid_vnr(t);
 			if (pid)
 				seq_printf(s, "%d\n", pid);
 		}
 	}
-	rcu_read_unlock();
 }
 
 static int rdtgroup_tasks_show(struct kernfs_open_file *of,
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
                   ` (5 preceding siblings ...)
  2026-09-07  8:13 ` [PATCH v2 6/8] fs: " Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
                     ` (2 more replies)
  2026-09-07  8:13 ` [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock Ye Liu
  2026-09-07  8:26 ` [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Lorenzo Stoakes (ARM)
  8 siblings, 3 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Ye Liu, Michal Hocko, peterz, paulmck, mingo, rostedt, jpoimboe,
	mic, oleg, tglx, david, linmiaohe, nao.horiguchi, rafael,
	gnoack3000, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

From: Ye Liu <liuye@kylinos.cn>

Replace the manual rcu_read_lock()/rcu_read_unlock() pair combined
with for_each_process() loop in lib/ with for_each_process_rculock(),
which scopes the RCU read lock to the loop body via scoped_guard(rcu).

No functional change.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
Acked-by: Michal Hocko <mhocko@suse.com>
---
Changes in v2:
  - Rename *_rcu to *_rculock
 lib/is_single_threaded.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/lib/is_single_threaded.c b/lib/is_single_threaded.c
index 8c98b20bfc41..4e7fe85454ab 100644
--- a/lib/is_single_threaded.c
+++ b/lib/is_single_threaded.c
@@ -26,8 +26,7 @@ bool current_is_single_threaded(void)
 		return true;
 
 	ret = false;
-	rcu_read_lock();
-	for_each_process(p) {
+	for_each_process_rculock(p) {
 		if (unlikely(p->flags & PF_KTHREAD))
 			continue;
 		if (unlikely(p == task->group_leader))
@@ -48,7 +47,5 @@ bool current_is_single_threaded(void)
 	}
 	ret = true;
 found:
-	rcu_read_unlock();
-
 	return ret;
 }
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
                   ` (6 preceding siblings ...)
  2026-09-07  8:13 ` [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock Ye Liu
@ 2026-09-07  8:13 ` Ye Liu
  2026-09-07 12:28   ` Lorenzo Stoakes (ARM)
                     ` (2 more replies)
  2026-09-07  8:26 ` [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Lorenzo Stoakes (ARM)
  8 siblings, 3 replies; 36+ messages in thread
From: Ye Liu @ 2026-09-07  8:13 UTC (permalink / raw)
  To: Mickaël Salaün, Paul Moore, James Morris,
	Serge E. Hallyn
  Cc: Ye Liu, Justin Suess, Günther Noack, mhocko, peterz, paulmck,
	mingo, rostedt, jpoimboe, oleg, tglx, akpm, david, linmiaohe,
	nao.horiguchi, rafael, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, pavel, lance.yang, mhiramat, pmladek,
	longman, mathieu.desnoyers, jiangshanlai, qiang.zhang,
	dietmar.eggemann, bsegall, mgorman, vschneid, kprateek.nayak,
	mark.rutland, Dave.Martin, james.morse, babu.moger, linux-mm,
	linux-kernel, linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

From: Ye Liu <liuye@kylinos.cn>

Replace guard(rcu)() + for_each_thread() with for_each_thread_rculock(),
which scopes the RCU read lock to the loop body via scoped_guard(rcu).

No functional change.

Signed-off-by: Ye Liu <liuye@kylinos.cn>
Reviewed-by: Justin Suess <utilityemal77@gmail.com>
Reviewed-by: Günther Noack <gnoack3000@gmail.com>
---
Changes in v2:
  - Rename *_rcu to *_rculock
 security/landlock/tsync.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/security/landlock/tsync.c b/security/landlock/tsync.c
index 0b71e158c3f5..a578af640aad 100644
--- a/security/landlock/tsync.c
+++ b/security/landlock/tsync.c
@@ -335,9 +335,7 @@ static size_t count_additional_threads(const struct tsync_works *works)
 
 	caller = current;
 
-	guard(rcu)();
-
-	for_each_thread(caller, thread) {
+	for_each_thread_rculock(caller, thread) {
 		/* Skip current, since it is initiating the sync. */
 		if (thread == caller)
 			continue;
@@ -376,9 +374,7 @@ static bool schedule_task_work(struct tsync_works *works,
 
 	caller = current;
 
-	guard(rcu)();
-
-	for_each_thread(caller, thread) {
+	for_each_thread_rculock(caller, thread) {
 		/* Skip current, since it is initiating the sync. */
 		if (thread == caller)
 			continue;
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock
  2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
                   ` (7 preceding siblings ...)
  2026-09-07  8:13 ` [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock Ye Liu
@ 2026-09-07  8:26 ` Lorenzo Stoakes (ARM)
  8 siblings, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07  8:26 UTC (permalink / raw)
  To: Ye Liu
  Cc: Andrew Morton, Michal Hocko, Peter Zijlstra, Paul E. McKenney,
	Ingo Molnar, Steven Rostedt, Josh Poimboeuf,
	Mickaël Salaün, Oleg Nesterov, Thomas Gleixner, Ye Liu,
	David Hildenbrand, Miaohe Lin, Naoya Horiguchi, Rafael J. Wysocki,
	Günther Noack, SJ Park, linux-mm, linux-kernel, linux-pm,
	rcu, linux-trace-kernel, linux-fsdevel, linux-security-module,
	rientjes, shakeel.butt, xu.xin16, chengming.zhou, will, boqun,
	frederic, neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger

On Mon, Sep 07, 2026 at 04:13:26PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Introduce for_each_process_rculock(), for_each_thread_rculock() and
> for_each_process_thread_rculock() 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.
>

Andrew - just a note (assuming Ye Liu is in agreement) I think all of the
below should be excluded from the cover letter that goes into the commit
message, including the checkpatch thing.

> Changes since v1 [1]:
>   - Rename macros from *_rcu to *_rculock, as suggested by Steven
>     Rostedt and acked by Thomas Gleixner, to avoid confusion with
>     existing *_rcu() list iterators that expect the caller to hold
>     the RCU read lock.
>   - Improve the comment on for_each_process_thread_rculock() to
>     document that 'break' only exits the inner loop and 'goto' is
>     needed to exit both loops (Thomas Gleixner).
>   - Rename the stale 'unlock:' label to 'out:' in hung_task.c, as
>     noted by Günther Noack.
>   - Clarify in patch 4 that page_pgoff() is safe outside the RCU
>     read-side critical section (SJ Park).
>   - CC all relevant maintainers on every patch (Lorenzo Stoakes).
>   - Drop the mm: prefix from patch 1, as the macros are in
>     include/linux/sched/signal.h (Michal Hocko).
>
> 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.

While it's useful as a note to reviewers, in general checkpatch is taken
with a pinch of salt - it's a master of false positives so usually no need
to say this :)

>
> Suggested by Michal Hocko for the oom_kill path [2].
>
> [1] https://lore.kernel.org/all/20260904083001.553587-1-ye.liu@linux.dev/
> [2] https://lore.kernel.org/all/20260813092933.562028-1-ye.liu@linux.dev/
>
> Ye Liu (8):
>   sched: introduce for_each_process_rculock and for_each_thread_rculock
>   mm/oom_kill: convert process/thread iterators to for_each_*_rculock
>   mm/ksm: convert process iterator to for_each_process_rculock
>   mm/memory-failure: convert process iterator to for_each_process_rculock
>   kernel: convert process/thread iterators to for_each_*_rculock
>   fs: convert process/thread iterators to for_each_*_rculock
>   lib: convert process iterator to for_each_process_rculock
>   security/landlock: convert thread iterator to for_each_thread_rculock
>
>  fs/proc/base.c               |  4 +---
>  fs/resctrl/rdtgroup.c        |  8 ++------
>  include/linux/sched/signal.h | 25 +++++++++++++++++++++++++
>  kernel/cpu.c                 |  4 +---
>  kernel/freezer.c             |  4 +---
>  kernel/hung_task.c           | 11 ++++-------
>  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, 54 insertions(+), 81 deletions(-)
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
>
> --
> 2.25.1

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 1/8] sched: introduce for_each_process_rculock and for_each_thread_rculock
  2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
@ 2026-09-07  8:30   ` Lorenzo Stoakes (ARM)
  2026-09-07  9:35   ` Oleg Nesterov
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07  8:30 UTC (permalink / raw)
  To: Ye Liu
  Cc: Oleg Nesterov, Peter Zijlstra (Intel), Marco Elver, Ye Liu,
	Tejun Heo, Christian Brauner, Bart Van Assche, Yi Tao,
	Michal Hocko, paulmck, mingo, rostedt, jpoimboe, mic, tglx, akpm,
	david, linmiaohe, nao.horiguchi, rafael, gnoack3000, sj, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon, Sep 07, 2026 at 04:13:27PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Introduce for_each_process_rculock(), for_each_thread_rculock() and
> for_each_process_thread_rculock() macros that acquire the RCU read
> lock before the iteration starts and release it when the loop is left,
> so that the RCU read-side critical section is scoped to the loop body
> instead of an externally managed rcu_read_lock()/rcu_read_unlock()
> pair.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Some nits below, with those addressed, LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> Changes in v2:
>   - Rename macros from *_rcu to *_rculock (Steven Rostedt, Thomas Gleixner)
>   - Improve comment on for_each_process_thread_rculock() double loop
>   - Change prefix from mm: to sched: (Michal Hocko)
>  include/linux/sched/signal.h | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h
> index 584ae88b435e..110ea9f131f3 100644
> --- a/include/linux/sched/signal.h
> +++ b/include/linux/sched/signal.h
> @@ -2,6 +2,7 @@
>  #ifndef _LINUX_SCHED_SIGNAL_H
>  #define _LINUX_SCHED_SIGNAL_H
>
> +#include <linux/cleanup.h>
>  #include <linux/rculist.h>
>  #include <linux/signal.h>
>  #include <linux/sched.h>
> @@ -663,6 +664,30 @@ extern bool current_is_single_threaded(void);
>  #define for_each_process_thread(p, t)	\
>  	for_each_process(p) for_each_thread(p, t)
>
> +/*
> + * Variants of for_each_process(), for_each_thread() and
> + * for_each_process_thread() that automatically acquire and release the
> + * RCU read lock via scoped_guard(rcu).  The lock is held for the
> + * duration of the loop and released on exit, including via break,
> + * goto, or return.
> + */
> +#define for_each_process_rculock(p) \
> +	scoped_guard(rcu) \
> +	for (p = &init_task ; (p = next_task(p)) != &init_task ; )

NIT: Can you indent the for loop by a tab? Since the for is in
scoped_guard() scope and that's not made clear.

> +
> +#define for_each_thread_rculock(p, t) \
> +	scoped_guard(rcu) \
> +	__for_each_thread((p)->signal, t)

Same comment as above.

> +
> +/*
> + * Double loop: 'break' only exits the inner for_each_thread() loop.
> + * Use 'goto' to exit both loops; the RCU read lock is released
> + * automatically when the scoped_guard scope is left.
> + */
> +#define for_each_process_thread_rculock(p, t) \
> +	scoped_guard(rcu) \
> +	for_each_process(p) for_each_thread(p, t)

Yeah this is even worse for clarity :) I know the existing defines do itg
this way but it's kinda confusing.

I know it's a bit fugly, but it's MUCH clearer as:

	#define for_each_process_thread_rculock(p, t) \
		scoped_guard(rcu) \
			for_each_process(p) \
				for_each_thread(p, t)

> +
>  typedef int (*proc_visitor)(struct task_struct *p, void *data);
>  void walk_process_tree(struct task_struct *top, proc_visitor, void *);
>
> --
> 2.25.1
>

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock Ye Liu
@ 2026-09-07  8:35   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:42   ` Gregory Price
  1 sibling, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07  8:35 UTC (permalink / raw)
  To: Ye Liu
  Cc: Michal Hocko, Andrew Morton, Ye Liu, SJ Park, peterz, paulmck,
	mingo, rostedt, jpoimboe, mic, oleg, tglx, david, linmiaohe,
	nao.horiguchi, rafael, gnoack3000, rientjes, shakeel.butt,
	xu.xin16, chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:28PM +0800, 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_rculock()
> and for_each_thread_rculock(), which scope the RCU read lock to the
> loop body via scoped_guard(rcu).
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: SJ Park <sj@kernel.org>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> Changes in v2:
>   - Rename *_rcu to *_rculock
>  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..ef2e1c423c1d 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_rculock(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_rculock(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_rculock(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_rculock(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_rculock(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
>

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock Ye Liu
@ 2026-09-07  8:36   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:43   ` Gregory Price
  1 sibling, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07  8:36 UTC (permalink / raw)
  To: Ye Liu
  Cc: Andrew Morton, David Hildenbrand, Ye Liu, Michal Hocko, SJ Park,
	peterz, paulmck, mingo, rostedt, jpoimboe, mic, oleg, tglx,
	linmiaohe, nao.horiguchi, rafael, gnoack3000, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon, Sep 07, 2026 at 04:13:29PM +0800, 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_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: SJ Park <sj@kernel.org>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> Changes in v2:
>   - Rename *_rcu to *_rculock
>  mm/ksm.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/mm/ksm.c b/mm/ksm.c
> index 49d48d1e0998..69d30e80a090 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_rculock(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
>

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 1/8] sched: introduce for_each_process_rculock and for_each_thread_rculock
  2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
  2026-09-07  8:30   ` Lorenzo Stoakes (ARM)
@ 2026-09-07  9:35   ` Oleg Nesterov
  2026-09-07 15:42   ` Gregory Price
  2026-09-07 21:20   ` SJ Park
  3 siblings, 0 replies; 36+ messages in thread
From: Oleg Nesterov @ 2026-09-07  9:35 UTC (permalink / raw)
  To: Ye Liu
  Cc: Peter Zijlstra (Intel), Marco Elver, Ye Liu, Tejun Heo,
	Christian Brauner, Bart Van Assche, Yi Tao, Michal Hocko, paulmck,
	mingo, rostedt, jpoimboe, mic, tglx, akpm, david, linmiaohe,
	nao.horiguchi, rafael, gnoack3000, ljs, sj, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On 09/07, Ye Liu wrote:
>
> Introduce for_each_process_rculock(), for_each_thread_rculock() and
> for_each_process_thread_rculock() macros that acquire the RCU read
> lock before the iteration starts and release it when the loop is left,
> so that the RCU read-side critical section is scoped to the loop body
> instead of an externally managed rcu_read_lock()/rcu_read_unlock()
> pair.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Thanks, I personally like the new _rculock suffix more ;)

I see the comments about indentation from Lorenzo, I am fine either way.

Reviewed-by: Oleg Nesterov <oleg@redhat.com>



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 4/8] mm/memory-failure: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 4/8] mm/memory-failure: " Ye Liu
@ 2026-09-07 11:05   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:43   ` Gregory Price
  2026-09-07 21:24   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07 11:05 UTC (permalink / raw)
  To: Ye Liu
  Cc: Miaohe Lin, Andrew Morton, Ye Liu, Michal Hocko, peterz, paulmck,
	mingo, rostedt, jpoimboe, mic, oleg, tglx, david, nao.horiguchi,
	rafael, gnoack3000, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:30PM +0800, 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_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>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> 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


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock Ye Liu
@ 2026-09-07 12:20   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:53   ` Gregory Price
  2026-09-07 21:28   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07 12:20 UTC (permalink / raw)
  To: Ye Liu
  Cc: Thomas Gleixner, Peter Zijlstra, Rafael J. Wysocki, Andrew Morton,
	Ingo Molnar, Will Deacon, Boqun Feng, Paul E. McKenney,
	Frederic Weisbecker, Neeraj Upadhyay, Joel Fernandes,
	Josh Triplett, Uladzislau Rezki, Juri Lelli, Vincent Guittot,
	Steven Rostedt, Masami Hiramatsu, Josh Poimboeuf, Ye Liu,
	Michal Hocko, mic, oleg, david, linmiaohe, nao.horiguchi,
	gnoack3000, sj, rientjes, shakeel.butt, xu.xin16, chengming.zhou,
	tony.luck, reinette.chatre, x86, paul, jmorris, serge, pavel,
	lance.yang, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:31PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Replace the manual rcu_read_lock()/rcu_read_unlock() and guard(rcu)
> pairs combined with for_each_process(), for_each_thread() and
> for_each_process_thread() loops across kernel/ with the
> for_each_*_rculock() macros, which scope the RCU read lock to the
> loop body via scoped_guard(rcu).
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> Changes in v2:
>   - Rename *_rcu to *_rculock
>   - Rename stale 'unlock:' label to 'out:' in hung_task.c (Günther Noack)
>  kernel/cpu.c             |  4 +---
>  kernel/freezer.c         |  4 +---
>  kernel/hung_task.c       | 11 ++++-------
>  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 +--
>  9 files changed, 13 insertions(+), 32 deletions(-)
>
> diff --git a/kernel/cpu.c b/kernel/cpu.c
> index b3c8553d7bd6..00638d2abc0f 100644
> --- a/kernel/cpu.c
> +++ b/kernel/cpu.c
> @@ -1254,8 +1254,7 @@ void clear_tasks_mm_cpumask(int cpu)
>  	 * full-fledged tasklist_lock.
>  	 */
>  	WARN_ON(cpu_online(cpu));
> -	rcu_read_lock();
> -	for_each_process(p) {
> +	for_each_process_rculock(p) {
>  		struct task_struct *t;
>
>  		/*
> @@ -1268,7 +1267,6 @@ void clear_tasks_mm_cpumask(int cpu)
>  		arch_clear_mm_cpumask_cpu(cpu, t->mm);
>  		task_unlock(t);
>  	}
> -	rcu_read_unlock();
>  }
>
>  /* Take this CPU down. */
> diff --git a/kernel/freezer.c b/kernel/freezer.c
> index a76bf957fb32..7a870f71dcf6 100644
> --- a/kernel/freezer.c
> +++ b/kernel/freezer.c
> @@ -217,11 +217,9 @@ void thaw_process(struct task_struct *p)
>  {
>  	struct task_struct *t;
>
> -	rcu_read_lock();
> -	for_each_thread(p, t) {
> +	for_each_thread_rculock(p, t) {
>  		__thaw_task(t);
>  	}
> -	rcu_read_unlock();
>  }
>
>  /**
> diff --git a/kernel/hung_task.c b/kernel/hung_task.c
> index 6fcc94ce4ca9..73a5ad3be9a8 100644
> --- a/kernel/hung_task.c
> +++ b/kernel/hung_task.c
> @@ -315,13 +315,12 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
>  		return;
>
>  	this_round_count = 0;
> -	rcu_read_lock();
> -	for_each_process_thread(g, t) {
> +	for_each_process_thread_rculock(g, t) {
>  		if (!max_count--)
> -			goto unlock;
> +			goto out;
>  		if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) {
>  			if (!rcu_lock_break(g, t))
> -				goto unlock;
> +				goto out;
>  			last_break = jiffies;
>  		}
>
> @@ -337,9 +336,7 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
>  			hung_task_info(t, timeout, this_round_count);
>  		}
>  	}
> - unlock:
> -	rcu_read_unlock();
> -
> +out:
>  	if (!this_round_count)
>  		return;
>
> diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
> index c56a7f91d72e..ea218dc75ad5 100644
> --- a/kernel/locking/lockdep.c
> +++ b/kernel/locking/lockdep.c
> @@ -6834,15 +6834,13 @@ void debug_show_all_locks(void)
>  	}
>  	pr_warn("\nShowing all locks held in the system:\n");
>
> -	rcu_read_lock();
> -	for_each_process_thread(g, p) {
> +	for_each_process_thread_rculock(g, p) {
>  		if (!p->lockdep_depth)
>  			continue;
>  		lockdep_print_held_locks(p);
>  		touch_nmi_watchdog();
>  		touch_all_softlockup_watchdogs();
>  	}
> -	rcu_read_unlock();
>
>  	pr_warn("\n");
>  	pr_warn("=============================================\n\n");
> diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c
> index 2a778b8ab4ad..d8e0b5896db9 100644
> --- a/kernel/rcu/update.c
> +++ b/kernel/rcu/update.c
> @@ -548,15 +548,13 @@ void synchronize_rcu_trivial_preempt(void)
>  	struct task_struct *t;
>
>  	smp_mb(); // Order prior accesses before grace-period start.
> -	rcu_read_lock(); // Protect task list.
> -	for_each_process_thread(g, t) {
> +	for_each_process_thread_rculock(g, t) {
>  		if (t == current)
>  			continue;  // Don't deadlock on ourselves!
>  		// Order later rcu_read_lock() on other tasks after QS.
>  		while (smp_load_acquire(&t->rcu_trivial_preempt_nesting))
>  			continue;
>  	}
> -	rcu_read_unlock();
>  }
>  EXPORT_SYMBOL_GPL(synchronize_rcu_trivial_preempt);
>  #endif // #if IS_ENABLED(CONFIG_TRIVIAL_PREEMPT_RCU)
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 0697ed0f1c3d..fd5bdd2cb798 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -2005,8 +2005,7 @@ static void uclamp_sync_util_min_rt_default(void)
>  	smp_mb__after_spinlock();
>  	read_unlock(&tasklist_lock);
>
> -	guard(rcu)();
> -	for_each_process_thread(g, p)
> +	for_each_process_thread_rculock(g, p)
>  		uclamp_update_util_min_rt_default(p);
>  }
>
> diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
> index 72236db67983..cdae165b98f7 100644
> --- a/kernel/sched/debug.c
> +++ b/kernel/sched/debug.c
> @@ -1029,14 +1029,12 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu)
>  #endif
>  		   "\n");
>
> -	rcu_read_lock();
> -	for_each_process_thread(g, p) {
> +	for_each_process_thread_rculock(g, p) {
>  		if (task_cpu(p) != rq_cpu)
>  			continue;
>
>  		print_task(m, rq, p);
>  	}
> -	rcu_read_unlock();
>  }
>
>  void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
> diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c
> index 40d373d65f9b..f797ce119223 100644
> --- a/kernel/trace/fgraph.c
> +++ b/kernel/trace/fgraph.c
> @@ -1057,11 +1057,10 @@ static int alloc_retstack_tasklist(unsigned long **ret_stack_list)
>  		}
>  	}
>
> -	rcu_read_lock();
> -	for_each_process_thread(g, t) {
> +	for_each_process_thread_rculock(g, t) {
>  		if (start == end) {
>  			ret = -EAGAIN;
> -			goto unlock;
> +			goto free;
>  		}
>
>  		if (t->ret_stack == NULL) {
> @@ -1074,9 +1073,6 @@ static int alloc_retstack_tasklist(unsigned long **ret_stack_list)
>  			t->ret_stack = ret_stack_list[start++];
>  		}
>  	}
> -
> -unlock:
> -	rcu_read_unlock();
>  free:
>  	for (i = start; i < end; i++)
>  		kmem_cache_free(fgraph_stack_cachep, ret_stack_list[i]);
> diff --git a/kernel/unwind/deferred.c b/kernel/unwind/deferred.c
> index 5bea47314254..ecfe1336095e 100644
> --- a/kernel/unwind/deferred.c
> +++ b/kernel/unwind/deferred.c
> @@ -319,9 +319,8 @@ void unwind_deferred_cancel(struct unwind_work *work)
>
>  	synchronize_srcu(&unwind_srcu);
>
> -	guard(rcu)();
>  	/* Clear this bit from all threads */
> -	for_each_process_thread(g, t) {
> +	for_each_process_thread_rculock(g, t) {
>  		atomic_long_andnot(BIT(bit),
>  				   &t->unwind_info.unwind_mask);
>  		if (t->unwind_info.cache)
> --
> 2.25.1
>

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 6/8] fs: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 6/8] fs: " Ye Liu
@ 2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:47   ` Gregory Price
  2026-09-07 21:40   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07 12:27 UTC (permalink / raw)
  To: Ye Liu
  Cc: Tony Luck, Reinette Chatre, x86, Christian Brauner, Andrew Morton,
	Jann Horn, Mike Rapoport (Microsoft), David Hildenbrand (arm),
	Alexey Dobriyan, Oleg Nesterov, Ye Liu, Michal Hocko, peterz,
	paulmck, mingo, rostedt, jpoimboe, mic, tglx, linmiaohe,
	nao.horiguchi, rafael, gnoack3000, sj, rientjes, shakeel.butt,
	xu.xin16, chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, paul,
	jmorris, serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon, Sep 07, 2026 at 04:13:32PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Replace the manual rcu_read_lock()/rcu_read_unlock() pairs combined
> with for_each_process() and for_each_process_thread() loops in fs/
> with the for_each_*_rculock() macros, which scope the RCU read lock
> to the loop body via scoped_guard(rcu).
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> Changes in v2:
>   - Rename *_rcu to *_rculock
>  fs/proc/base.c        | 4 +---
>  fs/resctrl/rdtgroup.c | 8 ++------
>  2 files changed, 3 insertions(+), 9 deletions(-)
>
> diff --git a/fs/proc/base.c b/fs/proc/base.c
> index 6a39de424f62..3de4f4557e4c 100644
> --- a/fs/proc/base.c
> +++ b/fs/proc/base.c
> @@ -1160,8 +1160,7 @@ static int __set_oom_adj(struct file *file, int oom_adj, bool legacy)
>  	if (mm) {
>  		struct task_struct *p;
>
> -		rcu_read_lock();
> -		for_each_process(p) {
> +		for_each_process_rculock(p) {
>  			if (same_thread_group(task, p))
>  				continue;
>
> @@ -1177,7 +1176,6 @@ static int __set_oom_adj(struct file *file, int oom_adj, bool legacy)
>  			}
>  			task_unlock(p);
>  		}
> -		rcu_read_unlock();
>  		mmdrop(mm);
>  	}
>  err_unlock:
> diff --git a/fs/resctrl/rdtgroup.c b/fs/resctrl/rdtgroup.c
> index 5dcbb0a964e8..b14df8b23f1a 100644
> --- a/fs/resctrl/rdtgroup.c
> +++ b/fs/resctrl/rdtgroup.c
> @@ -709,14 +709,12 @@ int rdtgroup_tasks_assigned(struct rdtgroup *r)
>
>  	lockdep_assert_held(&rdtgroup_mutex);
>
> -	rcu_read_lock();
> -	for_each_process_thread(p, t) {
> +	for_each_process_thread_rculock(p, t) {
>  		if (is_closid_match(t, r) || is_rmid_match(t, r)) {
>  			ret = 1;
>  			break;
>  		}
>  	}
> -	rcu_read_unlock();
>
>  	return ret;
>  }
> @@ -826,15 +824,13 @@ static void show_rdt_tasks(struct rdtgroup *r, struct seq_file *s)
>  	struct task_struct *p, *t;
>  	pid_t pid;
>
> -	rcu_read_lock();
> -	for_each_process_thread(p, t) {
> +	for_each_process_thread_rculock(p, t) {
>  		if (is_closid_match(t, r) || is_rmid_match(t, r)) {
>  			pid = task_pid_vnr(t);
>  			if (pid)
>  				seq_printf(s, "%d\n", pid);
>  		}
>  	}
> -	rcu_read_unlock();
>  }
>
>  static int rdtgroup_tasks_show(struct kernfs_open_file *of,
> --
> 2.25.1
>

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock Ye Liu
@ 2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:47   ` Gregory Price
  2026-09-07 21:42   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07 12:27 UTC (permalink / raw)
  To: Ye Liu
  Cc: Andrew Morton, Ye Liu, Michal Hocko, peterz, paulmck, mingo,
	rostedt, jpoimboe, mic, oleg, tglx, david, linmiaohe,
	nao.horiguchi, rafael, gnoack3000, sj, rientjes, shakeel.butt,
	xu.xin16, chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:33PM +0800, 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 lib/ with for_each_process_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> Changes in v2:
>   - Rename *_rcu to *_rculock
>  lib/is_single_threaded.c | 5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)
>
> diff --git a/lib/is_single_threaded.c b/lib/is_single_threaded.c
> index 8c98b20bfc41..4e7fe85454ab 100644
> --- a/lib/is_single_threaded.c
> +++ b/lib/is_single_threaded.c
> @@ -26,8 +26,7 @@ bool current_is_single_threaded(void)
>  		return true;
>
>  	ret = false;
> -	rcu_read_lock();
> -	for_each_process(p) {
> +	for_each_process_rculock(p) {
>  		if (unlikely(p->flags & PF_KTHREAD))
>  			continue;
>  		if (unlikely(p == task->group_leader))
> @@ -48,7 +47,5 @@ bool current_is_single_threaded(void)
>  	}
>  	ret = true;
>  found:
> -	rcu_read_unlock();
> -
>  	return ret;
>  }
> --
> 2.25.1
>

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock
  2026-09-07  8:13 ` [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock Ye Liu
@ 2026-09-07 12:28   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:49   ` Gregory Price
  2026-09-07 21:44   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Lorenzo Stoakes (ARM) @ 2026-09-07 12:28 UTC (permalink / raw)
  To: Ye Liu
  Cc: Mickaël Salaün, Paul Moore, James Morris,
	Serge E. Hallyn, Ye Liu, Justin Suess, Günther Noack, mhocko,
	peterz, paulmck, mingo, rostedt, jpoimboe, oleg, tglx, akpm,
	david, linmiaohe, nao.horiguchi, rafael, sj, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, pavel,
	lance.yang, mhiramat, pmladek, longman, mathieu.desnoyers,
	jiangshanlai, qiang.zhang, dietmar.eggemann, bsegall, mgorman,
	vschneid, kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:34PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
>
> Replace guard(rcu)() + for_each_thread() with for_each_thread_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
>
> No functional change.
>
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Reviewed-by: Justin Suess <utilityemal77@gmail.com>
> Reviewed-by: Günther Noack <gnoack3000@gmail.com>

LGTM so:

Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>

> ---
> Changes in v2:
>   - Rename *_rcu to *_rculock
>  security/landlock/tsync.c | 8 ++------
>  1 file changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/security/landlock/tsync.c b/security/landlock/tsync.c
> index 0b71e158c3f5..a578af640aad 100644
> --- a/security/landlock/tsync.c
> +++ b/security/landlock/tsync.c
> @@ -335,9 +335,7 @@ static size_t count_additional_threads(const struct tsync_works *works)
>
>  	caller = current;
>
> -	guard(rcu)();

OK looked at the file and confirmed the function exits just after the below
section so fine :)

> -
> -	for_each_thread(caller, thread) {
> +	for_each_thread_rculock(caller, thread) {
>  		/* Skip current, since it is initiating the sync. */
>  		if (thread == caller)
>  			continue;
> @@ -376,9 +374,7 @@ static bool schedule_task_work(struct tsync_works *works,
>
>  	caller = current;
>
> -	guard(rcu)();

Similar here.

> -
> -	for_each_thread(caller, thread) {
> +	for_each_thread_rculock(caller, thread) {
>  		/* Skip current, since it is initiating the sync. */
>  		if (thread == caller)
>  			continue;
> --
> 2.25.1
>

--
Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 1/8] sched: introduce for_each_process_rculock and for_each_thread_rculock
  2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
  2026-09-07  8:30   ` Lorenzo Stoakes (ARM)
  2026-09-07  9:35   ` Oleg Nesterov
@ 2026-09-07 15:42   ` Gregory Price
  2026-09-07 21:20   ` SJ Park
  3 siblings, 0 replies; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:42 UTC (permalink / raw)
  To: Ye Liu
  Cc: Oleg Nesterov, Peter Zijlstra (Intel), Marco Elver, Ye Liu,
	Tejun Heo, Christian Brauner, Bart Van Assche, Yi Tao,
	Michal Hocko, paulmck, mingo, rostedt, jpoimboe, mic, tglx, akpm,
	david, linmiaohe, nao.horiguchi, rafael, gnoack3000, ljs, sj,
	rientjes, shakeel.butt, xu.xin16, chengming.zhou, will, boqun,
	frederic, neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon, Sep 07, 2026 at 04:13:27PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
> 
> Introduce for_each_process_rculock(), for_each_thread_rculock() and
> for_each_process_thread_rculock() macros that acquire the RCU read
> lock before the iteration starts and release it when the loop is left,
> so that the RCU read-side critical section is scoped to the loop body
> instead of an externally managed rcu_read_lock()/rcu_read_unlock()
> pair.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Lorenzo already picked up the nits, this is really nice otherwise.

Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock Ye Liu
  2026-09-07  8:35   ` Lorenzo Stoakes (ARM)
@ 2026-09-07 15:42   ` Gregory Price
  1 sibling, 0 replies; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:42 UTC (permalink / raw)
  To: Ye Liu
  Cc: Michal Hocko, Andrew Morton, Ye Liu, SJ Park, peterz, paulmck,
	mingo, rostedt, jpoimboe, mic, oleg, tglx, david, linmiaohe,
	nao.horiguchi, rafael, gnoack3000, ljs, rientjes, shakeel.butt,
	xu.xin16, chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:28PM +0800, 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_rculock()
> and for_each_thread_rculock(), which scope the RCU read lock to the
> loop body via scoped_guard(rcu).
> 
> No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: SJ Park <sj@kernel.org>

Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock Ye Liu
  2026-09-07  8:36   ` Lorenzo Stoakes (ARM)
@ 2026-09-07 15:43   ` Gregory Price
  1 sibling, 0 replies; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:43 UTC (permalink / raw)
  To: Ye Liu
  Cc: Andrew Morton, David Hildenbrand, Ye Liu, Michal Hocko, SJ Park,
	peterz, paulmck, mingo, rostedt, jpoimboe, mic, oleg, tglx,
	linmiaohe, nao.horiguchi, rafael, gnoack3000, ljs, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon, Sep 07, 2026 at 04:13:29PM +0800, 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_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
> 
> No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: SJ Park <sj@kernel.org>

Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 4/8] mm/memory-failure: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 4/8] mm/memory-failure: " Ye Liu
  2026-09-07 11:05   ` Lorenzo Stoakes (ARM)
@ 2026-09-07 15:43   ` Gregory Price
  2026-09-07 21:24   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:43 UTC (permalink / raw)
  To: Ye Liu
  Cc: Miaohe Lin, Andrew Morton, Ye Liu, Michal Hocko, peterz, paulmck,
	mingo, rostedt, jpoimboe, mic, oleg, tglx, david, nao.horiguchi,
	rafael, gnoack3000, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:30PM +0800, 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_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>

Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 6/8] fs: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 6/8] fs: " Ye Liu
  2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
@ 2026-09-07 15:47   ` Gregory Price
  2026-09-07 21:40   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:47 UTC (permalink / raw)
  To: Ye Liu
  Cc: Tony Luck, Reinette Chatre, x86, Christian Brauner, Andrew Morton,
	Jann Horn, Mike Rapoport (Microsoft), David Hildenbrand (arm),
	Alexey Dobriyan, Lorenzo Stoakes, Oleg Nesterov, Ye Liu,
	Michal Hocko, peterz, paulmck, mingo, rostedt, jpoimboe, mic,
	tglx, linmiaohe, nao.horiguchi, rafael, gnoack3000, sj, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:32PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
> 
> Replace the manual rcu_read_lock()/rcu_read_unlock() pairs combined
> with for_each_process() and for_each_process_thread() loops in fs/
> with the for_each_*_rculock() macros, which scope the RCU read lock
> to the loop body via scoped_guard(rcu).
> 
> No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock Ye Liu
  2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
@ 2026-09-07 15:47   ` Gregory Price
  2026-09-07 21:42   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:47 UTC (permalink / raw)
  To: Ye Liu
  Cc: Andrew Morton, Ye Liu, Michal Hocko, peterz, paulmck, mingo,
	rostedt, jpoimboe, mic, oleg, tglx, david, linmiaohe,
	nao.horiguchi, rafael, gnoack3000, ljs, sj, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon, Sep 07, 2026 at 04:13:33PM +0800, 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 lib/ with for_each_process_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
> 
> No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock
  2026-09-07  8:13 ` [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock Ye Liu
  2026-09-07 12:28   ` Lorenzo Stoakes (ARM)
@ 2026-09-07 15:49   ` Gregory Price
  2026-09-07 21:44   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:49 UTC (permalink / raw)
  To: Ye Liu
  Cc: Mickaël Salaün, Paul Moore, James Morris,
	Serge E. Hallyn, Ye Liu, Justin Suess, Günther Noack, mhocko,
	peterz, paulmck, mingo, rostedt, jpoimboe, oleg, tglx, akpm,
	david, linmiaohe, nao.horiguchi, rafael, ljs, sj, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, pavel,
	lance.yang, mhiramat, pmladek, longman, mathieu.desnoyers,
	jiangshanlai, qiang.zhang, dietmar.eggemann, bsegall, mgorman,
	vschneid, kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:34PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
> 
> Replace guard(rcu)() + for_each_thread() with for_each_thread_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
> 
> No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Reviewed-by: Justin Suess <utilityemal77@gmail.com>
> Reviewed-by: Günther Noack <gnoack3000@gmail.com>

Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock Ye Liu
  2026-09-07 12:20   ` Lorenzo Stoakes (ARM)
@ 2026-09-07 15:53   ` Gregory Price
  2026-09-07 17:57     ` Oleg Nesterov
  2026-09-07 21:28   ` SJ Park
  2 siblings, 1 reply; 36+ messages in thread
From: Gregory Price @ 2026-09-07 15:53 UTC (permalink / raw)
  To: Ye Liu
  Cc: Thomas Gleixner, Peter Zijlstra, Rafael J. Wysocki, Andrew Morton,
	Ingo Molnar, Will Deacon, Boqun Feng, Paul E. McKenney,
	Frederic Weisbecker, Neeraj Upadhyay, Joel Fernandes,
	Josh Triplett, Uladzislau Rezki, Juri Lelli, Vincent Guittot,
	Steven Rostedt, Masami Hiramatsu, Josh Poimboeuf, Ye Liu,
	Michal Hocko, mic, oleg, david, linmiaohe, nao.horiguchi,
	gnoack3000, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, pmladek, longman, mathieu.desnoyers,
	jiangshanlai, qiang.zhang, dietmar.eggemann, bsegall, mgorman,
	vschneid, kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 04:13:31PM +0800, Ye Liu wrote:
> From: Ye Liu <liuye@kylinos.cn>
> 
> Replace the manual rcu_read_lock()/rcu_read_unlock() and guard(rcu)
> pairs combined with for_each_process(), for_each_thread() and
> for_each_process_thread() loops across kernel/ with the
> for_each_*_rculock() macros, which scope the RCU read lock to the
> loop body via scoped_guard(rcu).
> 
> No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Question below

> diff --git a/kernel/hung_task.c b/kernel/hung_task.c
> index 6fcc94ce4ca9..73a5ad3be9a8 100644
> --- a/kernel/hung_task.c
> +++ b/kernel/hung_task.c
> @@ -315,13 +315,12 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
>  		return;
>  
>  	this_round_count = 0;
> -	rcu_read_lock();
> -	for_each_process_thread(g, t) {
> +	for_each_process_thread_rculock(g, t) {
>  		if (!max_count--)
> -			goto unlock;
> +			goto out;
... snip ...
> - unlock:
> -	rcu_read_unlock();
> -
> +out:
>  	if (!this_round_count)
>  		return;
>  

The sunken rcu_read_lock()/unlock() + scoped_guard usage makes this goto
at a minimum very confusing, if not actually broken.

Are we sure this isn't broken as-written? Generally we don't mix cleanup
and goto for exactly this reason.

~Gregory


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock
  2026-09-07 15:53   ` Gregory Price
@ 2026-09-07 17:57     ` Oleg Nesterov
  2026-09-07 21:05       ` Gregory Price
  0 siblings, 1 reply; 36+ messages in thread
From: Oleg Nesterov @ 2026-09-07 17:57 UTC (permalink / raw)
  To: Gregory Price
  Cc: Ye Liu, Thomas Gleixner, Peter Zijlstra, Rafael J. Wysocki,
	Andrew Morton, Ingo Molnar, Will Deacon, Boqun Feng,
	Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
	Joel Fernandes, Josh Triplett, Uladzislau Rezki, Juri Lelli,
	Vincent Guittot, Steven Rostedt, Masami Hiramatsu, Josh Poimboeuf,
	Ye Liu, Michal Hocko, mic, david, linmiaohe, nao.horiguchi,
	gnoack3000, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, pmladek, longman, mathieu.desnoyers,
	jiangshanlai, qiang.zhang, dietmar.eggemann, bsegall, mgorman,
	vschneid, kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On 09/07, Gregory Price wrote:
>
> On Mon, Sep 07, 2026 at 04:13:31PM +0800, Ye Liu wrote:
> > --- a/kernel/hung_task.c
> > +++ b/kernel/hung_task.c
> > @@ -315,13 +315,12 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
> >  		return;
> >
> >  	this_round_count = 0;
> > -	rcu_read_lock();
> > -	for_each_process_thread(g, t) {
> > +	for_each_process_thread_rculock(g, t) {
> >  		if (!max_count--)
> > -			goto unlock;
> > +			goto out;
> ... snip ...
> > - unlock:
> > -	rcu_read_unlock();
> > -
> > +out:
> >  	if (!this_round_count)
> >  		return;
> >
>
> The sunken rcu_read_lock()/unlock() + scoped_guard usage makes this goto
> at a minimum very confusing, if not actually broken.

I am afraid I misunderstood you concerns...

This patch renames the "unlock:" label to "out:", and to me this makes sense.

Unfortunately for_each_process_thread() and the new helper can't use "break".

Oleg.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock
  2026-09-07 17:57     ` Oleg Nesterov
@ 2026-09-07 21:05       ` Gregory Price
  2026-09-07 21:54         ` Oleg Nesterov
  0 siblings, 1 reply; 36+ messages in thread
From: Gregory Price @ 2026-09-07 21:05 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Ye Liu, Thomas Gleixner, Peter Zijlstra, Rafael J. Wysocki,
	Andrew Morton, Ingo Molnar, Will Deacon, Boqun Feng,
	Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
	Joel Fernandes, Josh Triplett, Uladzislau Rezki, Juri Lelli,
	Vincent Guittot, Steven Rostedt, Masami Hiramatsu, Josh Poimboeuf,
	Ye Liu, Michal Hocko, mic, david, linmiaohe, nao.horiguchi,
	gnoack3000, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, pmladek, longman, mathieu.desnoyers,
	jiangshanlai, qiang.zhang, dietmar.eggemann, bsegall, mgorman,
	vschneid, kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon, Sep 07, 2026 at 07:57:15PM +0200, Oleg Nesterov wrote:
> On 09/07, Gregory Price wrote:
> >
> > On Mon, Sep 07, 2026 at 04:13:31PM +0800, Ye Liu wrote:
> > > --- a/kernel/hung_task.c
> > > +++ b/kernel/hung_task.c
> > > @@ -315,13 +315,12 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
> > >  		return;
> > >
> > >  	this_round_count = 0;
> > > -	rcu_read_lock();
> > > -	for_each_process_thread(g, t) {
> > > +	for_each_process_thread_rculock(g, t) {
> > >  		if (!max_count--)
> > > -			goto unlock;
> > > +			goto out;
> > ... snip ...
> > > - unlock:
> > > -	rcu_read_unlock();
> > > -
> > > +out:
> > >  	if (!this_round_count)
> > >  		return;
> > >
> >
> > The sunken rcu_read_lock()/unlock() + scoped_guard usage makes this goto
> > at a minimum very confusing, if not actually broken.
> 
> I am afraid I misunderstood you concerns...
>

This might be my - admittedly shallow - understanding of scoped_guard,
but does scoped guard handle goto correctly?

On the surface it looks like it would skip the unlock entirely.

That is what i mean by "at a minimum very confusing, if not broken"
and why it's generally discouraged to mix cleanup.h and goto.

~Gregory


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 1/8] sched: introduce for_each_process_rculock and for_each_thread_rculock
  2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
                     ` (2 preceding siblings ...)
  2026-09-07 15:42   ` Gregory Price
@ 2026-09-07 21:20   ` SJ Park
  3 siblings, 0 replies; 36+ messages in thread
From: SJ Park @ 2026-09-07 21:20 UTC (permalink / raw)
  To: Ye Liu
  Cc: SJ Park, Oleg Nesterov, Peter Zijlstra (Intel), Marco Elver,
	Ye Liu, Tejun Heo, Christian Brauner, Bart Van Assche, Yi Tao,
	paulmck, mingo, rostedt, jpoimboe, mic, tglx, akpm, david,
	linmiaohe, nao.horiguchi, rafael, gnoack3000, ljs, rientjes,
	shakeel.butt, xu.xin16, chengming.zhou, will, boqun, frederic,
	neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, mhiramat, pmladek, longman,
	mathieu.desnoyers, jiangshanlai, qiang.zhang, dietmar.eggemann,
	bsegall, mgorman, vschneid, kprateek.nayak, mark.rutland,
	Dave.Martin, james.morse, babu.moger, linux-mm, linux-kernel,
	linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon,  7 Sep 2026 16:13:27 +0800 Ye Liu <ye.liu@linux.dev> wrote:

> From: Ye Liu <liuye@kylinos.cn>
> 
> Introduce for_each_process_rculock(), for_each_thread_rculock() and
> for_each_process_thread_rculock() macros that acquire the RCU read
> lock before the iteration starts and release it when the loop is left,
> so that the RCU read-side critical section is scoped to the loop body
> instead of an externally managed rcu_read_lock()/rcu_read_unlock()
> pair.

Looks good to me.

> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Assuming Lorenzo's indentation change requests are accepted,

Reviewed-by: SJ Park <sj@kernel.org>


Thanks,
SJ

[...]


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 4/8] mm/memory-failure: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 4/8] mm/memory-failure: " Ye Liu
  2026-09-07 11:05   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:43   ` Gregory Price
@ 2026-09-07 21:24   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: SJ Park @ 2026-09-07 21:24 UTC (permalink / raw)
  To: Ye Liu
  Cc: SJ Park, Miaohe Lin, Andrew Morton, Michal Hocko, peterz, paulmck,
	mingo, rostedt, jpoimboe, mic, oleg, tglx, david, nao.horiguchi,
	rafael, gnoack3000, ljs, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon,  7 Sep 2026 16:13:30 +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_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.

Thank you for clarifying :)

> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Acked-by: Miaohe Lin <linmiaohe@huawei.com>

Reviewed-by: SJ Park <sj@kernel.org>


Thanks,
SJ

[...]


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock Ye Liu
  2026-09-07 12:20   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:53   ` Gregory Price
@ 2026-09-07 21:28   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: SJ Park @ 2026-09-07 21:28 UTC (permalink / raw)
  To: Ye Liu
  Cc: SJ Park, Thomas Gleixner, Peter Zijlstra, Rafael J. Wysocki,
	Andrew Morton, Ingo Molnar, Will Deacon, Boqun Feng,
	Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
	Joel Fernandes, Josh Triplett, Uladzislau Rezki, Juri Lelli,
	Vincent Guittot, Steven Rostedt, Masami Hiramatsu, Josh Poimboeuf,
	Ye Liu, Michal Hocko, mic, oleg, david, linmiaohe, nao.horiguchi,
	gnoack3000, ljs, rientjes, shakeel.butt, xu.xin16, chengming.zhou,
	tony.luck, reinette.chatre, x86, paul, jmorris, serge, pavel,
	lance.yang, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon,  7 Sep 2026 16:13:31 +0800 Ye Liu <ye.liu@linux.dev> wrote:

> From: Ye Liu <liuye@kylinos.cn>
> 
> Replace the manual rcu_read_lock()/rcu_read_unlock() and guard(rcu)
> pairs combined with for_each_process(), for_each_thread() and
> for_each_process_thread() loops across kernel/ with the
> for_each_*_rculock() macros, which scope the RCU read lock to the
> loop body via scoped_guard(rcu).
> 
> No functional change.

Looks good and correct to me.

> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Reviewed-by: SJ Park <sj@kernel.org>


Thanks,
SJ

[...]


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 6/8] fs: convert process/thread iterators to for_each_*_rculock
  2026-09-07  8:13 ` [PATCH v2 6/8] fs: " Ye Liu
  2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:47   ` Gregory Price
@ 2026-09-07 21:40   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: SJ Park @ 2026-09-07 21:40 UTC (permalink / raw)
  To: Ye Liu
  Cc: SJ Park, Tony Luck, Reinette Chatre, x86, Christian Brauner,
	Andrew Morton, Jann Horn, Mike Rapoport (Microsoft),
	David Hildenbrand (arm), Alexey Dobriyan, Lorenzo Stoakes,
	Oleg Nesterov, Michal Hocko, peterz, paulmck, mingo, rostedt,
	jpoimboe, mic, tglx, linmiaohe, nao.horiguchi, rafael, gnoack3000,
	rientjes, shakeel.butt, xu.xin16, chengming.zhou, will, boqun,
	frederic, neeraj.upadhyay, joelagnelf, josh, urezki, juri.lelli,
	vincent.guittot, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon,  7 Sep 2026 16:13:32 +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() and for_each_process_thread() loops in fs/
> with the for_each_*_rculock() macros, which scope the RCU read lock
> to the loop body via scoped_guard(rcu).
> 
> No functional change.

Looks good and correct to me.

> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Reviewed-by: SJ Park <sj@kernel.org>


Thanks,
SJ

[...]


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock
  2026-09-07  8:13 ` [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock Ye Liu
  2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:47   ` Gregory Price
@ 2026-09-07 21:42   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: SJ Park @ 2026-09-07 21:42 UTC (permalink / raw)
  To: Ye Liu
  Cc: SJ Park, Andrew Morton, Michal Hocko, peterz, paulmck, mingo,
	rostedt, jpoimboe, mic, oleg, tglx, david, linmiaohe,
	nao.horiguchi, rafael, gnoack3000, ljs, rientjes, shakeel.butt,
	xu.xin16, chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, paul, jmorris, serge, pavel, lance.yang,
	mhiramat, pmladek, longman, mathieu.desnoyers, jiangshanlai,
	qiang.zhang, dietmar.eggemann, bsegall, mgorman, vschneid,
	kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On Mon,  7 Sep 2026 16:13:33 +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 lib/ with for_each_process_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
> 
> No functional change.

Looks good and correct to me.

> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Acked-by: Michal Hocko <mhocko@suse.com>

Reviewed-by: SJ Park <sj@kernel.org>


Thanks,
SJ

[...]


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock
  2026-09-07  8:13 ` [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock Ye Liu
  2026-09-07 12:28   ` Lorenzo Stoakes (ARM)
  2026-09-07 15:49   ` Gregory Price
@ 2026-09-07 21:44   ` SJ Park
  2 siblings, 0 replies; 36+ messages in thread
From: SJ Park @ 2026-09-07 21:44 UTC (permalink / raw)
  To: Ye Liu
  Cc: SJ Park, Mickaël Salaün, Paul Moore, James Morris,
	Serge E. Hallyn, Justin Suess, Günther Noack, mhocko, peterz,
	paulmck, mingo, rostedt, jpoimboe, oleg, tglx, akpm, david,
	linmiaohe, nao.horiguchi, rafael, ljs, rientjes, shakeel.butt,
	xu.xin16, chengming.zhou, will, boqun, frederic, neeraj.upadhyay,
	joelagnelf, josh, urezki, juri.lelli, vincent.guittot, tony.luck,
	reinette.chatre, x86, pavel, lance.yang, mhiramat, pmladek,
	longman, mathieu.desnoyers, jiangshanlai, qiang.zhang,
	dietmar.eggemann, bsegall, mgorman, vschneid, kprateek.nayak,
	mark.rutland, Dave.Martin, james.morse, babu.moger, linux-mm,
	linux-kernel, linux-pm, rcu, linux-trace-kernel, linux-fsdevel,
	linux-security-module

On Mon,  7 Sep 2026 16:13:34 +0800 Ye Liu <ye.liu@linux.dev> wrote:

> From: Ye Liu <liuye@kylinos.cn>
> 
> Replace guard(rcu)() + for_each_thread() with for_each_thread_rculock(),
> which scopes the RCU read lock to the loop body via scoped_guard(rcu).
> 
> No functional change.
> 
> Signed-off-by: Ye Liu <liuye@kylinos.cn>
> Reviewed-by: Justin Suess <utilityemal77@gmail.com>
> Reviewed-by: Günther Noack <gnoack3000@gmail.com>

Reviewed-by: SJ Park <sj@kernel.org>


Thanks,
SJ

[...]


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock
  2026-09-07 21:05       ` Gregory Price
@ 2026-09-07 21:54         ` Oleg Nesterov
  0 siblings, 0 replies; 36+ messages in thread
From: Oleg Nesterov @ 2026-09-07 21:54 UTC (permalink / raw)
  To: Gregory Price
  Cc: Ye Liu, Thomas Gleixner, Peter Zijlstra, Rafael J. Wysocki,
	Andrew Morton, Ingo Molnar, Will Deacon, Boqun Feng,
	Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
	Joel Fernandes, Josh Triplett, Uladzislau Rezki, Juri Lelli,
	Vincent Guittot, Steven Rostedt, Masami Hiramatsu, Josh Poimboeuf,
	Ye Liu, Michal Hocko, mic, david, linmiaohe, nao.horiguchi,
	gnoack3000, ljs, sj, rientjes, shakeel.butt, xu.xin16,
	chengming.zhou, tony.luck, reinette.chatre, x86, paul, jmorris,
	serge, pavel, lance.yang, pmladek, longman, mathieu.desnoyers,
	jiangshanlai, qiang.zhang, dietmar.eggemann, bsegall, mgorman,
	vschneid, kprateek.nayak, mark.rutland, Dave.Martin, james.morse,
	babu.moger, linux-mm, linux-kernel, linux-pm, rcu,
	linux-trace-kernel, linux-fsdevel, linux-security-module

On 09/07, Gregory Price wrote:
>
> On Mon, Sep 07, 2026 at 07:57:15PM +0200, Oleg Nesterov wrote:
> > On 09/07, Gregory Price wrote:
> > >
> > > On Mon, Sep 07, 2026 at 04:13:31PM +0800, Ye Liu wrote:
> > > > --- a/kernel/hung_task.c
> > > > +++ b/kernel/hung_task.c
> > > > @@ -315,13 +315,12 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
> > > >  		return;
> > > >
> > > >  	this_round_count = 0;
> > > > -	rcu_read_lock();
> > > > -	for_each_process_thread(g, t) {
> > > > +	for_each_process_thread_rculock(g, t) {
> > > >  		if (!max_count--)
> > > > -			goto unlock;
> > > > +			goto out;
> > > ... snip ...
> > > > - unlock:
> > > > -	rcu_read_unlock();
> > > > -
> > > > +out:
> > > >  	if (!this_round_count)
> > > >  		return;
> > > >
> > >
> > > The sunken rcu_read_lock()/unlock() + scoped_guard usage makes this goto
> > > at a minimum very confusing, if not actually broken.
> >
> > I am afraid I misunderstood you concerns...
> >
>
> This might be my - admittedly shallow - understanding of scoped_guard,
> but does scoped guard handle goto correctly?

Yes, it does,

> and why it's generally discouraged to mix cleanup.h and goto.

Hmm, why? I didn't know...

Oleg.



^ permalink raw reply	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2026-09-07 21:55 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-07  8:13 [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Ye Liu
2026-09-07  8:13 ` [PATCH v2 1/8] " Ye Liu
2026-09-07  8:30   ` Lorenzo Stoakes (ARM)
2026-09-07  9:35   ` Oleg Nesterov
2026-09-07 15:42   ` Gregory Price
2026-09-07 21:20   ` SJ Park
2026-09-07  8:13 ` [PATCH v2 2/8] mm/oom_kill: convert process/thread iterators to for_each_*_rculock Ye Liu
2026-09-07  8:35   ` Lorenzo Stoakes (ARM)
2026-09-07 15:42   ` Gregory Price
2026-09-07  8:13 ` [PATCH v2 3/8] mm/ksm: convert process iterator to for_each_process_rculock Ye Liu
2026-09-07  8:36   ` Lorenzo Stoakes (ARM)
2026-09-07 15:43   ` Gregory Price
2026-09-07  8:13 ` [PATCH v2 4/8] mm/memory-failure: " Ye Liu
2026-09-07 11:05   ` Lorenzo Stoakes (ARM)
2026-09-07 15:43   ` Gregory Price
2026-09-07 21:24   ` SJ Park
2026-09-07  8:13 ` [PATCH v2 5/8] kernel: convert process/thread iterators to for_each_*_rculock Ye Liu
2026-09-07 12:20   ` Lorenzo Stoakes (ARM)
2026-09-07 15:53   ` Gregory Price
2026-09-07 17:57     ` Oleg Nesterov
2026-09-07 21:05       ` Gregory Price
2026-09-07 21:54         ` Oleg Nesterov
2026-09-07 21:28   ` SJ Park
2026-09-07  8:13 ` [PATCH v2 6/8] fs: " Ye Liu
2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
2026-09-07 15:47   ` Gregory Price
2026-09-07 21:40   ` SJ Park
2026-09-07  8:13 ` [PATCH v2 7/8] lib: convert process iterator to for_each_process_rculock Ye Liu
2026-09-07 12:27   ` Lorenzo Stoakes (ARM)
2026-09-07 15:47   ` Gregory Price
2026-09-07 21:42   ` SJ Park
2026-09-07  8:13 ` [PATCH v2 8/8] security/landlock: convert thread iterator to for_each_thread_rculock Ye Liu
2026-09-07 12:28   ` Lorenzo Stoakes (ARM)
2026-09-07 15:49   ` Gregory Price
2026-09-07 21:44   ` SJ Park
2026-09-07  8:26 ` [PATCH v2 0/8] sched: introduce for_each_process_rculock and for_each_thread_rculock Lorenzo Stoakes (ARM)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox