ringbuffer/frontend.h \
ringbuffer/frontend_internal.h \
ringbuffer/frontend_types.h \
- ringbuffer/getcpu.h \
ringbuffer/nohz.h \
ringbuffer/rb-init.h \
ringbuffer/ring_buffer_backend.c \
#include <urcu/compiler.h>
#include <urcu/uatomic.h>
#include "common/bitmap.h"
-#include "common/ringbuffer/getcpu.h"
+#include "lib/lttng-ust/getcpu.h"
/*
* Using unsigned arithmetic because overflow is defined.
+++ /dev/null
-/*
- * SPDX-License-Identifier: LGPL-2.1-only
- *
- * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- */
-
-#ifndef _LTTNG_GETCPU_H
-#define _LTTNG_GETCPU_H
-
-#include <urcu/compiler.h>
-#include <urcu/system.h>
-#include <urcu/arch.h>
-
-void lttng_ust_getcpu_init(void)
- __attribute__((visibility("hidden")));
-
-extern int (*lttng_get_cpu)(void)
- __attribute__((visibility("hidden")));
-
-#ifdef LTTNG_UST_DEBUG_VALGRIND
-
-/*
- * Fallback on cpu 0 if liblttng-ust is build with Valgrind support.
- * get_cpu() returns the current CPU number. It may change due to
- * migration, so it is only statistically accurate.
- */
-static inline
-int lttng_ust_get_cpu_internal(void)
-{
- return 0;
-}
-
-#else
-
-/*
- * sched_getcpu.
- */
-#ifdef __linux__
-
-#if !HAVE_SCHED_GETCPU
-#include <sys/syscall.h>
-#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_internal(void)
-{
- int cpu, ret;
-
- ret = __getcpu(&cpu, NULL, NULL);
- if (caa_unlikely(ret < 0))
- return 0;
- return cpu;
-}
-#else /* HAVE_SCHED_GETCPU */
-#include <sched.h>
-
-/*
- * If getcpu is not implemented in the kernel, use cpu 0 as fallback.
- */
-static inline
-int lttng_ust_get_cpu_internal(void)
-{
- int cpu;
-
- cpu = sched_getcpu();
- if (caa_unlikely(cpu < 0))
- 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 */
#ifndef _LIBRINGBUFFER_SMP_H
#define _LIBRINGBUFFER_SMP_H
-#include "getcpu.h"
+#include "lib/lttng-ust/getcpu.h"
/*
* 4kB of per-cpu data available. Enough to hold the control structures,
lttng-counter-client.h \
lttng-counter-client-percpu-32-modular.c \
lttng-counter-client-percpu-64-modular.c \
- lttng-clock.c lttng-getcpu.c
+ lttng-clock.c \
+ getcpu.c getcpu.h
liblttng_ust_la_SOURCES =
--- /dev/null
+/*
+ * SPDX-License-Identifier: LGPL-2.1-only
+ *
+ * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ */
+
+#define _LGPL_SOURCE
+#include <error.h>
+#include <dlfcn.h>
+#include <stdlib.h>
+#include "common/logging.h"
+#include <urcu/system.h>
+#include <urcu/arch.h>
+
+#include "getenv.h"
+#include "lib/lttng-ust/getcpu.h"
+
+/* Function pointer to the current getcpu callback. */
+int (*lttng_ust_get_cpu_sym)(void);
+
+static
+void *getcpu_plugin_handle;
+
+/*
+ * Override the user provided getcpu implementation.
+ */
+int lttng_ust_getcpu_override(int (*getcpu)(void))
+{
+ CMM_STORE_SHARED(lttng_ust_get_cpu_sym, getcpu);
+ return 0;
+}
+
+/*
+ * Initialize the getcpu plugin if it's present.
+ */
+void lttng_ust_getcpu_plugin_init(void)
+{
+ const char *libname;
+ void (*getcpu_plugin_init)(void);
+
+ /* If a plugin is already loaded, do nothing. */
+ if (getcpu_plugin_handle)
+ return;
+
+ /*
+ * If the LTTNG_UST_GETCPU_PLUGIN environment variable is undefined, do
+ * nothing.
+ */
+ libname = lttng_ust_getenv("LTTNG_UST_GETCPU_PLUGIN");
+ if (!libname)
+ return;
+
+ /*
+ * Thy to dlopen the getcpu plugin shared object specified in
+ * LTTNG_UST_GETCPU_PLUGIN.
+ */
+ getcpu_plugin_handle = dlopen(libname, RTLD_NOW);
+ if (!getcpu_plugin_handle) {
+ PERROR("Cannot load LTTng UST getcpu override library %s",
+ libname);
+ return;
+ }
+ dlerror();
+
+ /* Locate the getcpu plugin init function in the shared object. */
+ getcpu_plugin_init = (void (*)(void)) dlsym(getcpu_plugin_handle,
+ "lttng_ust_getcpu_plugin_init");
+ if (!getcpu_plugin_init) {
+ PERROR("Cannot find LTTng UST getcpu override library %s initialization function lttng_ust_getcpu_plugin_init()",
+ libname);
+ return;
+ }
+
+ /* Run the user provided getcpu plugin init function. */
+ getcpu_plugin_init();
+}
--- /dev/null
+/*
+ * SPDX-License-Identifier: LGPL-2.1-only
+ *
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ */
+
+#ifndef _LTTNG_GETCPU_H
+#define _LTTNG_GETCPU_H
+
+#include <urcu/compiler.h>
+#include <urcu/system.h>
+#include <urcu/arch.h>
+
+#include <lttng/ust-getcpu.h>
+
+
+/*
+ * Initialize the getcpu plugin if it's present.
+ */
+void lttng_ust_getcpu_plugin_init(void)
+ __attribute__((visibility("hidden")));
+
+/*
+ * Function pointer to the user provided getcpu callback, can be set at library
+ * initialization by a dlopened plugin or at runtime by a user by calling
+ * lttng_ust_getcpu_override() from the public API.
+ */
+extern int (*lttng_ust_get_cpu_sym)(void)
+ __attribute__((visibility("hidden")));
+
+#ifdef LTTNG_UST_DEBUG_VALGRIND
+
+/*
+ * Fallback on cpu 0 if liblttng-ust is build with Valgrind support.
+ * get_cpu() returns the current CPU number. It may change due to
+ * migration, so it is only statistically accurate.
+ */
+static inline
+int lttng_ust_get_cpu_internal(void)
+{
+ return 0;
+}
+
+#else
+
+/*
+ * sched_getcpu.
+ */
+#ifdef __linux__
+
+#if !HAVE_SCHED_GETCPU
+#include <sys/syscall.h>
+#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_internal(void)
+{
+ int cpu, ret;
+
+ ret = __getcpu(&cpu, NULL, NULL);
+ if (caa_unlikely(ret < 0))
+ return 0;
+ return cpu;
+}
+#else /* HAVE_SCHED_GETCPU */
+#include <sched.h>
+
+/*
+ * If getcpu is not implemented in the kernel, use cpu 0 as fallback.
+ */
+static inline
+int lttng_ust_get_cpu_internal(void)
+{
+ int cpu;
+
+ cpu = sched_getcpu();
+ if (caa_unlikely(cpu < 0))
+ 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 (*lttng_ust_get_cpu_current)(void) = CMM_LOAD_SHARED(lttng_ust_get_cpu_sym);
+
+ /*
+ * Fallback to the internal getcpu implementation if no override was
+ * provided the user.
+ */
+ if (caa_likely(!lttng_ust_get_cpu_current)) {
+ return lttng_ust_get_cpu_internal();
+ } else {
+ return lttng_ust_get_cpu_current();
+ }
+}
+
+#endif /* _LTTNG_GETCPU_H */
#include <limits.h>
#include <lttng/ust-events.h>
#include <lttng/ust-tracer.h>
-#include "common/ringbuffer/getcpu.h"
+#include "lib/lttng-ust/getcpu.h"
#include <lttng/ringbuffer-context.h>
#include "context-internal.h"
+++ /dev/null
-/*
- * SPDX-License-Identifier: LGPL-2.1-only
- *
- * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- */
-
-#define _LGPL_SOURCE
-#include <error.h>
-#include <dlfcn.h>
-#include <stdlib.h>
-#include "common/logging.h"
-#include <lttng/ust-getcpu.h>
-#include <urcu/system.h>
-#include <urcu/arch.h>
-
-#include "getenv.h"
-#include "common/ringbuffer/getcpu.h"
-
-int (*lttng_get_cpu)(void);
-
-static
-void *getcpu_handle;
-
-int lttng_ust_getcpu_override(int (*getcpu)(void))
-{
- CMM_STORE_SHARED(lttng_get_cpu, getcpu);
- return 0;
-}
-
-void lttng_ust_getcpu_init(void)
-{
- const char *libname;
- void (*libinit)(void);
-
- if (getcpu_handle)
- return;
- libname = lttng_ust_getenv("LTTNG_UST_GETCPU_PLUGIN");
- if (!libname)
- return;
- getcpu_handle = dlopen(libname, RTLD_NOW);
- if (!getcpu_handle) {
- PERROR("Cannot load LTTng UST getcpu override library %s",
- libname);
- return;
- }
- dlerror();
- libinit = (void (*)(void)) dlsym(getcpu_handle,
- "lttng_ust_getcpu_plugin_init");
- if (!libinit) {
- PERROR("Cannot find LTTng UST getcpu override library %s initialization function lttng_ust_getcpu_plugin_init()",
- libname);
- return;
- }
- libinit();
-}
#include "common/ringbuffer/rb-init.h"
#include "lttng-ust-statedump.h"
#include "clock.h"
-#include "common/ringbuffer/getcpu.h"
+#include "lib/lttng-ust/getcpu.h"
#include "getenv.h"
#include "ust-events-internal.h"
#include "context-internal.h"
lttng_ust_tp_init();
lttng_ust_init_fd_tracker();
lttng_ust_clock_init();
- lttng_ust_getcpu_init();
+ lttng_ust_getcpu_plugin_init();
lttng_ust_statedump_init();
lttng_ust_ring_buffer_clients_init();
lttng_ust_counter_clients_init();