rcu: Add callbacks-invoked counters
authorPaul E. McKenney <paulmck@kernel.org>
Fri, 1 May 2020 23:49:48 +0000 (16:49 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 29 Jun 2020 18:58:49 +0000 (11:58 -0700)
This commit adds a count of the callbacks invoked to the per-CPU rcu_data
structure.  This count is printed by the show_rcu_gp_kthreads() that
is invoked by rcutorture and the RCU CPU stall-warning code.  It is also
intended for use by drgn.

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

index bef1dc9..874c831 100644 (file)
@@ -2443,6 +2443,7 @@ static void rcu_do_batch(struct rcu_data *rdp)
        local_irq_save(flags);
        rcu_nocb_lock(rdp);
        count = -rcl.len;
+       rdp->n_cbs_invoked += count;
        trace_rcu_batch_end(rcu_state.name, count, !!rcl.head, need_resched(),
                            is_idle_task(current), rcu_is_callbacks_kthread());
 
index 43991a4..9c6f734 100644 (file)
@@ -171,6 +171,7 @@ struct rcu_data {
                                        /* different grace periods. */
        long            qlen_last_fqs_check;
                                        /* qlen at last check for QS forcing */
+       unsigned long   n_cbs_invoked;  /* # callbacks invoked since boot. */
        unsigned long   n_force_qs_snap;
                                        /* did other CPU force QS recently? */
        long            blimit;         /* Upper limit on a processed batch */
index 54a6dba..2768ce6 100644 (file)
@@ -649,6 +649,7 @@ static void check_cpu_stall(struct rcu_data *rdp)
  */
 void show_rcu_gp_kthreads(void)
 {
+       unsigned long cbs = 0;
        int cpu;
        unsigned long j;
        unsigned long ja;
@@ -690,9 +691,11 @@ void show_rcu_gp_kthreads(void)
        }
        for_each_possible_cpu(cpu) {
                rdp = per_cpu_ptr(&rcu_data, cpu);
+               cbs += data_race(rdp->n_cbs_invoked);
                if (rcu_segcblist_is_offloaded(&rdp->cblist))
                        show_rcu_nocb_state(rdp);
        }
+       pr_info("RCU callbacks invoked since boot: %lu\n", cbs);
        show_rcu_tasks_gp_kthreads();
 }
 EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads);