* [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning
@ 2023-07-15 0:47 Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 1/3] rcu-tasks: Mark ->trc_reader_nesting data races Joel Fernandes (Google)
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-15 0:47 UTC (permalink / raw)
To: stable; +Cc: Joel Fernandes (Google)
These patches required to prevent the following TRACE02 warning when running rcutorture.
I confirmed the patch fixes the following splat:
[ 765.941351] WARNING: CPU: 0 PID: 80 at kernel/rcu/tasks.h:895 trc_read_check_handler+0x61/0xe0
[ 765.949880] Modules linked in:
[ 765.953006] CPU: 0 PID: 80 Comm: rcu_torture_rea Not tainted 5.15.86-rc1+ #25
[ 765.959982] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1 04/01/2014
[ 765.967964] RIP: 0010:trc_read_check_handler+0x61/0xe0
[ 765.973050] Code: 01 00 89 c0 48 03 2c c5 80 f8 a5 ae c6 45 00 00 [..]
[ 765.991768] RSP: 0000:ffffa64ac0003fb0 EFLAGS: 00010047
[ 765.997042] RAX: ffffffffad4f8610 RBX: ffffa26b41bd3000 RCX: ffffa26b5f4ac8c0
[ 766.004418] RDX: 0000000000000000 RSI: ffffffffae978121 RDI: ffffa26b41bd3000
[ 766.011502] RBP: ffffa26b41bd6000 R08: ffffa26b41bd3000 R09: 0000000000000000
[ 766.018778] R10: 0000000000000000 R11: ffffa64ac0003ff8 R12: 0000000000000000
[ 766.025943] R13: ffffa26b5f4ac8c0 R14: 0000000000000000 R15: 0000000000000000
[ 766.034383] FS: 0000000000000000(0000) GS:ffffa26b5f400000(0000) knlGS:0000000000000000
[ 766.042925] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 766.048775] CR2: 0000000000000000 CR3: 0000000001924000 CR4: 00000000000006f0
[ 766.055991] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 766.063135] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[ 766.070711] Call Trace:
[ 766.073515] <IRQ>
[ 766.075807] flush_smp_call_function_queue+0xec/0x1a0
[ 766.081087] __sysvec_call_function_single+0x3e/0x1d0
[ 766.086466] sysvec_call_function_single+0x89/0xc0
[ 766.091431] </IRQ>
[ 766.093713] <TASK>
[ 766.095930] asm_sysvec_call_function_single+0x16/0x20
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH -stable v5.10 1/3] rcu-tasks: Mark ->trc_reader_nesting data races
2023-07-15 0:47 [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Joel Fernandes (Google)
@ 2023-07-15 0:47 ` Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 2/3] rcu-tasks: Mark ->trc_reader_special.b.need_qs " Joel Fernandes (Google)
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-15 0:47 UTC (permalink / raw)
To: stable; +Cc: Joel Fernandes (Google), Paul E . McKenney
From: "Paul E. McKenney" <paulmck@kernel.org>
[ Upstream commit bdb0cca0d11060fce8a8a44588ac1470c25d62bc ]
There are several ->trc_reader_nesting data races that are too
low-probability for KCSAN to notice, but which will happen sooner or
later. This commit therefore marks these accesses, and comments one
that cannot race.
Cc: <stable@vger.kernel.org> # 5.10.x
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
kernel/rcu/tasks.h | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index c66d47685b28..2b16a86163af 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -848,7 +848,7 @@ static void trc_read_check_handler(void *t_in)
// If the task is not in a read-side critical section, and
// if this is the last reader, awaken the grace-period kthread.
- if (likely(!t->trc_reader_nesting)) {
+ if (likely(!READ_ONCE(t->trc_reader_nesting))) {
if (WARN_ON_ONCE(atomic_dec_and_test(&trc_n_readers_need_end)))
wake_up(&trc_wait);
// Mark as checked after decrement to avoid false
@@ -857,7 +857,7 @@ static void trc_read_check_handler(void *t_in)
goto reset_ipi;
}
// If we are racing with an rcu_read_unlock_trace(), try again later.
- if (unlikely(t->trc_reader_nesting < 0)) {
+ if (unlikely(READ_ONCE(t->trc_reader_nesting) < 0)) {
if (WARN_ON_ONCE(atomic_dec_and_test(&trc_n_readers_need_end)))
wake_up(&trc_wait);
goto reset_ipi;
@@ -904,6 +904,7 @@ static bool trc_inspect_reader(struct task_struct *t, void *arg)
n_heavy_reader_ofl_updates++;
in_qs = true;
} else {
+ // The task is not running, so C-language access is safe.
in_qs = likely(!t->trc_reader_nesting);
}
@@ -936,7 +937,7 @@ static void trc_wait_for_one_reader(struct task_struct *t,
// The current task had better be in a quiescent state.
if (t == current) {
t->trc_reader_checked = true;
- WARN_ON_ONCE(t->trc_reader_nesting);
+ WARN_ON_ONCE(READ_ONCE(t->trc_reader_nesting));
return;
}
@@ -1046,7 +1047,7 @@ static void show_stalled_task_trace(struct task_struct *t, bool *firstreport)
".I"[READ_ONCE(t->trc_ipi_to_cpu) > 0],
".i"[is_idle_task(t)],
".N"[cpu > 0 && tick_nohz_full_cpu(cpu)],
- t->trc_reader_nesting,
+ READ_ONCE(t->trc_reader_nesting),
" N"[!!t->trc_reader_special.b.need_qs],
cpu);
sched_show_task(t);
@@ -1141,7 +1142,7 @@ static void rcu_tasks_trace_postgp(struct rcu_tasks *rtp)
static void exit_tasks_rcu_finish_trace(struct task_struct *t)
{
WRITE_ONCE(t->trc_reader_checked, true);
- WARN_ON_ONCE(t->trc_reader_nesting);
+ WARN_ON_ONCE(READ_ONCE(t->trc_reader_nesting));
WRITE_ONCE(t->trc_reader_nesting, 0);
if (WARN_ON_ONCE(READ_ONCE(t->trc_reader_special.b.need_qs)))
rcu_read_unlock_trace_special(t, 0);
--
2.41.0.255.g8b1d071c50-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH -stable v5.10 2/3] rcu-tasks: Mark ->trc_reader_special.b.need_qs data races
2023-07-15 0:47 [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 1/3] rcu-tasks: Mark ->trc_reader_nesting data races Joel Fernandes (Google)
@ 2023-07-15 0:47 ` Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 3/3] rcu-tasks: Simplify trc_read_check_handler() atomic operations Joel Fernandes (Google)
2023-07-16 20:03 ` [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Greg KH
3 siblings, 0 replies; 5+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-15 0:47 UTC (permalink / raw)
To: stable; +Cc: Joel Fernandes (Google), Paul E . McKenney
From: "Paul E. McKenney" <paulmck@kernel.org>
[ Upstream commit f8ab3fad80dddf3f2cecb53983063c4431058ca1 ]
There are several ->trc_reader_special.b.need_qs data races that are
too low-probability for KCSAN to notice, but which will happen sooner
or later. This commit therefore marks these accesses.
Cc: <stable@vger.kernel.org> # 5.10.x
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
kernel/rcu/tasks.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index 2b16a86163af..aef2e96c3854 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -801,7 +801,7 @@ static DEFINE_IRQ_WORK(rcu_tasks_trace_iw, rcu_read_unlock_iw);
/* If we are the last reader, wake up the grace-period kthread. */
void rcu_read_unlock_trace_special(struct task_struct *t, int nesting)
{
- int nq = t->trc_reader_special.b.need_qs;
+ int nq = READ_ONCE(t->trc_reader_special.b.need_qs);
if (IS_ENABLED(CONFIG_TASKS_TRACE_RCU_READ_MB) &&
t->trc_reader_special.b.need_mb)
@@ -867,7 +867,7 @@ static void trc_read_check_handler(void *t_in)
// Get here if the task is in a read-side critical section. Set
// its state so that it will awaken the grace-period kthread upon
// exit from that critical section.
- WARN_ON_ONCE(t->trc_reader_special.b.need_qs);
+ WARN_ON_ONCE(READ_ONCE(t->trc_reader_special.b.need_qs));
WRITE_ONCE(t->trc_reader_special.b.need_qs, true);
reset_ipi:
@@ -919,7 +919,7 @@ static bool trc_inspect_reader(struct task_struct *t, void *arg)
// state so that it will awaken the grace-period kthread upon exit
// from that critical section.
atomic_inc(&trc_n_readers_need_end); // One more to wait on.
- WARN_ON_ONCE(t->trc_reader_special.b.need_qs);
+ WARN_ON_ONCE(READ_ONCE(t->trc_reader_special.b.need_qs));
WRITE_ONCE(t->trc_reader_special.b.need_qs, true);
return true;
}
@@ -1048,7 +1048,7 @@ static void show_stalled_task_trace(struct task_struct *t, bool *firstreport)
".i"[is_idle_task(t)],
".N"[cpu > 0 && tick_nohz_full_cpu(cpu)],
READ_ONCE(t->trc_reader_nesting),
- " N"[!!t->trc_reader_special.b.need_qs],
+ " N"[!!READ_ONCE(t->trc_reader_special.b.need_qs)],
cpu);
sched_show_task(t);
}
--
2.41.0.255.g8b1d071c50-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH -stable v5.10 3/3] rcu-tasks: Simplify trc_read_check_handler() atomic operations
2023-07-15 0:47 [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 1/3] rcu-tasks: Mark ->trc_reader_nesting data races Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 2/3] rcu-tasks: Mark ->trc_reader_special.b.need_qs " Joel Fernandes (Google)
@ 2023-07-15 0:47 ` Joel Fernandes (Google)
2023-07-16 20:03 ` [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Greg KH
3 siblings, 0 replies; 5+ messages in thread
From: Joel Fernandes (Google) @ 2023-07-15 0:47 UTC (permalink / raw)
To: stable; +Cc: Joel Fernandes (Google), Paul E . McKenney
From: "Paul E. McKenney" <paulmck@kernel.org>
[ Upstream commit 96017bf9039763a2e02dcc6adaa18592cd73a39d ]
Currently, trc_wait_for_one_reader() atomically increments
the trc_n_readers_need_end counter before sending the IPI
invoking trc_read_check_handler(). All failure paths out of
trc_read_check_handler() and also from the smp_call_function_single()
within trc_wait_for_one_reader() must carefully atomically decrement
this counter. This is more complex than it needs to be.
This commit therefore simplifies things and saves a few lines of
code by dispensing with the atomic decrements in favor of having
trc_read_check_handler() do the atomic increment only in the success case.
In theory, this represents no change in functionality.
Cc: <stable@vger.kernel.org> # 5.10.x
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
kernel/rcu/tasks.h | 20 +++-----------------
1 file changed, 3 insertions(+), 17 deletions(-)
diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index aef2e96c3854..23101ebbbe1e 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -841,32 +841,24 @@ static void trc_read_check_handler(void *t_in)
// If the task is no longer running on this CPU, leave.
if (unlikely(texp != t)) {
- if (WARN_ON_ONCE(atomic_dec_and_test(&trc_n_readers_need_end)))
- wake_up(&trc_wait);
goto reset_ipi; // Already on holdout list, so will check later.
}
// If the task is not in a read-side critical section, and
// if this is the last reader, awaken the grace-period kthread.
if (likely(!READ_ONCE(t->trc_reader_nesting))) {
- if (WARN_ON_ONCE(atomic_dec_and_test(&trc_n_readers_need_end)))
- wake_up(&trc_wait);
- // Mark as checked after decrement to avoid false
- // positives on the above WARN_ON_ONCE().
WRITE_ONCE(t->trc_reader_checked, true);
goto reset_ipi;
}
// If we are racing with an rcu_read_unlock_trace(), try again later.
- if (unlikely(READ_ONCE(t->trc_reader_nesting) < 0)) {
- if (WARN_ON_ONCE(atomic_dec_and_test(&trc_n_readers_need_end)))
- wake_up(&trc_wait);
+ if (unlikely(READ_ONCE(t->trc_reader_nesting) < 0))
goto reset_ipi;
- }
WRITE_ONCE(t->trc_reader_checked, true);
// Get here if the task is in a read-side critical section. Set
// its state so that it will awaken the grace-period kthread upon
// exit from that critical section.
+ atomic_inc(&trc_n_readers_need_end); // One more to wait on.
WARN_ON_ONCE(READ_ONCE(t->trc_reader_special.b.need_qs));
WRITE_ONCE(t->trc_reader_special.b.need_qs, true);
@@ -960,21 +952,15 @@ static void trc_wait_for_one_reader(struct task_struct *t,
if (per_cpu(trc_ipi_to_cpu, cpu) || t->trc_ipi_to_cpu >= 0)
return;
- atomic_inc(&trc_n_readers_need_end);
per_cpu(trc_ipi_to_cpu, cpu) = true;
t->trc_ipi_to_cpu = cpu;
rcu_tasks_trace.n_ipis++;
- if (smp_call_function_single(cpu,
- trc_read_check_handler, t, 0)) {
+ if (smp_call_function_single(cpu, trc_read_check_handler, t, 0)) {
// Just in case there is some other reason for
// failure than the target CPU being offline.
rcu_tasks_trace.n_ipis_fails++;
per_cpu(trc_ipi_to_cpu, cpu) = false;
t->trc_ipi_to_cpu = cpu;
- if (atomic_dec_and_test(&trc_n_readers_need_end)) {
- WARN_ON_ONCE(1);
- wake_up(&trc_wait);
- }
}
}
}
--
2.41.0.255.g8b1d071c50-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning
2023-07-15 0:47 [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Joel Fernandes (Google)
` (2 preceding siblings ...)
2023-07-15 0:47 ` [PATCH -stable v5.10 3/3] rcu-tasks: Simplify trc_read_check_handler() atomic operations Joel Fernandes (Google)
@ 2023-07-16 20:03 ` Greg KH
3 siblings, 0 replies; 5+ messages in thread
From: Greg KH @ 2023-07-16 20:03 UTC (permalink / raw)
To: Joel Fernandes (Google); +Cc: stable
On Sat, Jul 15, 2023 at 12:47:08AM +0000, Joel Fernandes (Google) wrote:
> These patches required to prevent the following TRACE02 warning when running rcutorture.
>
> I confirmed the patch fixes the following splat:
All now queued up, thanks.
greg k-h
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-07-16 20:58 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-15 0:47 [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 1/3] rcu-tasks: Mark ->trc_reader_nesting data races Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 2/3] rcu-tasks: Mark ->trc_reader_special.b.need_qs " Joel Fernandes (Google)
2023-07-15 0:47 ` [PATCH -stable v5.10 3/3] rcu-tasks: Simplify trc_read_check_handler() atomic operations Joel Fernandes (Google)
2023-07-16 20:03 ` [PATCH -stable v5.10 0/3] Fixes for rcutorture TRACE02 warning Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox