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