]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rcu/tasks: Mark callbacks not currently participating in barrier operation
authorPaul E. McKenney <paulmck@kernel.org>
Fri, 2 Aug 2024 00:34:24 +0000 (17:34 -0700)
committerNeeraj Upadhyay <neeraj.upadhyay@kernel.org>
Wed, 14 Aug 2024 11:19:56 +0000 (16:49 +0530)
Each Tasks RCU flavor keeps a count of the number of callbacks that the
current rcu_barrier_tasks*() is waiting on, but there is currently no
easy way to work out which callback is stuck.  One way to do this is to
mark idle RCU-barrier callbacks by making the ->next pointer point to
the callback itself, and this commit does just that.

Later commits will use this for debug output.

Signed-off-by: "Paul E. McKenney" <paulmck@kernel.org>
Signed-off-by: Neeraj Upadhyay <neeraj.upadhyay@kernel.org>
kernel/rcu/tasks.h

index 1270182806185a04d7753a48ac1c68d9d17c5fe3..d44abcd656d6cf123bfc3836029bddbab42f7204 100644 (file)
@@ -283,6 +283,7 @@ static void cblist_init_generic(struct rcu_tasks *rtp)
                        INIT_LIST_HEAD(&rtpcp->rtp_blkd_tasks);
                if (!rtpcp->rtp_exit_list.next)
                        INIT_LIST_HEAD(&rtpcp->rtp_exit_list);
+               rtpcp->barrier_q_head.next = &rtpcp->barrier_q_head;
                maxcpu = cpu;
        }
 
@@ -407,6 +408,7 @@ static void rcu_barrier_tasks_generic_cb(struct rcu_head *rhp)
        struct rcu_tasks *rtp;
        struct rcu_tasks_percpu *rtpcp;
 
+       rhp->next = rhp; // Mark the callback as having been invoked.
        rtpcp = container_of(rhp, struct rcu_tasks_percpu, barrier_q_head);
        rtp = rtpcp->rtpp;
        if (atomic_dec_and_test(&rtp->barrier_q_count))