Skip to content

Commit 1acce70

Browse files
committed
ringbuffer/selftest: Add basic selftest to test changing subbuf order
Add a self test that will write into the trace buffer with differ trace sub buffer order sizes. Link: https://lore.kernel.org/linux-trace-kernel/20231219185631.520496304@goodmis.org Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Tzvetomir Stoyanov <tz.stoyanov@gmail.com> Cc: Vincent Donnefort <vdonnefort@google.com> Cc: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
1 parent 7c3f480 commit 1acce70

1 file changed

Lines changed: 95 additions & 0 deletions

File tree

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: GPL-2.0
3+
# description: Change the ringbuffer sub-buffer order
4+
# requires: buffer_subbuf_order
5+
# flags: instance
6+
7+
get_buffer_data_size() {
8+
sed -ne 's/^.*data.*size:\([0-9][0-9]*\).*/\1/p' events/header_page
9+
}
10+
11+
get_buffer_data_offset() {
12+
sed -ne 's/^.*data.*offset:\([0-9][0-9]*\).*/\1/p' events/header_page
13+
}
14+
15+
get_event_header_size() {
16+
type_len=`sed -ne 's/^.*type_len.*:[^0-9]*\([0-9][0-9]*\).*/\1/p' events/header_event`
17+
time_len=`sed -ne 's/^.*time_delta.*:[^0-9]*\([0-9][0-9]*\).*/\1/p' events/header_event`
18+
array_len=`sed -ne 's/^.*array.*:[^0-9]*\([0-9][0-9]*\).*/\1/p' events/header_event`
19+
total_bits=$((type_len+time_len+array_len))
20+
total_bits=$((total_bits+7))
21+
echo $((total_bits/8))
22+
}
23+
24+
get_print_event_buf_offset() {
25+
sed -ne 's/^.*buf.*offset:\([0-9][0-9]*\).*/\1/p' events/ftrace/print/format
26+
}
27+
28+
event_header_size=`get_event_header_size`
29+
print_header_size=`get_print_event_buf_offset`
30+
31+
data_offset=`get_buffer_data_offset`
32+
33+
marker_meta=$((event_header_size+print_header_size))
34+
35+
make_str() {
36+
cnt=$1
37+
printf -- 'X%.0s' $(seq $cnt)
38+
}
39+
40+
write_buffer() {
41+
size=$1
42+
43+
str=`make_str $size`
44+
45+
# clear the buffer
46+
echo > trace
47+
48+
# write the string into the marker
49+
echo $str > trace_marker
50+
51+
echo $str
52+
}
53+
54+
test_buffer() {
55+
orde=$1
56+
page_size=$((4096<<order))
57+
58+
size=`get_buffer_data_size`
59+
60+
# the size must be greater than or equal to page_size - data_offset
61+
page_size=$((page_size-data_offset))
62+
if [ $size -lt $page_size ]; then
63+
exit fail
64+
fi
65+
66+
# Now add a little more the meta data overhead will overflow
67+
68+
str=`write_buffer $size`
69+
70+
# Make sure the line was broken
71+
new_str=`awk ' /tracing_mark_write:/ { sub(/^.*tracing_mark_write: /,"");printf "%s", $0; exit}' trace`
72+
73+
if [ "$new_str" = "$str" ]; then
74+
exit fail;
75+
fi
76+
77+
# Make sure the entire line can be found
78+
new_str=`awk ' /tracing_mark_write:/ { sub(/^.*tracing_mark_write: /,"");printf "%s", $0; }' trace`
79+
80+
if [ "$new_str" != "$str" ]; then
81+
exit fail;
82+
fi
83+
}
84+
85+
ORIG=`cat buffer_subbuf_order`
86+
87+
# Could test bigger orders than 3, but then creating the string
88+
# to write into the ring buffer takes too long
89+
for a in 0 1 2 3 ; do
90+
echo $a > buffer_subbuf_order
91+
test_buffer $a
92+
done
93+
94+
echo $ORIG > buffer_subbuf_order
95+

0 commit comments

Comments
 (0)