X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fgetcpu.h;h=8785d4969212a36ced07ee20d2fc1bdaf2bb2391;hb=071dec4386ff4c89d8b0f92ab1a8dbf079abd50c;hp=190eae6c3d39bf131815e57b05c079c772ff103f;hpb=4327cb7d2c9f34fc8d01f8ed92e2a43de7ef14f6;p=lttng-ust.git diff --git a/libringbuffer/getcpu.h b/libringbuffer/getcpu.h index 190eae6c..8785d496 100644 --- a/libringbuffer/getcpu.h +++ b/libringbuffer/getcpu.h @@ -1,25 +1,23 @@ -#ifndef _LTTNG_GETCPU_H -#define _LTTNG_GETCPU_H - /* - * Copyright (c) 2011 - Mathieu Desnoyers + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; only - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (C) 2011 Mathieu Desnoyers */ +#ifndef _LTTNG_GETCPU_H +#define _LTTNG_GETCPU_H + #include +#include +#include + +#include "ust-helper.h" + +LTTNG_HIDDEN +void lttng_ust_getcpu_init(void); + +LTTNG_HIDDEN +extern int (*lttng_get_cpu)(void); #ifdef LTTNG_UST_DEBUG_VALGRIND @@ -29,7 +27,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 +39,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 +71,7 @@ int lttng_ust_get_cpu(void) return 0; return cpu; } -#endif /* __UCLIBC__ */ +#endif /* HAVE_SCHED_GETCPU */ #elif (defined(__FreeBSD__) || defined(__CYGWIN__)) @@ -85,7 +80,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 +91,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 */