1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0+ 3# 4# Run bpftrace to obtain a histogram of the types of primitives used to 5# initiate RCU grace periods. The count associated with rcu_gp_init() 6# is the number of normal (non-expedited) grace periods. 7# 8# Usage: rcu-updaters.sh [ duration-in-seconds ] 9# 10# Note that not all kernel builds have all of these functions. In those 11# that do not, this script will issue a diagnostic for each that is not 12# found, but continue normally for the rest of the functions. 13 14duration=${1} 15if test -n "${duration}" 16then 17 exitclause='interval:s:'"${duration}"' { exit(); }' 18else 19 echo 'Hit control-C to end sample and print results.' 20fi 21bpftrace -e 'kprobe:kvfree_call_rcu, 22 kprobe:call_rcu, 23 kprobe:call_rcu_tasks, 24 kprobe:call_rcu_tasks_trace, 25 kprobe:call_srcu, 26 kprobe:rcu_barrier, 27 kprobe:rcu_barrier_tasks, 28 kprobe:rcu_barrier_tasks_trace, 29 kprobe:srcu_barrier, 30 kprobe:synchronize_rcu, 31 kprobe:synchronize_rcu_expedited, 32 kprobe:synchronize_rcu_tasks, 33 kprobe:synchronize_rcu_tasks_rude, 34 kprobe:synchronize_rcu_tasks_trace, 35 kprobe:synchronize_srcu, 36 kprobe:synchronize_srcu_expedited, 37 kprobe:get_state_synchronize_rcu, 38 kprobe:get_state_synchronize_rcu_full, 39 kprobe:start_poll_synchronize_rcu, 40 kprobe:start_poll_synchronize_rcu_expedited, 41 kprobe:start_poll_synchronize_rcu_full, 42 kprobe:start_poll_synchronize_rcu_expedited_full, 43 kprobe:poll_state_synchronize_rcu, 44 kprobe:poll_state_synchronize_rcu_full, 45 kprobe:cond_synchronize_rcu, 46 kprobe:cond_synchronize_rcu_full, 47 kprobe:start_poll_synchronize_srcu, 48 kprobe:poll_state_synchronize_srcu, 49 kprobe:rcu_gp_init 50 { @counts[func] = count(); } '"${exitclause}" 51