| #!/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)); |