X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libringbuffer%2Fgetcpu.h;h=7b009dc6cf38efefd67aece71a8308a66a351efb;hb=5de7c318804a7b1edce8562d4891b4c74aac0677;hp=104ba7601c6bc58598833d4e7acc9374e6262e4f;hpb=5ad63a1632792c8bc40fa5bc9f7f45f037a68032;p=lttng-ust.git diff --git a/libringbuffer/getcpu.h b/libringbuffer/getcpu.h index 104ba760..7b009dc6 100644 --- a/libringbuffer/getcpu.h +++ b/libringbuffer/getcpu.h @@ -20,9 +20,15 @@ */ #include -#include +#include +#include +#include + +void lttng_ust_getcpu_init(void); + +extern int (*lttng_get_cpu)(void); -#ifdef UST_VALGRIND +#ifdef LTTNG_UST_DEBUG_VALGRIND /* * Fallback on cpu 0 if liblttng-ust is build with Valgrind support. @@ -30,18 +36,42 @@ * migration, so it is only statistically accurate. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) { return 0; } #else +/* + * sched_getcpu. + */ +#ifdef __linux__ + +#if !HAVE_SCHED_GETCPU +#include +#define __getcpu(cpu, node, cache) syscall(__NR_getcpu, cpu, node, cache) /* * If getcpu is not implemented in the kernel, use cpu 0 as fallback. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) +{ + int cpu, ret; + + ret = __getcpu(&cpu, NULL, NULL); + if (caa_unlikely(ret < 0)) + return 0; + return cpu; +} +#else /* HAVE_SCHED_GETCPU */ +#include + +/* + * If getcpu is not implemented in the kernel, use cpu 0 as fallback. + */ +static inline +int lttng_ust_get_cpu_internal(void) { int cpu; @@ -50,7 +80,36 @@ int lttng_ust_get_cpu(void) return 0; return cpu; } +#endif /* HAVE_SCHED_GETCPU */ + +#elif (defined(__FreeBSD__) || defined(__CYGWIN__)) + +/* + * FreeBSD and Cygwin do not allow query of CPU ID. Always use CPU + * number 0, with the assocated performance degradation on SMP. + */ +static inline +int lttng_ust_get_cpu_internal(void) +{ + return 0; +} + +#else +#error "Please add support for your OS into liblttng-ust/compat.h." +#endif #endif +static inline +int lttng_ust_get_cpu(void) +{ + int (*getcpu)(void) = CMM_LOAD_SHARED(lttng_get_cpu); + + if (caa_likely(!getcpu)) { + return lttng_ust_get_cpu_internal(); + } else { + return getcpu(); + } +} + #endif /* _LTTNG_GETCPU_H */