mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-08 14:13:53 +00:00
libbpf: Provide barrier() and barrier_var() in bpf_helpers.h
Add barrier() and barrier_var() macros into bpf_helpers.h to be used by end users. While a bit advanced and specialized instruments, they are sometimes indispensable. Instead of requiring each user to figure out exact asm volatile incantations for themselves, provide them from bpf_helpers.h. Also remove conflicting definitions from selftests. Some tests rely on barrier_var() definition being nothing, those will still work as libbpf does the #ifndef/#endif guarding for barrier() and barrier_var(), allowing users to redefine them, if necessary. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20220509004148.1801791-8-andrii@kernel.org
This commit is contained in:
parent
785c3342cf
commit
f760d05379
@ -75,6 +75,30 @@
|
|||||||
})
|
})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compiler (optimization) barrier.
|
||||||
|
*/
|
||||||
|
#ifndef barrier
|
||||||
|
#define barrier() asm volatile("" ::: "memory")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Variable-specific compiler (optimization) barrier. It's a no-op which makes
|
||||||
|
* compiler believe that there is some black box modification of a given
|
||||||
|
* variable and thus prevents compiler from making extra assumption about its
|
||||||
|
* value and potential simplifications and optimizations on this variable.
|
||||||
|
*
|
||||||
|
* E.g., compiler might often delay or even omit 32-bit to 64-bit casting of
|
||||||
|
* a variable, making some code patterns unverifiable. Putting barrier_var()
|
||||||
|
* in place will ensure that cast is performed before the barrier_var()
|
||||||
|
* invocation, because compiler has to pessimistically assume that embedded
|
||||||
|
* asm section might perform some extra operations on that variable.
|
||||||
|
*
|
||||||
|
* This is a variable-specific variant of more global barrier().
|
||||||
|
*/
|
||||||
|
#ifndef barrier_var
|
||||||
|
#define barrier_var(var) asm volatile("" : "=r"(var) : "0"(var))
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper macro to throw a compilation error if __bpf_unreachable() gets
|
* Helper macro to throw a compilation error if __bpf_unreachable() gets
|
||||||
* built into the resulting code. This works given BPF back end does not
|
* built into the resulting code. This works given BPF back end does not
|
||||||
|
@ -7,8 +7,6 @@
|
|||||||
#include <bpf/bpf_tracing.h>
|
#include <bpf/bpf_tracing.h>
|
||||||
#include <bpf/bpf_core_read.h>
|
#include <bpf/bpf_core_read.h>
|
||||||
|
|
||||||
#define barrier_var(var) asm volatile("" : "=r"(var) : "0"(var))
|
|
||||||
|
|
||||||
char _license[] SEC("license") = "GPL";
|
char _license[] SEC("license") = "GPL";
|
||||||
|
|
||||||
unsigned int exception_triggered;
|
unsigned int exception_triggered;
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// Copyright (c) 2019 Facebook
|
// Copyright (c) 2019 Facebook
|
||||||
#include <linux/bpf.h>
|
#include <linux/bpf.h>
|
||||||
#include <bpf/bpf_helpers.h>
|
#include <bpf/bpf_helpers.h>
|
||||||
#define barrier() __asm__ __volatile__("": : :"memory")
|
|
||||||
|
|
||||||
char _license[] SEC("license") = "GPL";
|
char _license[] SEC("license") = "GPL";
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/* Copyright (c) 2020 Facebook */
|
/* Copyright (c) 2020 Facebook */
|
||||||
#define barrier_var(var) asm volatile("" : "=r"(var) : "0"(var))
|
|
||||||
#define UNROLL
|
#define UNROLL
|
||||||
#define INLINE __always_inline
|
#define INLINE __always_inline
|
||||||
#include "profiler.inc.h"
|
#include "profiler.inc.h"
|
||||||
|
@ -171,8 +171,6 @@ struct process_frame_ctx {
|
|||||||
bool done;
|
bool done;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define barrier_var(var) asm volatile("" : "=r"(var) : "0"(var))
|
|
||||||
|
|
||||||
static int process_frame_callback(__u32 i, struct process_frame_ctx *ctx)
|
static int process_frame_callback(__u32 i, struct process_frame_ctx *ctx)
|
||||||
{
|
{
|
||||||
int zero = 0;
|
int zero = 0;
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
#include <bpf/bpf_helpers.h>
|
#include <bpf/bpf_helpers.h>
|
||||||
#include <bpf/bpf_endian.h>
|
#include <bpf/bpf_endian.h>
|
||||||
|
|
||||||
#define barrier() __asm__ __volatile__("": : :"memory")
|
|
||||||
|
|
||||||
/* llvm will optimize both subprograms into exactly the same BPF assembly
|
/* llvm will optimize both subprograms into exactly the same BPF assembly
|
||||||
*
|
*
|
||||||
* Disassembly of section .text:
|
* Disassembly of section .text:
|
||||||
|
Loading…
Reference in New Issue
Block a user