summaryrefslogtreecommitdiff
path: root/tools/lib
diff options
context:
space:
mode:
authorBjörn Töpel <bjorn.topel@intel.com>2021-03-10 11:09:28 +0300
committerAndrii Nakryiko <andrii@kernel.org>2021-03-11 00:38:07 +0300
commit2882c48bf8f2fb9ec31cbb68be6b979da48f880d (patch)
treea24609c89cad61c8033009f57967c525d44461da /tools/lib
parenta9c80b03e586fd3819089fbd33c38fb65ad5e00c (diff)
downloadlinux-2882c48bf8f2fb9ec31cbb68be6b979da48f880d.tar.xz
libbpf: xsk: Remove linux/compiler.h header
In commit 291471dd1559 ("libbpf, xsk: Add libbpf_smp_store_release libbpf_smp_load_acquire") linux/compiler.h was added as a dependency to xsk.h, which is the user-facing API. This makes it harder for userspace application to consume the library. Here the header inclusion is removed, and instead {READ,WRITE}_ONCE() is added explicitly. Signed-off-by: Björn Töpel <bjorn.topel@intel.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20210310080929.641212-2-bjorn.topel@gmail.com
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/bpf/libbpf_util.h27
1 files changed, 17 insertions, 10 deletions
diff --git a/tools/lib/bpf/libbpf_util.h b/tools/lib/bpf/libbpf_util.h
index cfbcfc063c81..954da9b34a34 100644
--- a/tools/lib/bpf/libbpf_util.h
+++ b/tools/lib/bpf/libbpf_util.h
@@ -5,25 +5,30 @@
#define __LIBBPF_LIBBPF_UTIL_H
#include <stdbool.h>
-#include <linux/compiler.h>
#ifdef __cplusplus
extern "C" {
#endif
-/* Use these barrier functions instead of smp_[rw]mb() when they are
- * used in a libbpf header file. That way they can be built into the
- * application that uses libbpf.
+/* Load-Acquire Store-Release barriers used by the XDP socket
+ * library. The following macros should *NOT* be considered part of
+ * the xsk.h API, and is subject to change anytime.
+ *
+ * LIBRARY INTERNAL
*/
+
+#define __XSK_READ_ONCE(x) (*(volatile typeof(x) *)&x)
+#define __XSK_WRITE_ONCE(x, v) (*(volatile typeof(x) *)&x) = (v)
+
#if defined(__i386__) || defined(__x86_64__)
# define libbpf_smp_store_release(p, v) \
do { \
asm volatile("" : : : "memory"); \
- WRITE_ONCE(*p, v); \
+ __XSK_WRITE_ONCE(*p, v); \
} while (0)
# define libbpf_smp_load_acquire(p) \
({ \
- typeof(*p) ___p1 = READ_ONCE(*p); \
+ typeof(*p) ___p1 = __XSK_READ_ONCE(*p); \
asm volatile("" : : : "memory"); \
___p1; \
})
@@ -41,11 +46,11 @@ extern "C" {
# define libbpf_smp_store_release(p, v) \
do { \
asm volatile ("fence rw,w" : : : "memory"); \
- WRITE_ONCE(*p, v); \
+ __XSK_WRITE_ONCE(*p, v); \
} while (0)
# define libbpf_smp_load_acquire(p) \
({ \
- typeof(*p) ___p1 = READ_ONCE(*p); \
+ typeof(*p) ___p1 = __XSK_READ_ONCE(*p); \
asm volatile ("fence r,rw" : : : "memory"); \
___p1; \
})
@@ -55,19 +60,21 @@ extern "C" {
#define libbpf_smp_store_release(p, v) \
do { \
__sync_synchronize(); \
- WRITE_ONCE(*p, v); \
+ __XSK_WRITE_ONCE(*p, v); \
} while (0)
#endif
#ifndef libbpf_smp_load_acquire
#define libbpf_smp_load_acquire(p) \
({ \
- typeof(*p) ___p1 = READ_ONCE(*p); \
+ typeof(*p) ___p1 = __XSK_READ_ONCE(*p); \
__sync_synchronize(); \
___p1; \
})
#endif
+/* LIBRARY INTERNAL -- END */
+
#ifdef __cplusplus
} /* extern "C" */
#endif