Back to home page

OSCL-LXR

 
 

    


0001 #!/usr/bin/env drgn
0002 # SPDX-License-Identifier: GPL-2.0+
0003 #
0004 # Dump out the number of RCU callbacks outstanding.
0005 #
0006 # On older kernels having multiple flavors of RCU, this dumps out the
0007 # number of callbacks for the most heavily used flavor.
0008 #
0009 # Usage: sudo drgn rcu-cbs.py
0010 #
0011 # Copyright (C) 2021 Facebook, Inc.
0012 #
0013 # Authors: Paul E. McKenney <paulmck@kernel.org>
0014 
0015 import sys
0016 import drgn
0017 from drgn import NULL, Object
0018 from drgn.helpers.linux import *
0019 
0020 def get_rdp0(prog):
0021     try:
0022         rdp0 = prog.variable('rcu_preempt_data', 'kernel/rcu/tree.c');
0023     except LookupError:
0024         rdp0 = NULL;
0025 
0026     if rdp0 == NULL:
0027         try:
0028             rdp0 = prog.variable('rcu_sched_data',
0029                          'kernel/rcu/tree.c');
0030         except LookupError:
0031             rdp0 = NULL;
0032 
0033     if rdp0 == NULL:
0034         rdp0 = prog.variable('rcu_data', 'kernel/rcu/tree.c');
0035     return rdp0.address_of_();
0036 
0037 rdp0 = get_rdp0(prog);
0038 
0039 # Sum up RCU callbacks.
0040 sum = 0;
0041 for cpu in for_each_possible_cpu(prog):
0042     rdp = per_cpu_ptr(rdp0, cpu);
0043     len = rdp.cblist.len.value_();
0044     # print("CPU " + str(cpu) + " RCU callbacks: " + str(len));
0045     sum += len;
0046 print("Number of RCU callbacks in flight: " + str(sum));