mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.1 KiB
46 lines
1.1 KiB
#!/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 <[email protected]> |
|
|
|
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));
|
|
|