From: Kunwu Chan <kunwu.chan@gmail.com>
To: paulmck@kernel.org, jiangshanlai@gmail.com, josh@joshtriplett.org
Cc: rostedt@goodmis.org, mathieu.desnoyers@efficios.com,
rcu@vger.kernel.org, linux-kernel@vger.kernel.org,
Kunwu Chan <kunwu.chan@gmail.com>
Subject: [PATCH 13/13] srcu: Restrict atomic-SRCU non_block annotation to task context
Date: Mon, 7 Sep 2026 15:58:29 +0800 [thread overview]
Message-ID: <20260907075829.2073224-14-kunwu.chan@linux.dev> (raw)
In-Reply-To: <20260907075829.2073224-1-kunwu.chan@linux.dev>
From: Kunwu Chan <kunwu.chan@gmail.com>
srcu_read_lock_atomic() and srcu_read_unlock_atomic() arm and disarm
might_sleep() checks via non_block_start()/non_block_end(), skipping
hardirq so the update does not land on the interrupted task's
->non_block_count.
Inline softirqs run on the interrupted task's stack as well, so a
timer callback running atomic-SRCU readers races with the interrupted
task's own ->non_block_count updates, as KCSAN reports:
BUG: KCSAN: data-race in srcu_torture_read_lock / srcu_torture_read_unlock
write to 0xffffa00f818ea418 of 4 bytes by interrupt on cpu 0:
srcu_torture_read_lock+0x422/0x470
rcutorture_one_extend+0xdc/0x600
rcu_torture_one_read+0xd1/0x330
rcu_torture_timer+0x75/0x140
call_timer_fn+0xe6/0x2f0
...
run_timer_softirq+0xb7/0x130
handle_softirqs+0xfc/0x3f0
__irq_exit_rcu+0x8e/0x100
Use in_task() so the annotation is applied only in task context; it
is redundant elsewhere because might_sleep() already warns about
sleeping from atomic context.
Signed-off-by: Kunwu Chan <kunwu.chan@gmail.com>
---
include/linux/srcu.h | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/include/linux/srcu.h b/include/linux/srcu.h
index 0de21155abc1..403fbe57ab15 100644
--- a/include/linux/srcu.h
+++ b/include/linux/srcu.h
@@ -346,11 +346,13 @@ static inline int srcu_read_lock_atomic(struct srcu_struct *ssp)
/*
* Arm might_sleep() to catch even a *potentially* sleeping call
* in the section, not just an actual schedule: the atomic-domain
- * promise must hold on every path, contended or not. In hardirq
- * the annotation would land on the interrupted task; it is also
+ * promise must hold on every path, contended or not. In hardirq,
+ * softirq, or NMI the annotation would land on the interrupted
+ * task, and can also result in data races against that task's
+ * own non_block_start()/non_block_end() invocations; it is also
* redundant there, so skip it.
*/
- if (!in_hardirq())
+ if (in_task())
non_block_start();
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_ATOMIC);
retval = __srcu_read_lock(ssp);
@@ -562,7 +564,7 @@ static inline void srcu_read_unlock_atomic(struct srcu_struct *ssp, int idx)
srcu_check_read_flavor(ssp, SRCU_READ_FLAVOR_ATOMIC);
srcu_lock_release(&ssp->dep_map);
__srcu_read_unlock(ssp, idx);
- if (!in_hardirq())
+ if (in_task())
non_block_end();
preempt_enable();
}
--
2.43.0
next prev parent reply other threads:[~2026-09-07 7:59 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-07 7:58 [PATCH 00/13] srcu: Round out atomic SRCU support Kunwu Chan
2026-09-07 7:58 ` [PATCH 01/13] litmus: Add SRCU fastpath anchor-before-scan test Kunwu Chan
2026-09-08 23:58 ` Paul E. McKenney
2026-09-09 3:02 ` Kunwu Chan
2026-09-07 7:58 ` [PATCH 02/13] litmus: Add SRCU fastpath scan-before-anchor test Kunwu Chan
2026-09-07 7:58 ` [PATCH 03/13] srcutree: Add reader-free fastpath to synchronize_srcu_atomic() Kunwu Chan
2026-09-08 20:29 ` Paul E. McKenney
2026-09-08 21:13 ` David Woodhouse
2026-09-08 21:54 ` Paul E. McKenney
2026-09-08 22:09 ` David Woodhouse
2026-09-08 22:55 ` Paul E. McKenney
2026-09-08 22:26 ` David Woodhouse
2026-09-08 22:53 ` Paul E. McKenney
2026-09-08 22:56 ` David Woodhouse
2026-09-08 23:34 ` Paul E. McKenney
2026-09-09 3:35 ` Kunwu Chan
2026-09-07 7:58 ` [PATCH 04/13] rcutorture: Add atomic-SRCU support to torture.sh Kunwu Chan
2026-09-08 23:34 ` Paul E. McKenney
2026-09-09 22:35 ` Paul E. McKenney
2026-09-10 1:30 ` KunWu Chan
2026-09-10 3:47 ` Paul E. McKenney
2026-09-10 4:31 ` KunWu Chan
2026-09-07 7:58 ` [PATCH 05/13] srcutree: Honor is_atomic in check_init_srcu_struct() Kunwu Chan
2026-09-08 20:27 ` Paul E. McKenney
2026-09-07 7:58 ` [PATCH 06/13] srcutree: Make init_srcu_struct_atomic() prevent transition to big Kunwu Chan
2026-09-08 23:36 ` Paul E. McKenney
2026-09-09 2:34 ` Kunwu Chan
2026-09-10 0:08 ` Paul E. McKenney
2026-09-07 7:58 ` [PATCH 07/13] srcutree: Don't transition atomic SRCU to big in srcu_gp_end() Kunwu Chan
2026-09-08 23:38 ` Paul E. McKenney
2026-09-09 2:45 ` Kunwu Chan
2026-09-10 0:13 ` Paul E. McKenney
2026-09-10 3:18 ` KunWu Chan
2026-09-10 3:46 ` Paul E. McKenney
2026-09-10 4:27 ` KunWu Chan
2026-09-07 7:58 ` [PATCH 08/13] srcutree: Forbid srcu_expedite_current() on atomic SRCU Kunwu Chan
2026-09-08 23:43 ` Paul E. McKenney
2026-09-07 7:58 ` [PATCH 09/13] rcutorture: Disable srcu_expedite_current() for " Kunwu Chan
2026-09-08 23:48 ` Paul E. McKenney
2026-09-07 7:58 ` [PATCH 10/13] srcutree: Skip callback scheduling for atomic SRCU grace periods Kunwu Chan
2026-09-09 0:01 ` Paul E. McKenney
2026-09-07 7:58 ` [PATCH 11/13] srcutree: Remove srcu_barrier() sleep for atomic SRCU Kunwu Chan
2026-09-09 0:05 ` Paul E. McKenney
2026-09-07 7:58 ` [PATCH 12/13] srcutree: Remove debug pr_alert()s Kunwu Chan
2026-09-09 0:06 ` Paul E. McKenney
2026-09-07 7:58 ` Kunwu Chan [this message]
2026-09-09 0:11 ` [PATCH 13/13] srcu: Restrict atomic-SRCU non_block annotation to task context Paul E. McKenney
2026-09-10 12:16 ` [PATCH 00/13] srcu: Round out atomic SRCU support Zqiang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260907075829.2073224-14-kunwu.chan@linux.dev \
--to=kunwu.chan@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=josh@joshtriplett.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=paulmck@kernel.org \
--cc=rcu@vger.kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.