1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#!/bin/bash
#
# Copyright (C) 2016 Julien Desfossez <jdesfossez@efficios.com>
#
# SPDX-License-Identifier: GPL-2.0-only
#
TEST_DESC="Perf counters"
CURDIR=$(dirname $0)/
TESTDIR=$CURDIR/..
LTTNG_BIN="lttng"
SESSION_NAME="perf_counters"
NUM_TESTS=21
NR_ITER=1
NR_USEC_WAIT=1
TESTAPP_PATH="$TESTDIR/utils/testapp"
TESTAPP_NAME="gen-ust-events"
TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
# Empty if libpfm is installed, "#" otherwise
HAVE_LIBPFM="@LTTNG_TOOLS_BUILD_WITH_LIBPFM_TRUE@"
source $TESTDIR/utils/utils.sh
function enable_ust_lttng_event_per_chan()
{
sess_name="$1"
event_name="$2"
chan_name="$3"
$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-event "$event_name" -s $sess_name -c $chan_name -u >/dev/null 2>&1
ok $? "Enable event $event_name for session $sess_name in channel $chan_name"
}
function have_libpfm()
{
test -z $HAVE_LIBPFM
ok $? "Have libpfm installed"
}
function test_ust_raw()
{
local SESSION_NAME="ust_perf"
local CHAN_NAME="mychan"
local EVENT_NAME="tp:tptest"
local PMU="UNHALTED_REFERENCE_CYCLES"
local tests_to_skip=9
local ret
local TRACE_PATH
# Find the raw perf id of the event.
PERFID=$("$CURDIR/find_event" "$PMU")
ret=$?
if [ "$ret" -eq "0" ]; then
pass "Find PMU $PMU"
elif [ "$ret" -eq "1" ]; then
skip 0 "PMU event not found." $tests_to_skip
return
elif [ "$ret" -eq "2" ]; then
skip 0 "PMU event not actionable." $tests_to_skip
return
else
fail "find_event returned $ret."
return
fi
TRACE_PATH=$(mktemp --tmpdir -d "tmp.${FUNCNAME[0]}_trace_path.XXXXXX")
create_lttng_session_ok $SESSION_NAME $TRACE_PATH
enable_ust_lttng_channel_ok $SESSION_NAME $CHAN_NAME
enable_ust_lttng_event_per_chan $SESSION_NAME $EVENT_NAME $CHAN_NAME
add_context_ust_ok $SESSION_NAME $CHAN_NAME "perf:thread:raw:${PERFID}:test"
start_lttng_tracing_ok
$TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT >/dev/null 2>&1
stop_lttng_tracing_ok
destroy_lttng_session_ok $SESSION_NAME
validate_trace "perf_thread_raw_${PERFID}_test" $TRACE_PATH
rm -rf $TRACE_PATH
}
function test_kernel_raw()
{
local SESSION_NAME="kernel_perf"
local CHAN_NAME="mychan"
local EVENT_NAME="lttng_test_filter_event"
local PMU="UNHALTED_REFERENCE_CYCLES"
local PERFID=""
local tests_to_skip=9
local ret
local TRACE_PATH
# Find the raw perf id of the event.
PERFID=$("$CURDIR/find_event" "$PMU")
ret=$?
if [ "$ret" -eq "0" ]; then
pass "Find PMU $PMU"
elif [ "$ret" -eq "1" ]; then
skip 0 "PMU event not found." $tests_to_skip
return
elif [ "$ret" -eq "2" ]; then
skip 0 "PMU event not actionable." $tests_to_skip
return
else
fail "find_event returned $ret."
return
fi
TRACE_PATH=$(mktemp --tmpdir -d "tmp.${FUNCNAME[0]}_trace_path.XXXXXX")
create_lttng_session_ok $SESSION_NAME $TRACE_PATH
lttng_enable_kernel_channel_ok $SESSION_NAME $CHAN_NAME
enable_kernel_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHAN_NAME
add_context_kernel_ok $SESSION_NAME $CHAN_NAME "perf:cpu:raw:${PERFID}:test"
start_lttng_tracing_ok
echo -n 10 > /proc/lttng-test-filter-event
stop_lttng_tracing_ok
destroy_lttng_session_ok $SESSION_NAME
validate_trace "perf_cpu_raw_${PERFID}_test" $TRACE_PATH
rm -rf $TRACE_PATH
}
if [ "$(id -u)" == "0" ]; then
isroot=1
else
isroot=0
fi
# MUST set TESTDIR before calling those functions
plan_tests $NUM_TESTS
print_test_banner "$TEST_DESC"
start_lttng_sessiond
have_libpfm
test_ust_raw
skip $isroot "Root access is needed for kernel testing, skipping." 9 ||
{
modprobe lttng-test
test_kernel_raw
modprobe --remove lttng-test
}
stop_lttng_sessiond
|