On ARM64 kernels with 64K pages, the trace_marker_raw test fails because
bash's printf builtin uses stdio buffering which splits output into
multiple small write() calls to the tracefs file. Since each individual
write is within TRACE_MARKER_MAX_SIZE (4096), they all succeed, causing
the "too big" write test to incorrectly pass.

Fix by piping make_str output through dd with iflag=fullblock to
guarantee a single atomic write() syscall to trace_marker_raw.

Fixes: 37f46601383a ("selftests/tracing: Add basic test for trace_marker_raw 
file")
Signed-off-by: Tianchen Ding <[email protected]>
---
 .../selftests/ftrace/test.d/00basic/trace_marker_raw.tc     | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/ftrace/test.d/00basic/trace_marker_raw.tc 
b/tools/testing/selftests/ftrace/test.d/00basic/trace_marker_raw.tc
index 8e905d4fe6dd..efd8263e6087 100644
--- a/tools/testing/selftests/ftrace/test.d/00basic/trace_marker_raw.tc
+++ b/tools/testing/selftests/ftrace/test.d/00basic/trace_marker_raw.tc
@@ -43,8 +43,10 @@ write_buffer() {
        id=$1
        size=$2
 
-       # write the string into the raw marker
-       make_str $id $size > trace_marker_raw
+       # Pipe through dd to ensure a single atomic write() syscall.
+       # Shell's printf builtin uses stdio buffering which may split the
+       # output into multiple writes.
+       make_str $id $size | dd of=trace_marker_raw bs=`expr $size + 4` 
iflag=fullblock
 }
 
 
-- 
2.39.3


Reply via email to