162306a36Sopenharmony_ci#!/usr/bin/env drgn 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+ 362306a36Sopenharmony_ci# 462306a36Sopenharmony_ci# Dump out the number of RCU callbacks outstanding. 562306a36Sopenharmony_ci# 662306a36Sopenharmony_ci# On older kernels having multiple flavors of RCU, this dumps out the 762306a36Sopenharmony_ci# number of callbacks for the most heavily used flavor. 862306a36Sopenharmony_ci# 962306a36Sopenharmony_ci# Usage: sudo drgn rcu-cbs.py 1062306a36Sopenharmony_ci# 1162306a36Sopenharmony_ci# Copyright (C) 2021 Facebook, Inc. 1262306a36Sopenharmony_ci# 1362306a36Sopenharmony_ci# Authors: Paul E. McKenney <paulmck@kernel.org> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciimport sys 1662306a36Sopenharmony_ciimport drgn 1762306a36Sopenharmony_cifrom drgn import NULL, Object 1862306a36Sopenharmony_cifrom drgn.helpers.linux import * 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cidef get_rdp0(prog): 2162306a36Sopenharmony_ci try: 2262306a36Sopenharmony_ci rdp0 = prog.variable('rcu_preempt_data', 'kernel/rcu/tree.c'); 2362306a36Sopenharmony_ci except LookupError: 2462306a36Sopenharmony_ci rdp0 = NULL; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci if rdp0 == NULL: 2762306a36Sopenharmony_ci try: 2862306a36Sopenharmony_ci rdp0 = prog.variable('rcu_sched_data', 2962306a36Sopenharmony_ci 'kernel/rcu/tree.c'); 3062306a36Sopenharmony_ci except LookupError: 3162306a36Sopenharmony_ci rdp0 = NULL; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci if rdp0 == NULL: 3462306a36Sopenharmony_ci rdp0 = prog.variable('rcu_data', 'kernel/rcu/tree.c'); 3562306a36Sopenharmony_ci return rdp0.address_of_(); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cirdp0 = get_rdp0(prog); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci# Sum up RCU callbacks. 4062306a36Sopenharmony_cisum = 0; 4162306a36Sopenharmony_cifor cpu in for_each_possible_cpu(prog): 4262306a36Sopenharmony_ci rdp = per_cpu_ptr(rdp0, cpu); 4362306a36Sopenharmony_ci len = rdp.cblist.len.value_(); 4462306a36Sopenharmony_ci # print("CPU " + str(cpu) + " RCU callbacks: " + str(len)); 4562306a36Sopenharmony_ci sum += len; 4662306a36Sopenharmony_ciprint("Number of RCU callbacks in flight: " + str(sum)); 47