blob: bf71368c31a4a54dd00d94bd6f560ff89e3c7668 [file]
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: BTF event with typecast and percpu access
# requires: dynamic_events "this_cpu_read(<fetcharg>)":README "[(structname[,field])]<argname>[->field[->field|.field...]]":README
# Check if the sample module is loaded
if ! lsmod | grep -q trace_events_sample; then
modprobe trace-events-sample || exit_unresolved
fi
echo 0 > events/enable
echo > dynamic_events
# The sample_timer_cb(struct timer_list *t) is called.
# We want to check (STRUCT,FIELD)VAR typecast and this_cpu_read() access.
# (foo_timer_data,timer)t converts t to struct foo_timer_data * using container_of.
# data->counter is a per-cpu pointer to int.
# this_cpu_read(data->counter) should give the value of the counter.
echo 'f:mysample/myevent sample_timer_cb name=(foo_timer_data,timer)t->name:string count=this_cpu_read((foo_timer_data,timer)t->counter)' >> dynamic_events
echo 1 > events/mysample/myevent/enable
echo 1 > events/sample-trace/foo_timer_fn/enable
sleep 2
echo 0 > events/mysample/myevent/enable
echo 0 > events/sample-trace/foo_timer_fn/enable
# Compare the values.
MATCH=0
while read line; do
if echo $line | grep -q "foo_timer_fn:"; then
NAME=`echo $line | sed 's/.*name=\([^ ]*\) .*/\1/'`
COUNT=`echo $line | sed 's/.*count=\([^ ]*\).*/\1/'`
if grep -q "myevent:.*name=\"${NAME}\" count=$COUNT" trace; then
MATCH=$((MATCH+1))
fi
fi
done < trace
if [ $MATCH -eq 0 ]; then
echo "No matching events found"
exit_fail
fi
# Clean up
echo 0 > events/mysample/myevent/enable
echo 0 > events/sample-trace/foo_timer_fn/enable
echo > dynamic_events
clear_trace