--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * wrapper/barrier.h
+ *
+ * wrapper around asm/barrier.h.
+ *
+ * Copyright (C) 2020 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ */
+
+#ifndef _LTTNG_WRAPPER_BARRIER_H
+#define _LTTNG_WRAPPER_BARRIER_H
+
+#include <linux/version.h>
+#include <asm/barrier.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
+
+#define lttng_smp_store_release(x, v) smp_store_release(x, v)
+#define lttng_smp_load_acquire(x) smp_load_acquire(x)
+
+#else
+
+/*
+ * Acquire-release semantics act as a one-way permeable barrier when
+ * pairing a store with a release. Use a full memory barrier to emulate
+ * the acquire-release semantic with a stronger barrier on older
+ * kernels.
+ */
+
+#define lttng_smp_store_release(x, v) \
+ do { \
+ smp_mb(); \
+ ACCESS_ONCE(*(x)) = (v); \
+ } while (0)
+
+#define lttng_smp_load_acquire(x) \
+ ({ \
+ __typeof__(*(x)) ___ret; \
+ \
+ ___ret = ACCESS_ONCE(*(x)); \
+ smp_mb(); \
+ ___ret; \
+ })
+
+#endif
+
+#endif /* _LTTNG_WRAPPER_BARRIER_H */
#include <wrapper/poll.h>
#include <wrapper/file.h>
#include <wrapper/kref.h>
+#include <wrapper/barrier.h>
#include <lttng/string-utils.h>
#include <lttng/abi.h>
#include <lttng/abi-old.h>
* in record_error. Ensures the counter is created and the
* error_counter_len is set before they are used.
*/
- smp_store_release(&event_notifier_group->error_counter, counter);
+ lttng_smp_store_release(&event_notifier_group->error_counter, counter);
counter->file = counter_file;
counter->owner = event_notifier_group->file;
#include <lttng/events.h>
#include <lttng/msgpack.h>
#include <lttng/event-notifier-notification.h>
+#include <wrapper/barrier.h>
/*
* The capture buffer size needs to be below 1024 bytes to avoid the
int ret;
/*
- * smp_load_acquire paired with smp_store_release orders
+ * lttng_smp_load_acquire paired with lttng_smp_store_release orders
* creation of the error counter and setting error_counter_len
* before the error_counter is used.
*/
- error_counter = smp_load_acquire(&event_notifier_group->error_counter);
+ error_counter = lttng_smp_load_acquire(&event_notifier_group->error_counter);
/* This group may not have an error counter attached to it. */
if (!error_counter)
return;