Commit f8ab3fad authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu-tasks: Mark ->trc_reader_special.b.need_qs data races



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.

Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent bdb0cca0
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -850,7 +850,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)
@@ -916,7 +916,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:
@@ -968,7 +968,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;
}
@@ -1103,7 +1103,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);
}