| #!/usr/bin/env drgn | |
| # SPDX-License-Identifier: GPL-2.0+ | |
| # | |
| # Dump out the number of RCU callbacks outstanding. | |
| # | |
| # On older kernels having multiple flavors of RCU, this dumps out the | |
| # number of callbacks for the most heavily used flavor. | |
| # | |
| # Usage: sudo drgn rcu-cbs.py | |
| # | |
| # Copyright (C) 2021 Facebook, Inc. | |
| # | |
| # Authors: Paul E. McKenney <paulmck@kernel.org> | |
| import sys | |
| import drgn | |
| from drgn import NULL, Object | |
| from drgn.helpers.linux import * | |
| def get_rdp0(prog): | |
| try: | |
| rdp0 = prog.variable('rcu_preempt_data', 'kernel/rcu/tree.c'); | |
| except LookupError: | |
| rdp0 = NULL; | |
| if rdp0 == NULL: | |
| try: | |
| rdp0 = prog.variable('rcu_sched_data', | |
| 'kernel/rcu/tree.c'); | |
| except LookupError: | |
| rdp0 = NULL; | |
| if rdp0 == NULL: | |
| rdp0 = prog.variable('rcu_data', 'kernel/rcu/tree.c'); | |
| return rdp0.address_of_(); | |
| rdp0 = get_rdp0(prog); | |
| # Sum up RCU callbacks. | |
| sum = 0; | |
| for cpu in for_each_possible_cpu(prog): | |
| rdp = per_cpu_ptr(rdp0, cpu); | |
| len = rdp.cblist.len.value_(); | |
| # print("CPU " + str(cpu) + " RCU callbacks: " + str(len)); | |
| sum += len; | |
| print("Number of RCU callbacks in flight: " + str(sum)); |