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 <[email protected]>
---
 kernel/rcu/tasks.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index cf273c554f3b0..6f1e82e548bbc 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -281,6 +281,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;
        }
 
@@ -405,6 +406,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