]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-6.1/rcu-tasks-repair-rcu-tasks-trace-quiescence-check.patch
Fixes for 6.1
[thirdparty/kernel/stable-queue.git] / queue-6.1 / rcu-tasks-repair-rcu-tasks-trace-quiescence-check.patch
1 From 5aca326b8ef12decce747927124008e1de957c4a Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Mon, 4 Dec 2023 09:33:29 -0800
4 Subject: rcu-tasks: Repair RCU Tasks Trace quiescence check
5
6 From: Paul E. McKenney <paulmck@kernel.org>
7
8 [ Upstream commit 2eb52fa8900e642b3b5054c4bf9776089d2a935f ]
9
10 The context-switch-time check for RCU Tasks Trace quiescence expects
11 current->trc_reader_special.b.need_qs to be zero, and if so, updates
12 it to TRC_NEED_QS_CHECKED. This is backwards, because if this value
13 is zero, there is no RCU Tasks Trace grace period in flight, an thus
14 no need for a quiescent state. Instead, when a grace period starts,
15 this field is set to TRC_NEED_QS.
16
17 This commit therefore changes the check from zero to TRC_NEED_QS.
18
19 Reported-by: Steven Rostedt <rostedt@goodmis.org>
20 Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
21 Tested-by: Steven Rostedt (Google) <rostedt@goodmis.org>
22 Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
23 Signed-off-by: Sasha Levin <sashal@kernel.org>
24 ---
25 include/linux/rcupdate.h | 4 ++--
26 1 file changed, 2 insertions(+), 2 deletions(-)
27
28 diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
29 index 319698087d66a..6858cae98da9e 100644
30 --- a/include/linux/rcupdate.h
31 +++ b/include/linux/rcupdate.h
32 @@ -205,9 +205,9 @@ void rcu_tasks_trace_qs_blkd(struct task_struct *t);
33 do { \
34 int ___rttq_nesting = READ_ONCE((t)->trc_reader_nesting); \
35 \
36 - if (likely(!READ_ONCE((t)->trc_reader_special.b.need_qs)) && \
37 + if (unlikely(READ_ONCE((t)->trc_reader_special.b.need_qs) == TRC_NEED_QS) && \
38 likely(!___rttq_nesting)) { \
39 - rcu_trc_cmpxchg_need_qs((t), 0, TRC_NEED_QS_CHECKED); \
40 + rcu_trc_cmpxchg_need_qs((t), TRC_NEED_QS, TRC_NEED_QS_CHECKED); \
41 } else if (___rttq_nesting && ___rttq_nesting != INT_MIN && \
42 !READ_ONCE((t)->trc_reader_special.b.blocked)) { \
43 rcu_tasks_trace_qs_blkd(t); \
44 --
45 2.43.0
46