xref: /linux/tools/testing/selftests/ftrace/test.d/remotes/trace_pipe.tc (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
1*0a1b0325SVincent Donnefort#!/bin/sh
2*0a1b0325SVincent Donnefort# SPDX-License-Identifier: GPL-2.0
3*0a1b0325SVincent Donnefort# description: Test trace remote consuming read
4*0a1b0325SVincent Donnefort# requires: remotes/test
5*0a1b0325SVincent Donnefort
6*0a1b0325SVincent Donnefort. $TEST_DIR/remotes/functions
7*0a1b0325SVincent Donnefort
8*0a1b0325SVincent Donneforttest_trace_pipe()
9*0a1b0325SVincent Donnefort{
10*0a1b0325SVincent Donnefort    echo 0 > tracing_on
11*0a1b0325SVincent Donnefort    assert_unloaded
12*0a1b0325SVincent Donnefort
13*0a1b0325SVincent Donnefort    # Emit events from the same CPU
14*0a1b0325SVincent Donnefort    for cpu in $(get_cpu_ids); do
15*0a1b0325SVincent Donnefort        break
16*0a1b0325SVincent Donnefort    done
17*0a1b0325SVincent Donnefort
18*0a1b0325SVincent Donnefort    #
19*0a1b0325SVincent Donnefort    # Simple test: Emit enough events to fill few pages
20*0a1b0325SVincent Donnefort    #
21*0a1b0325SVincent Donnefort
22*0a1b0325SVincent Donnefort    echo 1024 > buffer_size_kb
23*0a1b0325SVincent Donnefort    echo 1 > tracing_on
24*0a1b0325SVincent Donnefort    assert_loaded
25*0a1b0325SVincent Donnefort
26*0a1b0325SVincent Donnefort    events_per_page=$(($(get_page_size) / $(get_selftest_event_size)))
27*0a1b0325SVincent Donnefort    nr_events=$(($events_per_page * 4))
28*0a1b0325SVincent Donnefort
29*0a1b0325SVincent Donnefort    output=$(mktemp $TMPDIR/remote_test.XXXXXX)
30*0a1b0325SVincent Donnefort
31*0a1b0325SVincent Donnefort    cat trace_pipe > $output &
32*0a1b0325SVincent Donnefort    pid=$!
33*0a1b0325SVincent Donnefort
34*0a1b0325SVincent Donnefort    for i in $(seq 1 $nr_events); do
35*0a1b0325SVincent Donnefort        taskset -c $cpu echo $i > write_event
36*0a1b0325SVincent Donnefort    done
37*0a1b0325SVincent Donnefort
38*0a1b0325SVincent Donnefort    echo 0 > tracing_on
39*0a1b0325SVincent Donnefort    sleep 1
40*0a1b0325SVincent Donnefort    kill $pid
41*0a1b0325SVincent Donnefort
42*0a1b0325SVincent Donnefort    check_trace 1 $nr_events $output
43*0a1b0325SVincent Donnefort
44*0a1b0325SVincent Donnefort    rm $output
45*0a1b0325SVincent Donnefort
46*0a1b0325SVincent Donnefort    #
47*0a1b0325SVincent Donnefort    # Test interaction with lost events
48*0a1b0325SVincent Donnefort    #
49*0a1b0325SVincent Donnefort
50*0a1b0325SVincent Donnefort    assert_unloaded
51*0a1b0325SVincent Donnefort    echo 7 > buffer_size_kb
52*0a1b0325SVincent Donnefort    echo 1 > tracing_on
53*0a1b0325SVincent Donnefort    assert_loaded
54*0a1b0325SVincent Donnefort
55*0a1b0325SVincent Donnefort    nr_events=$((events_per_page * 2))
56*0a1b0325SVincent Donnefort    for i in $(seq 1 $nr_events); do
57*0a1b0325SVincent Donnefort        taskset -c $cpu echo $i > write_event
58*0a1b0325SVincent Donnefort    done
59*0a1b0325SVincent Donnefort
60*0a1b0325SVincent Donnefort    output=$(dump_trace_pipe)
61*0a1b0325SVincent Donnefort
62*0a1b0325SVincent Donnefort    lost_events=$(sed -n -e '1s/CPU:.*\[LOST \([0-9]*\) EVENTS\]/\1/p' $output)
63*0a1b0325SVincent Donnefort    test -n "$lost_events"
64*0a1b0325SVincent Donnefort
65*0a1b0325SVincent Donnefort    id=$(sed -n -e '2s/\[[0-9]*\]\s*[0-9]*.[0-9]*: [a-z]* id=\([0-9]*\)/\1/p' $output)
66*0a1b0325SVincent Donnefort    test "$id" -eq $(($lost_events + 1))
67*0a1b0325SVincent Donnefort
68*0a1b0325SVincent Donnefort    # Drop [LOST EVENTS] line
69*0a1b0325SVincent Donnefort    sed -i '1d' $output
70*0a1b0325SVincent Donnefort
71*0a1b0325SVincent Donnefort    check_trace $id $nr_events $output
72*0a1b0325SVincent Donnefort
73*0a1b0325SVincent Donnefort    rm $output
74*0a1b0325SVincent Donnefort
75*0a1b0325SVincent Donnefort    #
76*0a1b0325SVincent Donnefort    # Test per-CPU interface
77*0a1b0325SVincent Donnefort    #
78*0a1b0325SVincent Donnefort
79*0a1b0325SVincent Donnefort    echo 0 > trace
80*0a1b0325SVincent Donnefort    echo 1 > tracing_on
81*0a1b0325SVincent Donnefort
82*0a1b0325SVincent Donnefort    for cpu in $(get_cpu_ids); do
83*0a1b0325SVincent Donnefort        taskset -c $cpu echo $cpu > write_event
84*0a1b0325SVincent Donnefort    done
85*0a1b0325SVincent Donnefort
86*0a1b0325SVincent Donnefort    for cpu in $(get_cpu_ids); do
87*0a1b0325SVincent Donnefort        cd per_cpu/cpu$cpu/
88*0a1b0325SVincent Donnefort        output=$(dump_trace_pipe)
89*0a1b0325SVincent Donnefort
90*0a1b0325SVincent Donnefort        check_trace $cpu $cpu $output
91*0a1b0325SVincent Donnefort
92*0a1b0325SVincent Donnefort        rm $output
93*0a1b0325SVincent Donnefort        cd - > /dev/null
94*0a1b0325SVincent Donnefort    done
95*0a1b0325SVincent Donnefort}
96*0a1b0325SVincent Donnefort
97*0a1b0325SVincent Donnefortif [ -z "$SOURCE_REMOTE_TEST" ]; then
98*0a1b0325SVincent Donnefort    set -e
99*0a1b0325SVincent Donnefort
100*0a1b0325SVincent Donnefort    setup_remote_test
101*0a1b0325SVincent Donnefort    test_trace_pipe
102*0a1b0325SVincent Donnefortfi
103