From: Mathieu Desnoyers Date: Wed, 9 Feb 2011 19:09:11 +0000 (-0500) Subject: Add getcpu error validation X-Git-Tag: v0.12~71 X-Git-Url: http://git.lttng.org/?p=ust.git;a=commitdiff_plain;h=8f09cb9340387a52b483752c5d2d6c36035b26bc Add getcpu error validation This check is important for the case where getcpu(2) is not implemented by the Kernel. So, the CPU 0 is the fallback. Reported-by: David Goulet Signed-off-by: Mathieu Desnoyers --- diff --git a/libust/tracer.h b/libust/tracer.h index 64996b2..2f489f6 100644 --- a/libust/tracer.h +++ b/libust/tracer.h @@ -343,21 +343,36 @@ static __inline__ void ltt_write_trace_header(struct ust_trace *trace, header->freq_scale = trace->freq_scale; } +#ifndef UST_VALGRIND + static __inline__ int ust_get_cpu(void) { -#ifndef UST_VALGRIND - return sched_getcpu(); -#else - /* Valgrind does not support the sched_getcpu() vsyscall. + int cpu; + + cpu = sched_getcpu(); + if (likely(cpu >= 0)) + return cpu; + /* + * If getcpu(2) is not implemented in the Kernel use CPU 0 as fallback. + */ + return 0; +} + +#else /* #else #ifndef UST_VALGRIND */ + +static __inline__ int ust_get_cpu(void) +{ + /* + * Valgrind does not support the sched_getcpu() vsyscall. * It causes it to detect a segfault in the program and stop it. * So if we want to check libust with valgrind, we have to refrain * from using this call. TODO: it would probably be better to return * other values too, to better test it. */ return 0; -#endif } +#endif /* #else #ifndef UST_VALGRIND */ /* * Size reserved for high priority events (interrupts, NMI, BH) at the end of a