From 87f11582451733f9e37ccae470fca70e1e83a17c Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Fri, 31 Jan 2014 14:07:20 -0600 Subject: cyclictest: Fix tracemark output when the latency threshold is hit on ARM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit on ARM I'm seeing output like: cyclicte-623 0....... 19619418us+: tracing_mark_write: hit latency threshold (2000 > 2097) That's because of a format mismatch in tracemark("hit latency threshold (%d > %d)", diff, tracelimit); diff is a u64 and tracelimit an int. So on ARM the string is passed in r0, tracelimit in r1 and diff in r2+r3. vsnprintf used in tracemark only expects two ints passed and so only uses r1 and r2 yielding the permutation in the output. This patch also adds a gcc attribute to tracemark that helps catching similar bugs. In this case just adding the attribute but not touching the call site, would result in: src/cyclictest/cyclictest.c: In function ‘timerthread’: src/cyclictest/cyclictest.c:899:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘uint64_t’ [-Wformat] --- Hello after some chatting with Clark and John I dropped the c99 stuff and added the attribute annotation. Signed-off-by: Uwe Kleine-König Signed-off-by: Clark Williams --- src/cyclictest/cyclictest.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c index 686a635..c3fa60f 100644 --- a/src/cyclictest/cyclictest.c +++ b/src/cyclictest/cyclictest.c @@ -400,6 +400,7 @@ static int trace_file_exists(char *name) #define TRACEBUFSIZ 1024 static __thread char tracebuf[TRACEBUFSIZ]; +static void tracemark(char *fmt, ...) __attribute__((format(printf, 1, 2))); static void tracemark(char *fmt, ...) { va_list ap; @@ -895,7 +896,8 @@ void *timerthread(void *param) if (!stopped && tracelimit && (diff > tracelimit)) { stopped++; - tracemark("hit latency threshold (%d > %d)", diff, tracelimit); + tracemark("hit latency threshold (%llu > %d)", + (unsigned long long) diff, tracelimit); tracing(0); shutdown++; pthread_mutex_lock(&break_thread_id_lock); -- cgit 1.2.3-korg