X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libringbuffer%2Fgetcpu.h;h=7b009dc6cf38efefd67aece71a8308a66a351efb;hb=75026e9f596aa057bd3499a7be43a7fc8aa0b783;hp=190eae6c3d39bf131815e57b05c079c772ff103f;hpb=4327cb7d2c9f34fc8d01f8ed92e2a43de7ef14f6;p=lttng-ust.git diff --git a/libringbuffer/getcpu.h b/libringbuffer/getcpu.h index 190eae6c..7b009dc6 100644 --- a/libringbuffer/getcpu.h +++ b/libringbuffer/getcpu.h @@ -20,6 +20,13 @@ */ #include +#include +#include +#include + +void lttng_ust_getcpu_init(void); + +extern int (*lttng_get_cpu)(void); #ifdef LTTNG_UST_DEBUG_VALGRIND @@ -29,7 +36,7 @@ * migration, so it is only statistically accurate. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) { return 0; } @@ -41,33 +48,30 @@ int lttng_ust_get_cpu(void) */ #ifdef __linux__ -/* old uClibc versions didn't have sched_getcpu */ -#if defined(__UCLIBC__) && __UCLIBC_MAJOR__ == 0 && \ - (__UCLIBC_MINOR__ < 9 || \ - (__UCLIBC_MINOR__ == 9 && __UCLIBC_SUBLEVEL__ <= 32)) +#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 c; + return cpu; } -#else /* __UCLIBC__ */ +#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(void) +int lttng_ust_get_cpu_internal(void) { int cpu; @@ -76,7 +80,7 @@ int lttng_ust_get_cpu(void) return 0; return cpu; } -#endif /* __UCLIBC__ */ +#endif /* HAVE_SCHED_GETCPU */ #elif (defined(__FreeBSD__) || defined(__CYGWIN__)) @@ -85,7 +89,7 @@ int lttng_ust_get_cpu(void) * number 0, with the assocated performance degradation on SMP. */ static inline -int lttng_ust_get_cpu(void) +int lttng_ust_get_cpu_internal(void) { return 0; } @@ -96,4 +100,16 @@ int lttng_ust_get_cpu(void) #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 */