rcu: Diagnose extended sync_rcu_do_polled_gp() loops
authorPaul E. McKenney <paulmck@kernel.org>
Mon, 9 May 2022 16:49:05 +0000 (09:49 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 22 Jul 2022 00:41:56 +0000 (17:41 -0700)
This commit dumps out state when the sync_rcu_do_polled_gp() function
loops more than expected.  This is a debugging aid.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/tree_exp.h

index f05a15b..4c7037b 100644 (file)
@@ -970,6 +970,7 @@ EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);
 static void sync_rcu_do_polled_gp(struct work_struct *wp)
 {
        unsigned long flags;
+       int i = 0;
        struct rcu_node *rnp = container_of(wp, struct rcu_node, exp_poll_wq);
        unsigned long s;
 
@@ -979,8 +980,12 @@ static void sync_rcu_do_polled_gp(struct work_struct *wp)
        raw_spin_unlock_irqrestore(&rnp->exp_poll_lock, flags);
        if (s == RCU_GET_STATE_COMPLETED)
                return;
-       while (!poll_state_synchronize_rcu(s))
+       while (!poll_state_synchronize_rcu(s)) {
                synchronize_rcu_expedited();
+               if (i == 10 || i == 20)
+                       pr_info("%s: i = %d s = %lx gp_seq_polled = %lx\n", __func__, i, s, READ_ONCE(rcu_state.gp_seq_polled));
+               i++;
+       }
        raw_spin_lock_irqsave(&rnp->exp_poll_lock, flags);
        s = rnp->exp_seq_poll_rq;
        if (poll_state_synchronize_rcu(s))