From: "Paul E. McKenney" <paul...@kernel.org>

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" <paul...@kernel.org>
Signed-off-by: Neeraj Upadhyay <neeraj.upadh...@kernel.org>
---
 kernel/rcu/tasks.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index 127018280618..d44abcd656d6 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -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))
-- 
2.40.1


Reply via email to