rcu-tasks: Mark RCU Tasks accesses to current->rcu_tasks_idle_cpu
authorPaul E. McKenney <paulmck@kernel.org>
Wed, 11 Oct 2023 16:45:54 +0000 (09:45 -0700)
committerNeeraj Upadhyay (AMD) <neeraj.iitr10@gmail.com>
Mon, 11 Dec 2023 20:52:47 +0000 (02:22 +0530)
The task_struct structure's ->rcu_tasks_idle_cpu can be concurrently
read and written from the RCU Tasks grace-period kthread and from the
CPU on which the task_struct structure's task is running.  This commit
therefore marks the accesses appropriately.

Reported-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Neeraj Upadhyay (AMD) <neeraj.iitr10@gmail.com>
kernel/rcu/tasks.h

index f54d5782eca0baf60cbb29af901de5019db63f3e..732ad5b39946a519bb0ba7a0de35537d4d19f38b 100644 (file)
@@ -975,7 +975,7 @@ static void check_holdout_task(struct task_struct *t,
            t->rcu_tasks_nvcsw != READ_ONCE(t->nvcsw) ||
            !rcu_tasks_is_holdout(t) ||
            (IS_ENABLED(CONFIG_NO_HZ_FULL) &&
-            !is_idle_task(t) && t->rcu_tasks_idle_cpu >= 0)) {
+            !is_idle_task(t) && READ_ONCE(t->rcu_tasks_idle_cpu) >= 0)) {
                WRITE_ONCE(t->rcu_tasks_holdout, false);
                list_del_init(&t->rcu_tasks_holdout_list);
                put_task_struct(t);
@@ -993,7 +993,7 @@ static void check_holdout_task(struct task_struct *t,
                 t, ".I"[is_idle_task(t)],
                 "N."[cpu < 0 || !tick_nohz_full_cpu(cpu)],
                 t->rcu_tasks_nvcsw, t->nvcsw, t->rcu_tasks_holdout,
-                t->rcu_tasks_idle_cpu, cpu);
+                data_race(t->rcu_tasks_idle_cpu), cpu);
        sched_show_task(t);
 }