xref: /openbmc/linux/tools/rcu/rcu-cbs.py (revision e5bd61e8)
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