1*e5bd61e8SPaul E. McKenney#!/usr/bin/env drgn 2*e5bd61e8SPaul E. McKenney# SPDX-License-Identifier: GPL-2.0+ 3*e5bd61e8SPaul E. McKenney# 4*e5bd61e8SPaul E. McKenney# Dump out the number of RCU callbacks outstanding. 5*e5bd61e8SPaul E. McKenney# 6*e5bd61e8SPaul E. McKenney# On older kernels having multiple flavors of RCU, this dumps out the 7*e5bd61e8SPaul E. McKenney# number of callbacks for the most heavily used flavor. 8*e5bd61e8SPaul E. McKenney# 9*e5bd61e8SPaul E. McKenney# Usage: sudo drgn rcu-cbs.py 10*e5bd61e8SPaul E. McKenney# 11*e5bd61e8SPaul E. McKenney# Copyright (C) 2021 Facebook, Inc. 12*e5bd61e8SPaul E. McKenney# 13*e5bd61e8SPaul E. McKenney# Authors: Paul E. McKenney <paulmck@kernel.org> 14*e5bd61e8SPaul E. McKenney 15*e5bd61e8SPaul E. McKenneyimport sys 16*e5bd61e8SPaul E. McKenneyimport drgn 17*e5bd61e8SPaul E. McKenneyfrom drgn import NULL, Object 18*e5bd61e8SPaul E. McKenneyfrom drgn.helpers.linux import * 19*e5bd61e8SPaul E. McKenney 20*e5bd61e8SPaul E. McKenneydef get_rdp0(prog): 21*e5bd61e8SPaul E. McKenney try: 22*e5bd61e8SPaul E. McKenney rdp0 = prog.variable('rcu_preempt_data', 'kernel/rcu/tree.c'); 23*e5bd61e8SPaul E. McKenney except LookupError: 24*e5bd61e8SPaul E. McKenney rdp0 = NULL; 25*e5bd61e8SPaul E. McKenney 26*e5bd61e8SPaul E. McKenney if rdp0 == NULL: 27*e5bd61e8SPaul E. McKenney try: 28*e5bd61e8SPaul E. McKenney rdp0 = prog.variable('rcu_sched_data', 29*e5bd61e8SPaul E. McKenney 'kernel/rcu/tree.c'); 30*e5bd61e8SPaul E. McKenney except LookupError: 31*e5bd61e8SPaul E. McKenney rdp0 = NULL; 32*e5bd61e8SPaul E. McKenney 33*e5bd61e8SPaul E. McKenney if rdp0 == NULL: 34*e5bd61e8SPaul E. McKenney rdp0 = prog.variable('rcu_data', 'kernel/rcu/tree.c'); 35*e5bd61e8SPaul E. McKenney return rdp0.address_of_(); 36*e5bd61e8SPaul E. McKenney 37*e5bd61e8SPaul E. McKenneyrdp0 = get_rdp0(prog); 38*e5bd61e8SPaul E. McKenney 39*e5bd61e8SPaul E. McKenney# Sum up RCU callbacks. 40*e5bd61e8SPaul E. McKenneysum = 0; 41*e5bd61e8SPaul E. McKenneyfor cpu in for_each_possible_cpu(prog): 42*e5bd61e8SPaul E. McKenney rdp = per_cpu_ptr(rdp0, cpu); 43*e5bd61e8SPaul E. McKenney len = rdp.cblist.len.value_(); 44*e5bd61e8SPaul E. McKenney # print("CPU " + str(cpu) + " RCU callbacks: " + str(len)); 45*e5bd61e8SPaul E. McKenney sum += len; 46*e5bd61e8SPaul E. McKenneyprint("Number of RCU callbacks in flight: " + str(sum)); 47