mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
selftests/bpf: Stop using static variables for passing data to/from user-space
In preparation of skipping emitting static variables in BPF skeletons, switch all current selftests uses of static variables to pass data between BPF and user-space to use global variables. All non-read-only `static volatile` variables become just plain global variables by dropping `static volatile` part. Read-only `static volatile const` variables, though, still require `volatile` modifier, otherwise compiler will ignore whatever values are set from user-space. Few static linker tests are using name-conflicting static variables to validate that static linker still properly handles static variables and doesn't trip up on name conflicts. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20210507054119.270888-4-andrii@kernel.org
This commit is contained in:
parent
fdbf5ddeb8
commit
256eab48e7
@ -2,7 +2,7 @@
|
||||
#include <test_progs.h>
|
||||
#include "test_send_signal_kern.skel.h"
|
||||
|
||||
static volatile int sigusr1_received = 0;
|
||||
int sigusr1_received = 0;
|
||||
|
||||
static void sigusr1_handler(int signum)
|
||||
{
|
||||
|
@ -82,10 +82,8 @@ void test_skeleton(void)
|
||||
CHECK(data->out2 != 2, "res2", "got %lld != exp %d\n", data->out2, 2);
|
||||
CHECK(bss->out3 != 3, "res3", "got %d != exp %d\n", (int)bss->out3, 3);
|
||||
CHECK(bss->out4 != 4, "res4", "got %lld != exp %d\n", bss->out4, 4);
|
||||
CHECK(bss->handler_out5.a != 5, "res5", "got %d != exp %d\n",
|
||||
bss->handler_out5.a, 5);
|
||||
CHECK(bss->handler_out5.b != 6, "res6", "got %lld != exp %d\n",
|
||||
bss->handler_out5.b, 6);
|
||||
CHECK(bss->out5.a != 5, "res5", "got %d != exp %d\n", bss->out5.a, 5);
|
||||
CHECK(bss->out5.b != 6, "res6", "got %lld != exp %d\n", bss->out5.b, 6);
|
||||
CHECK(bss->out6 != 14, "res7", "got %d != exp %d\n", bss->out6, 14);
|
||||
|
||||
CHECK(bss->bpf_syscall != kcfg->CONFIG_BPF_SYSCALL, "ext1",
|
||||
|
@ -14,12 +14,7 @@ void test_static_linked(void)
|
||||
return;
|
||||
|
||||
skel->rodata->rovar1 = 1;
|
||||
skel->bss->static_var1 = 2;
|
||||
skel->bss->static_var11 = 3;
|
||||
|
||||
skel->rodata->rovar2 = 4;
|
||||
skel->bss->static_var2 = 5;
|
||||
skel->bss->static_var22 = 6;
|
||||
|
||||
err = test_static_linked__load(skel);
|
||||
if (!ASSERT_OK(err, "skel_load"))
|
||||
|
@ -9,8 +9,8 @@ __u32 map1_id = 0, map2_id = 0;
|
||||
__u32 map1_accessed = 0, map2_accessed = 0;
|
||||
__u64 map1_seqnum = 0, map2_seqnum1 = 0, map2_seqnum2 = 0;
|
||||
|
||||
static volatile const __u32 print_len;
|
||||
static volatile const __u32 ret1;
|
||||
volatile const __u32 print_len;
|
||||
volatile const __u32 ret1;
|
||||
|
||||
SEC("iter/bpf_map")
|
||||
int dump_bpf_map(struct bpf_iter__bpf_map *ctx)
|
||||
|
@ -109,10 +109,10 @@ int BPF_PROG(trace_kfree_skb, struct sk_buff *skb, void *location)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static volatile struct {
|
||||
struct {
|
||||
bool fentry_test_ok;
|
||||
bool fexit_test_ok;
|
||||
} result;
|
||||
} result = {};
|
||||
|
||||
SEC("fentry/eth_type_trans")
|
||||
int BPF_PROG(fentry_eth_type_trans, struct sk_buff *skb, struct net_device *dev,
|
||||
|
@ -10,7 +10,7 @@ struct {
|
||||
__uint(value_size, sizeof(__u32));
|
||||
} jmp_table SEC(".maps");
|
||||
|
||||
static volatile int count;
|
||||
int count = 0;
|
||||
|
||||
SEC("classifier/0")
|
||||
int bpf_func_0(struct __sk_buff *skb)
|
||||
|
@ -10,7 +10,7 @@ struct {
|
||||
__uint(value_size, sizeof(__u32));
|
||||
} jmp_table SEC(".maps");
|
||||
|
||||
static volatile int selector;
|
||||
int selector = 0;
|
||||
|
||||
#define TAIL_FUNC(x) \
|
||||
SEC("classifier/" #x) \
|
||||
|
@ -10,7 +10,7 @@ struct {
|
||||
__uint(value_size, sizeof(__u32));
|
||||
} jmp_table SEC(".maps");
|
||||
|
||||
static volatile int selector;
|
||||
int selector = 0;
|
||||
|
||||
#define TAIL_FUNC(x) \
|
||||
SEC("classifier/" #x) \
|
||||
|
@ -20,7 +20,7 @@ int subprog_tail(struct __sk_buff *skb)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static volatile int count;
|
||||
int count = 0;
|
||||
|
||||
SEC("classifier/0")
|
||||
int bpf_func_0(struct __sk_buff *skb)
|
||||
|
@ -9,7 +9,7 @@ struct {
|
||||
__uint(value_size, sizeof(__u32));
|
||||
} jmp_table SEC(".maps");
|
||||
|
||||
static volatile int count;
|
||||
int count = 0;
|
||||
|
||||
__noinline
|
||||
int subprog_tail_2(struct __sk_buff *skb)
|
||||
|
@ -11,8 +11,8 @@
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
||||
/* Userspace will update with MTU it can see on device */
|
||||
static volatile const int GLOBAL_USER_MTU;
|
||||
static volatile const __u32 GLOBAL_USER_IFINDEX;
|
||||
volatile const int GLOBAL_USER_MTU;
|
||||
volatile const __u32 GLOBAL_USER_IFINDEX;
|
||||
|
||||
/* BPF-prog will update these with MTU values it can see */
|
||||
__u32 global_bpf_mtu_xdp = 0;
|
||||
|
@ -39,8 +39,8 @@ char _license[] SEC("license") = "Dual BSD/GPL";
|
||||
/**
|
||||
* Destination port and IP used for UDP encapsulation.
|
||||
*/
|
||||
static volatile const __be16 ENCAPSULATION_PORT;
|
||||
static volatile const __be32 ENCAPSULATION_IP;
|
||||
volatile const __be16 ENCAPSULATION_PORT;
|
||||
volatile const __be32 ENCAPSULATION_IP;
|
||||
|
||||
typedef struct {
|
||||
uint64_t processed_packets_total;
|
||||
|
@ -8,7 +8,7 @@ struct S {
|
||||
int v;
|
||||
};
|
||||
|
||||
static volatile struct S global_variable;
|
||||
struct S global_variable = {};
|
||||
|
||||
struct {
|
||||
__uint(type, BPF_MAP_TYPE_ARRAY);
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include <linux/bpf.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
|
||||
static volatile const struct {
|
||||
const struct {
|
||||
unsigned a[4];
|
||||
/*
|
||||
* if the struct's size is multiple of 16, compiler will put it into
|
||||
@ -15,11 +15,11 @@ static volatile const struct {
|
||||
char _y;
|
||||
} rdonly_values = { .a = {2, 3, 4, 5} };
|
||||
|
||||
static volatile struct {
|
||||
struct {
|
||||
unsigned did_run;
|
||||
unsigned iters;
|
||||
unsigned sum;
|
||||
} res;
|
||||
} res = {};
|
||||
|
||||
SEC("raw_tracepoint/sys_enter:skip_loop")
|
||||
int skip_loop(struct pt_regs *ctx)
|
||||
|
@ -38,11 +38,11 @@ extern int LINUX_KERNEL_VERSION __kconfig;
|
||||
bool bpf_syscall = 0;
|
||||
int kern_ver = 0;
|
||||
|
||||
struct s out5 = {};
|
||||
|
||||
SEC("raw_tp/sys_enter")
|
||||
int handler(const void *ctx)
|
||||
{
|
||||
static volatile struct s out5;
|
||||
|
||||
out1 = in1;
|
||||
out2 = in2;
|
||||
out3 = in3;
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include <bpf/bpf_helpers.h>
|
||||
|
||||
/* The format string is filled from the userspace such that loading fails */
|
||||
static const char fmt[10];
|
||||
const char fmt[10];
|
||||
|
||||
SEC("raw_tp/sys_enter")
|
||||
int handler(const void *ctx)
|
||||
|
@ -28,8 +28,8 @@ struct {
|
||||
__type(value, unsigned int);
|
||||
} verdict_map SEC(".maps");
|
||||
|
||||
static volatile bool test_sockmap; /* toggled by user-space */
|
||||
static volatile bool test_ingress; /* toggled by user-space */
|
||||
bool test_sockmap = false; /* toggled by user-space */
|
||||
bool test_ingress = false; /* toggled by user-space */
|
||||
|
||||
SEC("sk_skb/stream_parser")
|
||||
int prog_stream_parser(struct __sk_buff *skb)
|
||||
|
@ -4,9 +4,9 @@
|
||||
#include <linux/bpf.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
|
||||
/* 8-byte aligned .bss */
|
||||
static volatile long static_var1;
|
||||
static volatile int static_var11;
|
||||
/* 8-byte aligned .data */
|
||||
static volatile long static_var1 = 2;
|
||||
static volatile int static_var2 = 3;
|
||||
int var1 = 0;
|
||||
/* 4-byte aligned .rodata */
|
||||
const volatile int rovar1;
|
||||
@ -21,7 +21,7 @@ static __noinline int subprog(int x)
|
||||
SEC("raw_tp/sys_enter")
|
||||
int handler1(const void *ctx)
|
||||
{
|
||||
var1 = subprog(rovar1) + static_var1 + static_var11;
|
||||
var1 = subprog(rovar1) + static_var1 + static_var2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -4,9 +4,9 @@
|
||||
#include <linux/bpf.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
|
||||
/* 4-byte aligned .bss */
|
||||
static volatile int static_var2;
|
||||
static volatile int static_var22;
|
||||
/* 4-byte aligned .data */
|
||||
static volatile int static_var1 = 5;
|
||||
static volatile int static_var2 = 6;
|
||||
int var2 = 0;
|
||||
/* 8-byte aligned .rodata */
|
||||
const volatile long rovar2;
|
||||
@ -21,7 +21,7 @@ static __noinline int subprog(int x)
|
||||
SEC("raw_tp/sys_enter")
|
||||
int handler2(const void *ctx)
|
||||
{
|
||||
var2 = subprog(rovar2) + static_var2 + static_var22;
|
||||
var2 = subprog(rovar2) + static_var1 + static_var2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user