* [PATCH rcu 00/11] Lazy Preempt changes for v6.15
@ 2025-02-25 3:55 Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 01/11] rcu: fix header guard for rcu_all_qs() Boqun Feng
` (11 more replies)
0 siblings, 12 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
Hi,
Please find the upcoming changes for CONFIG_PREEMPT_LAZY in RCU. The
changes can also be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rcu/linux.git lazypreempt.2025.02.24a
Paul & Ankur, I put patch #7 and #8 (bug fixes in rcutorture) before
patch #9 (which is the one that enables non-preemptible RCU in
preemptible kernel), because I want to avoid introduce a bug in-between
a series, appreciate it if you can double check on this. Thanks!
Regards,
Boqun
Ankur Arora (7):
rcu: fix header guard for rcu_all_qs()
rcu: rename PREEMPT_AUTO to PREEMPT_LAZY
sched: update __cond_resched comment about RCU quiescent states
rcu: handle unstable rdp in rcu_read_unlock_strict()
rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y
osnoise: provide quiescent states
rcu: limit PREEMPT_RCU configurations
Boqun Feng (1):
rcutorture: Update ->extendables check for lazy preemption
Paul E. McKenney (3):
rcutorture: Update rcutorture_one_extend_check() for lazy preemption
rcutorture: Make scenario TREE10 build CONFIG_PREEMPT_LAZY=y
rcutorture: Make scenario TREE07 build CONFIG_PREEMPT_LAZY=y
include/linux/rcupdate.h | 2 +-
include/linux/rcutree.h | 2 +-
include/linux/srcutiny.h | 2 +-
kernel/rcu/Kconfig | 4 +--
kernel/rcu/rcutorture.c | 26 ++++++++++++---
kernel/rcu/srcutiny.c | 14 ++++----
kernel/rcu/tree_plugin.h | 22 ++++++++++---
kernel/sched/core.c | 4 ++-
kernel/trace/trace_osnoise.c | 32 +++++++++----------
.../selftests/rcutorture/configs/rcu/TREE07 | 3 +-
.../selftests/rcutorture/configs/rcu/TREE10 | 3 +-
11 files changed, 73 insertions(+), 41 deletions(-)
--
2.39.5 (Apple Git-154)
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH rcu 01/11] rcu: fix header guard for rcu_all_qs()
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 02/11] rcu: rename PREEMPT_AUTO to PREEMPT_LAZY Boqun Feng
` (10 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: Ankur Arora <ankur.a.arora@oracle.com>
rcu_all_qs() is defined for !CONFIG_PREEMPT_RCU but the declaration
is conditioned on CONFIG_PREEMPTION.
With CONFIG_PREEMPT_LAZY, CONFIG_PREEMPTION=y does not imply
CONFIG_PREEMPT_RCU=y.
Decouple the two.
Cc: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
include/linux/rcutree.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h
index 27d86d912781..aad586f15ed0 100644
--- a/include/linux/rcutree.h
+++ b/include/linux/rcutree.h
@@ -103,7 +103,7 @@ extern int rcu_scheduler_active;
void rcu_end_inkernel_boot(void);
bool rcu_inkernel_boot_has_ended(void);
bool rcu_is_watching(void);
-#ifndef CONFIG_PREEMPTION
+#ifndef CONFIG_PREEMPT_RCU
void rcu_all_qs(void);
#endif
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 02/11] rcu: rename PREEMPT_AUTO to PREEMPT_LAZY
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 01/11] rcu: fix header guard for rcu_all_qs() Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 03/11] sched: update __cond_resched comment about RCU quiescent states Boqun Feng
` (9 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: Ankur Arora <ankur.a.arora@oracle.com>
Replace mentions of PREEMPT_AUTO with PREEMPT_LAZY.
Also, since PREMPT_LAZY implies PREEMPTION, we can reduce the
TASKS_RCU selection criteria from this:
NEED_TASKS_RCU && (PREEMPTION || PREEMPT_AUTO)
to this:
NEED_TASKS_RCU && PREEMPTION
CC: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
include/linux/srcutiny.h | 2 +-
kernel/rcu/Kconfig | 2 +-
kernel/rcu/srcutiny.c | 14 +++++++-------
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/include/linux/srcutiny.h b/include/linux/srcutiny.h
index 1321da803274..31b59b4be2a7 100644
--- a/include/linux/srcutiny.h
+++ b/include/linux/srcutiny.h
@@ -64,7 +64,7 @@ static inline int __srcu_read_lock(struct srcu_struct *ssp)
{
int idx;
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
idx = ((READ_ONCE(ssp->srcu_idx) + 1) & 0x2) >> 1;
WRITE_ONCE(ssp->srcu_lock_nesting[idx], READ_ONCE(ssp->srcu_lock_nesting[idx]) + 1);
preempt_enable();
diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig
index b9b6bc55185d..e2206f3a070c 100644
--- a/kernel/rcu/Kconfig
+++ b/kernel/rcu/Kconfig
@@ -91,7 +91,7 @@ config NEED_TASKS_RCU
config TASKS_RCU
bool
- default NEED_TASKS_RCU && (PREEMPTION || PREEMPT_AUTO)
+ default NEED_TASKS_RCU && PREEMPTION
select IRQ_WORK
config FORCE_TASKS_RUDE_RCU
diff --git a/kernel/rcu/srcutiny.c b/kernel/rcu/srcutiny.c
index 4dcbf8aa80ff..f688bdad293e 100644
--- a/kernel/rcu/srcutiny.c
+++ b/kernel/rcu/srcutiny.c
@@ -98,7 +98,7 @@ void __srcu_read_unlock(struct srcu_struct *ssp, int idx)
{
int newval;
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
newval = READ_ONCE(ssp->srcu_lock_nesting[idx]) - 1;
WRITE_ONCE(ssp->srcu_lock_nesting[idx], newval);
preempt_enable();
@@ -120,7 +120,7 @@ void srcu_drive_gp(struct work_struct *wp)
struct srcu_struct *ssp;
ssp = container_of(wp, struct srcu_struct, srcu_work);
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
if (ssp->srcu_gp_running || ULONG_CMP_GE(ssp->srcu_idx, READ_ONCE(ssp->srcu_idx_max))) {
preempt_enable();
return; /* Already running or nothing to do. */
@@ -138,7 +138,7 @@ void srcu_drive_gp(struct work_struct *wp)
WRITE_ONCE(ssp->srcu_gp_waiting, true); /* srcu_read_unlock() wakes! */
preempt_enable();
swait_event_exclusive(ssp->srcu_wq, !READ_ONCE(ssp->srcu_lock_nesting[idx]));
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
WRITE_ONCE(ssp->srcu_gp_waiting, false); /* srcu_read_unlock() cheap. */
WRITE_ONCE(ssp->srcu_idx, ssp->srcu_idx + 1);
preempt_enable();
@@ -159,7 +159,7 @@ void srcu_drive_gp(struct work_struct *wp)
* at interrupt level, but the ->srcu_gp_running checks will
* straighten that out.
*/
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
WRITE_ONCE(ssp->srcu_gp_running, false);
idx = ULONG_CMP_LT(ssp->srcu_idx, READ_ONCE(ssp->srcu_idx_max));
preempt_enable();
@@ -172,7 +172,7 @@ static void srcu_gp_start_if_needed(struct srcu_struct *ssp)
{
unsigned long cookie;
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
cookie = get_state_synchronize_srcu(ssp);
if (ULONG_CMP_GE(READ_ONCE(ssp->srcu_idx_max), cookie)) {
preempt_enable();
@@ -199,7 +199,7 @@ void call_srcu(struct srcu_struct *ssp, struct rcu_head *rhp,
rhp->func = func;
rhp->next = NULL;
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
local_irq_save(flags);
*ssp->srcu_cb_tail = rhp;
ssp->srcu_cb_tail = &rhp->next;
@@ -261,7 +261,7 @@ unsigned long start_poll_synchronize_srcu(struct srcu_struct *ssp)
{
unsigned long ret;
- preempt_disable(); // Needed for PREEMPT_AUTO
+ preempt_disable(); // Needed for PREEMPT_LAZY
ret = get_state_synchronize_srcu(ssp);
srcu_gp_start_if_needed(ssp);
preempt_enable();
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 03/11] sched: update __cond_resched comment about RCU quiescent states
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 01/11] rcu: fix header guard for rcu_all_qs() Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 02/11] rcu: rename PREEMPT_AUTO to PREEMPT_LAZY Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 04/11] rcu: handle unstable rdp in rcu_read_unlock_strict() Boqun Feng
` (8 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: Ankur Arora <ankur.a.arora@oracle.com>
Update comment in __cond_resched() clarifying how urgently needed
quiescent state are provided.
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
kernel/sched/core.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 165c90ba64ea..d328707626e3 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7289,7 +7289,7 @@ int __sched __cond_resched(void)
return 1;
}
/*
- * In preemptible kernels, ->rcu_read_lock_nesting tells the tick
+ * In PREEMPT_RCU kernels, ->rcu_read_lock_nesting tells the tick
* whether the current CPU is in an RCU read-side critical section,
* so the tick can report quiescent states even for CPUs looping
* in kernel context. In contrast, in non-preemptible kernels,
@@ -7298,6 +7298,8 @@ int __sched __cond_resched(void)
* RCU quiescent state. Therefore, the following code causes
* cond_resched() to report a quiescent state, but only when RCU
* is in urgent need of one.
+ * A third case, preemptible, but non-PREEMPT_RCU provides for
+ * urgently needed quiescent states via rcu_flavor_sched_clock_irq().
*/
#ifndef CONFIG_PREEMPT_RCU
rcu_all_qs();
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 04/11] rcu: handle unstable rdp in rcu_read_unlock_strict()
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (2 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 03/11] sched: update __cond_resched comment about RCU quiescent states Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 05/11] rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y Boqun Feng
` (7 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: Ankur Arora <ankur.a.arora@oracle.com>
rcu_read_unlock_strict() can be called with preemption enabled
which can make for an unstable rdp and a racy norm value.
Fix this by dropping the preempt-count in __rcu_read_unlock()
after the call to rcu_read_unlock_strict(), adjusting the
preempt-count check appropriately.
Suggested-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
include/linux/rcupdate.h | 2 +-
kernel/rcu/tree_plugin.h | 11 ++++++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index 48e5c03df1dd..257e9ae34414 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -95,9 +95,9 @@ static inline void __rcu_read_lock(void)
static inline void __rcu_read_unlock(void)
{
- preempt_enable();
if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
rcu_read_unlock_strict();
+ preempt_enable();
}
static inline int rcu_preempt_depth(void)
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 3600152b858e..9573408a9800 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -833,8 +833,17 @@ void rcu_read_unlock_strict(void)
{
struct rcu_data *rdp;
- if (irqs_disabled() || preempt_count() || !rcu_state.gp_kthread)
+ if (irqs_disabled() || in_atomic_preempt_off() || !rcu_state.gp_kthread)
return;
+
+ /*
+ * rcu_report_qs_rdp() can only be invoked with a stable rdp and
+ * from the local CPU.
+ *
+ * The in_atomic_preempt_off() check ensures that we come here holding
+ * the last preempt_count (which will get dropped once we return to
+ * __rcu_read_unlock().
+ */
rdp = this_cpu_ptr(&rcu_data);
rdp->cpu_no_qs.b.norm = false;
rcu_report_qs_rdp(rdp);
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 05/11] rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (3 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 04/11] rcu: handle unstable rdp in rcu_read_unlock_strict() Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 06/11] osnoise: provide quiescent states Boqun Feng
` (6 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: Ankur Arora <ankur.a.arora@oracle.com>
With PREEMPT_RCU=n, cond_resched() provides urgently needed quiescent
states for read-side critical sections via rcu_all_qs().
One reason why this was needed: lacking preempt-count, the tick
handler has no way of knowing whether it is executing in a
read-side critical section or not.
With (PREEMPT_LAZY=y, PREEMPT_DYNAMIC=n), we get (PREEMPT_COUNT=y,
PREEMPT_RCU=n). In this configuration cond_resched() is a stub and
does not provide quiescent states via rcu_all_qs().
(PREEMPT_RCU=y provides this information via rcu_read_unlock() and
its nesting counter.)
So, use the availability of preempt_count() to report quiescent states
in rcu_flavor_sched_clock_irq().
Suggested-by: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
kernel/rcu/tree_plugin.h | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 9573408a9800..3c0bbbbb686f 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -984,13 +984,16 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
*/
static void rcu_flavor_sched_clock_irq(int user)
{
- if (user || rcu_is_cpu_rrupt_from_idle()) {
+ if (user || rcu_is_cpu_rrupt_from_idle() ||
+ (IS_ENABLED(CONFIG_PREEMPT_COUNT) &&
+ (preempt_count() == HARDIRQ_OFFSET))) {
/*
* Get here if this CPU took its interrupt from user
- * mode or from the idle loop, and if this is not a
- * nested interrupt. In this case, the CPU is in
- * a quiescent state, so note it.
+ * mode, from the idle loop without this being a nested
+ * interrupt, or while not holding the task preempt count
+ * (with PREEMPT_COUNT=y). In this case, the CPU is in a
+ * quiescent state, so note it.
*
* No memory barrier is required here because rcu_qs()
* references only CPU-local variables that other CPUs
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 06/11] osnoise: provide quiescent states
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (4 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 05/11] rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-03-04 19:21 ` Steven Rostedt
2025-02-25 3:55 ` [PATCH rcu 07/11] rcutorture: Update rcutorture_one_extend_check() for lazy preemption Boqun Feng
` (5 subsequent siblings)
11 siblings, 1 reply; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora,
Daniel Bristot de Oliveira
From: Ankur Arora <ankur.a.arora@oracle.com>
To reduce RCU noise for nohz_full configurations, osnoise depends
on cond_resched() providing quiescent states for PREEMPT_RCU=n
configurations. For PREEMPT_RCU=y configurations -- where
cond_resched() is a stub -- we do this by directly calling
rcu_momentary_eqs().
With (PREEMPT_LAZY=y, PREEMPT_DYNAMIC=n), however, we have a
configuration with (PREEMPTION=y, PREEMPT_RCU=n) where neither
of the above can help.
Handle that by providing an explicit quiescent state here for all
configurations.
As mentioned above this is not needed for non-stubbed cond_resched(),
but, providing a quiescent state here just pulls in one that a future
cond_resched() would provide, so doesn't cause any extra work for
this configuration.
Cc: Paul E. McKenney <paulmck@kernel.org>
Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Suggested-by: Paul E. McKenney <paulmck@kernel.org>
Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org>
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
kernel/trace/trace_osnoise.c | 32 +++++++++++++++-----------------
1 file changed, 15 insertions(+), 17 deletions(-)
diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
index f3a2722ee4c0..512034e365ad 100644
--- a/kernel/trace/trace_osnoise.c
+++ b/kernel/trace/trace_osnoise.c
@@ -1542,27 +1542,25 @@ static int run_osnoise(void)
/*
* In some cases, notably when running on a nohz_full CPU with
- * a stopped tick PREEMPT_RCU has no way to account for QSs.
- * This will eventually cause unwarranted noise as PREEMPT_RCU
- * will force preemption as the means of ending the current
- * grace period. We avoid this problem by calling
- * rcu_momentary_eqs(), which performs a zero duration
- * EQS allowing PREEMPT_RCU to end the current grace period.
- * This call shouldn't be wrapped inside an RCU critical
- * section.
+ * a stopped tick PREEMPT_RCU or PREEMPT_LAZY have no way to
+ * account for QSs. This will eventually cause unwarranted
+ * noise as RCU forces preemption as the means of ending the
+ * current grace period. We avoid this by calling
+ * rcu_momentary_eqs(), which performs a zero duration EQS
+ * allowing RCU to end the current grace period. This call
+ * shouldn't be wrapped inside an RCU critical section.
*
- * Note that in non PREEMPT_RCU kernels QSs are handled through
- * cond_resched()
+ * Normally QSs for other cases are handled through cond_resched().
+ * For simplicity, however, we call rcu_momentary_eqs() for all
+ * configurations here.
*/
- if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
- if (!disable_irq)
- local_irq_disable();
+ if (!disable_irq)
+ local_irq_disable();
- rcu_momentary_eqs();
+ rcu_momentary_eqs();
- if (!disable_irq)
- local_irq_enable();
- }
+ if (!disable_irq)
+ local_irq_enable();
/*
* For the non-preemptive kernel config: let threads runs, if
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 07/11] rcutorture: Update rcutorture_one_extend_check() for lazy preemption
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (5 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 06/11] osnoise: provide quiescent states Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 08/11] rcutorture: Update ->extendables check " Boqun Feng
` (4 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora,
kernel test robot, Joel Fernandes
From: "Paul E. McKenney" <paulmck@kernel.org>
The rcutorture_one_extend_check() function's last check assumes that
if cur_ops->readlock_nesting() returns greater than zero, either the
RCUTORTURE_RDR_RCU_1 or the RCUTORTURE_RDR_RCU_2 bit must be set, that
is, there must be at least one rcu_read_lock() in effect.
This works for preemptible RCU and for non-preemptible RCU running in
a non-preemptible kernel. But it fails for non-preemptible RCU running
in a preemptible kernel because then RCU's cur_ops->readlock_nesting()
function, which is rcu_torture_readlock_nesting(), will return
the PREEMPT_MASK mask bits from preempt_count(). The result will
be greater than zero if preemption is disabled, including by the
RCUTORTURE_RDR_PREEMPT and RCUTORTURE_RDR_SCHED bits.
This commit therefore adjusts this check to take into account the case
fo non-preemptible RCU running in a preemptible kernel.
[boqun: Fix the if condition and add comment]
Reported-by: kernel test robot <oliver.sang@intel.com>
Closes: https://lore.kernel.org/oe-lkp/202502171415.8ec87c87-lkp@intel.com
Co-developed-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
Co-developed-by: Joel Fernandes <joelagnelf@nvidia.com>
Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Tested-by: kernel test robot <oliver.sang@intel.com>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
kernel/rcu/rcutorture.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index d26fb1d33ed9..280bff706017 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1873,6 +1873,8 @@ static void rcu_torture_reader_do_mbchk(long myid, struct rcu_torture *rtp,
#define ROEC_ARGS "%s %s: Current %#x To add %#x To remove %#x preempt_count() %#x\n", __func__, s, curstate, new, old, preempt_count()
static void rcutorture_one_extend_check(char *s, int curstate, int new, int old, bool insoftirq)
{
+ int mask;
+
if (!IS_ENABLED(CONFIG_RCU_TORTURE_TEST_CHK_RDR_STATE))
return;
@@ -1902,8 +1904,16 @@ static void rcutorture_one_extend_check(char *s, int curstate, int new, int old,
WARN_ONCE(cur_ops->extendables &&
!(curstate & (RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED)) &&
(preempt_count() & PREEMPT_MASK), ROEC_ARGS);
- WARN_ONCE(cur_ops->readlock_nesting &&
- !(curstate & (RCUTORTURE_RDR_RCU_1 | RCUTORTURE_RDR_RCU_2)) &&
+
+ /*
+ * non-preemptible RCU in a preemptible kernel uses "preempt_count() &
+ * PREEMPT_MASK" as ->readlock_nesting().
+ */
+ mask = RCUTORTURE_RDR_RCU_1 | RCUTORTURE_RDR_RCU_2;
+ if (!IS_ENABLED(CONFIG_PREEMPT_RCU))
+ mask |= RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED;
+
+ WARN_ONCE(cur_ops->readlock_nesting && !(curstate & mask) &&
cur_ops->readlock_nesting() > 0, ROEC_ARGS);
}
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 08/11] rcutorture: Update ->extendables check for lazy preemption
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (6 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 07/11] rcutorture: Update rcutorture_one_extend_check() for lazy preemption Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 09/11] rcu: limit PREEMPT_RCU configurations Boqun Feng
` (3 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
The rcutorture_one_extend_check() function's second last check assumes
that "preempt_count() & PREEMPT_MASK" is non-zero only if
RCUTORTURE_RDR_PREEMPT or RCUTORTURE_RDR_SCHED bit is set.
This works for preemptible RCU and for non-preemptible RCU running in
a non-preemptible kernel. But it fails for non-preemptible RCU running
in a preemptible kernel because then rcu_read_lock() is just
preempt_disable(), which increases preempt count.
This commit therefore adjusts this check to take into account the case
fo non-preemptible RCU running in a preemptible kernel.
Reviewed-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
kernel/rcu/rcutorture.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 280bff706017..4cae119dece8 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1901,8 +1901,16 @@ static void rcutorture_one_extend_check(char *s, int curstate, int new, int old,
WARN_ONCE(cur_ops->extendables &&
!(curstate & (RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH)) &&
(preempt_count() & SOFTIRQ_MASK), ROEC_ARGS);
- WARN_ONCE(cur_ops->extendables &&
- !(curstate & (RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED)) &&
+
+ /*
+ * non-preemptible RCU in a preemptible kernel uses preempt_disable()
+ * as rcu_read_lock().
+ */
+ mask = RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED;
+ if (!IS_ENABLED(CONFIG_PREEMPT_RCU))
+ mask |= RCUTORTURE_RDR_RCU_1 | RCUTORTURE_RDR_RCU_2;
+
+ WARN_ONCE(cur_ops->extendables && !(curstate & mask) &&
(preempt_count() & PREEMPT_MASK), ROEC_ARGS);
/*
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 09/11] rcu: limit PREEMPT_RCU configurations
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (7 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 08/11] rcutorture: Update ->extendables check " Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 10/11] rcutorture: Make scenario TREE10 build CONFIG_PREEMPT_LAZY=y Boqun Feng
` (2 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: Ankur Arora <ankur.a.arora@oracle.com>
PREEMPT_LAZY can be enabled stand-alone or alongside PREEMPT_DYNAMIC
which allows for dynamic switching of preemption models.
The choice of PREEMPT_RCU or not, however, is fixed at compile time.
Given that PREEMPT_RCU makes some trade-offs to optimize for latency
as opposed to throughput, configurations with limited preemption
might prefer the stronger forward-progress guarantees of PREEMPT_RCU=n.
Accordingly, explicitly limit PREEMPT_RCU=y to the latency oriented
preemption models: PREEMPT, PREEMPT_RT, and the runtime configurable
model PREEMPT_DYNAMIC.
This means the throughput oriented models, PREEMPT_NONE,
PREEMPT_VOLUNTARY, and PREEMPT_LAZY will run with PREEMPT_RCU=n.
Cc: Paul E. McKenney <paulmck@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
kernel/rcu/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig
index e2206f3a070c..dd6251678e99 100644
--- a/kernel/rcu/Kconfig
+++ b/kernel/rcu/Kconfig
@@ -18,7 +18,7 @@ config TREE_RCU
config PREEMPT_RCU
bool
- default y if PREEMPTION
+ default y if (PREEMPT || PREEMPT_RT || PREEMPT_DYNAMIC)
select TREE_RCU
help
This option selects the RCU implementation that is
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 10/11] rcutorture: Make scenario TREE10 build CONFIG_PREEMPT_LAZY=y
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (8 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 09/11] rcu: limit PREEMPT_RCU configurations Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 11/11] rcutorture: Make scenario TREE07 " Boqun Feng
2025-02-27 23:33 ` [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Ankur Arora
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: "Paul E. McKenney" <paulmck@kernel.org>
This commit tests lazy preemption by causing the TREE10 rcutorture
scenario to build its kernel with CONFIG_PREEMPT_LAZY=y.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
tools/testing/selftests/rcutorture/configs/rcu/TREE10 | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE10 b/tools/testing/selftests/rcutorture/configs/rcu/TREE10
index 759ee51d3ddc..420632b030dc 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TREE10
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE10
@@ -1,6 +1,7 @@
CONFIG_SMP=y
CONFIG_NR_CPUS=74
-CONFIG_PREEMPT_NONE=y
+CONFIG_PREEMPT_NONE=n
+CONFIG_PREEMPT_LAZY=y
CONFIG_PREEMPT_VOLUNTARY=n
CONFIG_PREEMPT=n
CONFIG_PREEMPT_DYNAMIC=n
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH rcu 11/11] rcutorture: Make scenario TREE07 build CONFIG_PREEMPT_LAZY=y
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (9 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 10/11] rcutorture: Make scenario TREE10 build CONFIG_PREEMPT_LAZY=y Boqun Feng
@ 2025-02-25 3:55 ` Boqun Feng
2025-02-27 23:33 ` [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Ankur Arora
11 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-02-25 3:55 UTC (permalink / raw)
To: rcu
Cc: Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Boqun Feng, Uladzislau Rezki,
Steven Rostedt, Mathieu Desnoyers, Lai Jiangshan, Zqiang,
Davidlohr Bueso, Ingo Molnar, Peter Zijlstra, Juri Lelli,
Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
Valentin Schneider, Masami Hiramatsu, Shuah Khan,
Sebastian Andrzej Siewior, Clark Williams, linux-kernel,
linux-trace-kernel, linux-kselftest, linux-rt-devel, Ankur Arora
From: "Paul E. McKenney" <paulmck@kernel.org>
This commit tests lazy preemption by causing the TREE07 rcutorture
scenario to build its kernel with CONFIG_PREEMPT_LAZY=y.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
tools/testing/selftests/rcutorture/configs/rcu/TREE07 | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE07 b/tools/testing/selftests/rcutorture/configs/rcu/TREE07
index d30922d8c883..352393bc5c56 100644
--- a/tools/testing/selftests/rcutorture/configs/rcu/TREE07
+++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE07
@@ -1,7 +1,8 @@
CONFIG_SMP=y
CONFIG_NR_CPUS=16
-CONFIG_PREEMPT_NONE=y
+CONFIG_PREEMPT_NONE=n
CONFIG_PREEMPT_VOLUNTARY=n
+CONFIG_PREEMPT_LAZY=y
CONFIG_PREEMPT=n
CONFIG_PREEMPT_DYNAMIC=n
#CHECK#CONFIG_TREE_RCU=y
--
2.39.5 (Apple Git-154)
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH rcu 00/11] Lazy Preempt changes for v6.15
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
` (10 preceding siblings ...)
2025-02-25 3:55 ` [PATCH rcu 11/11] rcutorture: Make scenario TREE07 " Boqun Feng
@ 2025-02-27 23:33 ` Ankur Arora
2025-02-27 23:47 ` Paul E. McKenney
11 siblings, 1 reply; 16+ messages in thread
From: Ankur Arora @ 2025-02-27 23:33 UTC (permalink / raw)
To: Boqun Feng
Cc: rcu, Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Uladzislau Rezki, Steven Rostedt,
Mathieu Desnoyers, Lai Jiangshan, Zqiang, Davidlohr Bueso,
Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Ben Segall, Mel Gorman, Valentin Schneider,
Masami Hiramatsu, Shuah Khan, Sebastian Andrzej Siewior,
Clark Williams, linux-kernel, linux-trace-kernel, linux-kselftest,
linux-rt-devel, Ankur Arora
Boqun Feng <boqun.feng@gmail.com> writes:
> Hi,
>
> Please find the upcoming changes for CONFIG_PREEMPT_LAZY in RCU. The
> changes can also be found at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/rcu/linux.git lazypreempt.2025.02.24a
>
> Paul & Ankur, I put patch #7 and #8 (bug fixes in rcutorture) before
> patch #9 (which is the one that enables non-preemptible RCU in
> preemptible kernel), because I want to avoid introduce a bug in-between
> a series, appreciate it if you can double check on this. Thanks!
Makes sense to me.
--
ankur
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH rcu 00/11] Lazy Preempt changes for v6.15
2025-02-27 23:33 ` [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Ankur Arora
@ 2025-02-27 23:47 ` Paul E. McKenney
0 siblings, 0 replies; 16+ messages in thread
From: Paul E. McKenney @ 2025-02-27 23:47 UTC (permalink / raw)
To: Ankur Arora
Cc: Boqun Feng, rcu, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Uladzislau Rezki, Steven Rostedt,
Mathieu Desnoyers, Lai Jiangshan, Zqiang, Davidlohr Bueso,
Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Ben Segall, Mel Gorman, Valentin Schneider,
Masami Hiramatsu, Shuah Khan, Sebastian Andrzej Siewior,
Clark Williams, linux-kernel, linux-trace-kernel, linux-kselftest,
linux-rt-devel
On Thu, Feb 27, 2025 at 03:33:04PM -0800, Ankur Arora wrote:
>
> Boqun Feng <boqun.feng@gmail.com> writes:
>
> > Hi,
> >
> > Please find the upcoming changes for CONFIG_PREEMPT_LAZY in RCU. The
> > changes can also be found at:
> >
> > git://git.kernel.org/pub/scm/linux/kernel/git/rcu/linux.git lazypreempt.2025.02.24a
> >
> > Paul & Ankur, I put patch #7 and #8 (bug fixes in rcutorture) before
> > patch #9 (which is the one that enables non-preemptible RCU in
> > preemptible kernel), because I want to avoid introduce a bug in-between
> > a series, appreciate it if you can double check on this. Thanks!
>
> Makes sense to me.
Looks good to me as well, and thank you for spotting this!
Thanx, Paul
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH rcu 06/11] osnoise: provide quiescent states
2025-02-25 3:55 ` [PATCH rcu 06/11] osnoise: provide quiescent states Boqun Feng
@ 2025-03-04 19:21 ` Steven Rostedt
2025-03-05 2:54 ` Boqun Feng
0 siblings, 1 reply; 16+ messages in thread
From: Steven Rostedt @ 2025-03-04 19:21 UTC (permalink / raw)
To: Boqun Feng
Cc: rcu, Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Uladzislau Rezki,
Mathieu Desnoyers, Lai Jiangshan, Zqiang, Davidlohr Bueso,
Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Ben Segall, Mel Gorman, Valentin Schneider,
Masami Hiramatsu, Shuah Khan, Sebastian Andrzej Siewior,
Clark Williams, linux-kernel, linux-trace-kernel, linux-kselftest,
linux-rt-devel, Ankur Arora
On Mon, 24 Feb 2025 19:55:11 -0800
Boqun Feng <boqun.feng@gmail.com> wrote:
> From: Ankur Arora <ankur.a.arora@oracle.com>
>
> To reduce RCU noise for nohz_full configurations, osnoise depends
> on cond_resched() providing quiescent states for PREEMPT_RCU=n
> configurations. For PREEMPT_RCU=y configurations -- where
> cond_resched() is a stub -- we do this by directly calling
> rcu_momentary_eqs().
>
> With (PREEMPT_LAZY=y, PREEMPT_DYNAMIC=n), however, we have a
> configuration with (PREEMPTION=y, PREEMPT_RCU=n) where neither
> of the above can help.
>
> Handle that by providing an explicit quiescent state here for all
> configurations.
>
> As mentioned above this is not needed for non-stubbed cond_resched(),
> but, providing a quiescent state here just pulls in one that a future
> cond_resched() would provide, so doesn't cause any extra work for
> this configuration.
>
> Cc: Paul E. McKenney <paulmck@kernel.org>
> Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
> Cc: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-- Steve
> Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org>
> Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
> Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
> ---
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH rcu 06/11] osnoise: provide quiescent states
2025-03-04 19:21 ` Steven Rostedt
@ 2025-03-05 2:54 ` Boqun Feng
0 siblings, 0 replies; 16+ messages in thread
From: Boqun Feng @ 2025-03-05 2:54 UTC (permalink / raw)
To: Steven Rostedt
Cc: rcu, Paul E. McKenney, Frederic Weisbecker, Neeraj Upadhyay,
Joel Fernandes, Josh Triplett, Uladzislau Rezki,
Mathieu Desnoyers, Lai Jiangshan, Zqiang, Davidlohr Bueso,
Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot,
Dietmar Eggemann, Ben Segall, Mel Gorman, Valentin Schneider,
Masami Hiramatsu, Shuah Khan, Sebastian Andrzej Siewior,
Clark Williams, linux-kernel, linux-trace-kernel, linux-kselftest,
linux-rt-devel, Ankur Arora
On Tue, Mar 04, 2025 at 02:21:27PM -0500, Steven Rostedt wrote:
> On Mon, 24 Feb 2025 19:55:11 -0800
> Boqun Feng <boqun.feng@gmail.com> wrote:
>
> > From: Ankur Arora <ankur.a.arora@oracle.com>
> >
> > To reduce RCU noise for nohz_full configurations, osnoise depends
> > on cond_resched() providing quiescent states for PREEMPT_RCU=n
> > configurations. For PREEMPT_RCU=y configurations -- where
> > cond_resched() is a stub -- we do this by directly calling
> > rcu_momentary_eqs().
> >
> > With (PREEMPT_LAZY=y, PREEMPT_DYNAMIC=n), however, we have a
> > configuration with (PREEMPTION=y, PREEMPT_RCU=n) where neither
> > of the above can help.
> >
> > Handle that by providing an explicit quiescent state here for all
> > configurations.
> >
> > As mentioned above this is not needed for non-stubbed cond_resched(),
> > but, providing a quiescent state here just pulls in one that a future
> > cond_resched() would provide, so doesn't cause any extra work for
> > this configuration.
> >
> > Cc: Paul E. McKenney <paulmck@kernel.org>
> > Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
> > Cc: Steven Rostedt <rostedt@goodmis.org>
>
> Acked-by: Steven Rostedt (Google) <rostedt@goodmis.org>
>
Applied, thanks!
Regards,
Boqun
> -- Steve
>
> > Suggested-by: Paul E. McKenney <paulmck@kernel.org>
> > Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org>
> > Signed-off-by: Ankur Arora <ankur.a.arora@oracle.com>
> > Reviewed-by: Frederic Weisbecker <frederic@kernel.org>
> > Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> > Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
> > ---
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-03-05 2:54 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-25 3:55 [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 01/11] rcu: fix header guard for rcu_all_qs() Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 02/11] rcu: rename PREEMPT_AUTO to PREEMPT_LAZY Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 03/11] sched: update __cond_resched comment about RCU quiescent states Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 04/11] rcu: handle unstable rdp in rcu_read_unlock_strict() Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 05/11] rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 06/11] osnoise: provide quiescent states Boqun Feng
2025-03-04 19:21 ` Steven Rostedt
2025-03-05 2:54 ` Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 07/11] rcutorture: Update rcutorture_one_extend_check() for lazy preemption Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 08/11] rcutorture: Update ->extendables check " Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 09/11] rcu: limit PREEMPT_RCU configurations Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 10/11] rcutorture: Make scenario TREE10 build CONFIG_PREEMPT_LAZY=y Boqun Feng
2025-02-25 3:55 ` [PATCH rcu 11/11] rcutorture: Make scenario TREE07 " Boqun Feng
2025-02-27 23:33 ` [PATCH rcu 00/11] Lazy Preempt changes for v6.15 Ankur Arora
2025-02-27 23:47 ` Paul E. McKenney
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).