Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+95
+95
tools/testing/selftests/ftrace/test.d/00basic/ringbuffer_order.tc
··· 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 +