Commit 256eab48 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov

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: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210507054119.270888-4-andrii@kernel.org
parent fdbf5dde
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#include <test_progs.h> #include <test_progs.h>
#include "test_send_signal_kern.skel.h" #include "test_send_signal_kern.skel.h"
static volatile int sigusr1_received = 0; int sigusr1_received = 0;
static void sigusr1_handler(int signum) static void sigusr1_handler(int signum)
{ {
......
...@@ -82,10 +82,8 @@ void test_skeleton(void) ...@@ -82,10 +82,8 @@ void test_skeleton(void)
CHECK(data->out2 != 2, "res2", "got %lld != exp %d\n", data->out2, 2); 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->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->out4 != 4, "res4", "got %lld != exp %d\n", bss->out4, 4);
CHECK(bss->handler_out5.a != 5, "res5", "got %d != exp %d\n", CHECK(bss->out5.a != 5, "res5", "got %d != exp %d\n", bss->out5.a, 5);
bss->handler_out5.a, 5); CHECK(bss->out5.b != 6, "res6", "got %lld != exp %d\n", bss->out5.b, 6);
CHECK(bss->handler_out5.b != 6, "res6", "got %lld != exp %d\n",
bss->handler_out5.b, 6);
CHECK(bss->out6 != 14, "res7", "got %d != exp %d\n", bss->out6, 14); CHECK(bss->out6 != 14, "res7", "got %d != exp %d\n", bss->out6, 14);
CHECK(bss->bpf_syscall != kcfg->CONFIG_BPF_SYSCALL, "ext1", CHECK(bss->bpf_syscall != kcfg->CONFIG_BPF_SYSCALL, "ext1",
......
...@@ -14,12 +14,7 @@ void test_static_linked(void) ...@@ -14,12 +14,7 @@ void test_static_linked(void)
return; return;
skel->rodata->rovar1 = 1; skel->rodata->rovar1 = 1;
skel->bss->static_var1 = 2;
skel->bss->static_var11 = 3;
skel->rodata->rovar2 = 4; skel->rodata->rovar2 = 4;
skel->bss->static_var2 = 5;
skel->bss->static_var22 = 6;
err = test_static_linked__load(skel); err = test_static_linked__load(skel);
if (!ASSERT_OK(err, "skel_load")) if (!ASSERT_OK(err, "skel_load"))
......
...@@ -9,8 +9,8 @@ __u32 map1_id = 0, map2_id = 0; ...@@ -9,8 +9,8 @@ __u32 map1_id = 0, map2_id = 0;
__u32 map1_accessed = 0, map2_accessed = 0; __u32 map1_accessed = 0, map2_accessed = 0;
__u64 map1_seqnum = 0, map2_seqnum1 = 0, map2_seqnum2 = 0; __u64 map1_seqnum = 0, map2_seqnum1 = 0, map2_seqnum2 = 0;
static volatile const __u32 print_len; volatile const __u32 print_len;
static volatile const __u32 ret1; volatile const __u32 ret1;
SEC("iter/bpf_map") SEC("iter/bpf_map")
int dump_bpf_map(struct bpf_iter__bpf_map *ctx) 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) ...@@ -109,10 +109,10 @@ int BPF_PROG(trace_kfree_skb, struct sk_buff *skb, void *location)
return 0; return 0;
} }
static volatile struct { struct {
bool fentry_test_ok; bool fentry_test_ok;
bool fexit_test_ok; bool fexit_test_ok;
} result; } result = {};
SEC("fentry/eth_type_trans") SEC("fentry/eth_type_trans")
int BPF_PROG(fentry_eth_type_trans, struct sk_buff *skb, struct net_device *dev, int BPF_PROG(fentry_eth_type_trans, struct sk_buff *skb, struct net_device *dev,
......
...@@ -10,7 +10,7 @@ struct { ...@@ -10,7 +10,7 @@ struct {
__uint(value_size, sizeof(__u32)); __uint(value_size, sizeof(__u32));
} jmp_table SEC(".maps"); } jmp_table SEC(".maps");
static volatile int count; int count = 0;
SEC("classifier/0") SEC("classifier/0")
int bpf_func_0(struct __sk_buff *skb) int bpf_func_0(struct __sk_buff *skb)
......
...@@ -10,7 +10,7 @@ struct { ...@@ -10,7 +10,7 @@ struct {
__uint(value_size, sizeof(__u32)); __uint(value_size, sizeof(__u32));
} jmp_table SEC(".maps"); } jmp_table SEC(".maps");
static volatile int selector; int selector = 0;
#define TAIL_FUNC(x) \ #define TAIL_FUNC(x) \
SEC("classifier/" #x) \ SEC("classifier/" #x) \
......
...@@ -10,7 +10,7 @@ struct { ...@@ -10,7 +10,7 @@ struct {
__uint(value_size, sizeof(__u32)); __uint(value_size, sizeof(__u32));
} jmp_table SEC(".maps"); } jmp_table SEC(".maps");
static volatile int selector; int selector = 0;
#define TAIL_FUNC(x) \ #define TAIL_FUNC(x) \
SEC("classifier/" #x) \ SEC("classifier/" #x) \
......
...@@ -20,7 +20,7 @@ int subprog_tail(struct __sk_buff *skb) ...@@ -20,7 +20,7 @@ int subprog_tail(struct __sk_buff *skb)
return 1; return 1;
} }
static volatile int count; int count = 0;
SEC("classifier/0") SEC("classifier/0")
int bpf_func_0(struct __sk_buff *skb) int bpf_func_0(struct __sk_buff *skb)
......
...@@ -9,7 +9,7 @@ struct { ...@@ -9,7 +9,7 @@ struct {
__uint(value_size, sizeof(__u32)); __uint(value_size, sizeof(__u32));
} jmp_table SEC(".maps"); } jmp_table SEC(".maps");
static volatile int count; int count = 0;
__noinline __noinline
int subprog_tail_2(struct __sk_buff *skb) int subprog_tail_2(struct __sk_buff *skb)
......
...@@ -11,8 +11,8 @@ ...@@ -11,8 +11,8 @@
char _license[] SEC("license") = "GPL"; char _license[] SEC("license") = "GPL";
/* Userspace will update with MTU it can see on device */ /* Userspace will update with MTU it can see on device */
static volatile const int GLOBAL_USER_MTU; volatile const int GLOBAL_USER_MTU;
static volatile const __u32 GLOBAL_USER_IFINDEX; volatile const __u32 GLOBAL_USER_IFINDEX;
/* BPF-prog will update these with MTU values it can see */ /* BPF-prog will update these with MTU values it can see */
__u32 global_bpf_mtu_xdp = 0; __u32 global_bpf_mtu_xdp = 0;
......
...@@ -39,8 +39,8 @@ char _license[] SEC("license") = "Dual BSD/GPL"; ...@@ -39,8 +39,8 @@ char _license[] SEC("license") = "Dual BSD/GPL";
/** /**
* Destination port and IP used for UDP encapsulation. * Destination port and IP used for UDP encapsulation.
*/ */
static volatile const __be16 ENCAPSULATION_PORT; volatile const __be16 ENCAPSULATION_PORT;
static volatile const __be32 ENCAPSULATION_IP; volatile const __be32 ENCAPSULATION_IP;
typedef struct { typedef struct {
uint64_t processed_packets_total; uint64_t processed_packets_total;
......
...@@ -8,7 +8,7 @@ struct S { ...@@ -8,7 +8,7 @@ struct S {
int v; int v;
}; };
static volatile struct S global_variable; struct S global_variable = {};
struct { struct {
__uint(type, BPF_MAP_TYPE_ARRAY); __uint(type, BPF_MAP_TYPE_ARRAY);
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <linux/bpf.h> #include <linux/bpf.h>
#include <bpf/bpf_helpers.h> #include <bpf/bpf_helpers.h>
static volatile const struct { const struct {
unsigned a[4]; unsigned a[4];
/* /*
* if the struct's size is multiple of 16, compiler will put it into * if the struct's size is multiple of 16, compiler will put it into
...@@ -15,11 +15,11 @@ static volatile const struct { ...@@ -15,11 +15,11 @@ static volatile const struct {
char _y; char _y;
} rdonly_values = { .a = {2, 3, 4, 5} }; } rdonly_values = { .a = {2, 3, 4, 5} };
static volatile struct { struct {
unsigned did_run; unsigned did_run;
unsigned iters; unsigned iters;
unsigned sum; unsigned sum;
} res; } res = {};
SEC("raw_tracepoint/sys_enter:skip_loop") SEC("raw_tracepoint/sys_enter:skip_loop")
int skip_loop(struct pt_regs *ctx) int skip_loop(struct pt_regs *ctx)
......
...@@ -38,11 +38,11 @@ extern int LINUX_KERNEL_VERSION __kconfig; ...@@ -38,11 +38,11 @@ extern int LINUX_KERNEL_VERSION __kconfig;
bool bpf_syscall = 0; bool bpf_syscall = 0;
int kern_ver = 0; int kern_ver = 0;
struct s out5 = {};
SEC("raw_tp/sys_enter") SEC("raw_tp/sys_enter")
int handler(const void *ctx) int handler(const void *ctx)
{ {
static volatile struct s out5;
out1 = in1; out1 = in1;
out2 = in2; out2 = in2;
out3 = in3; out3 = in3;
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <bpf/bpf_helpers.h> #include <bpf/bpf_helpers.h>
/* The format string is filled from the userspace such that loading fails */ /* 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") SEC("raw_tp/sys_enter")
int handler(const void *ctx) int handler(const void *ctx)
......
...@@ -28,8 +28,8 @@ struct { ...@@ -28,8 +28,8 @@ struct {
__type(value, unsigned int); __type(value, unsigned int);
} verdict_map SEC(".maps"); } verdict_map SEC(".maps");
static volatile bool test_sockmap; /* toggled by user-space */ bool test_sockmap = false; /* toggled by user-space */
static volatile bool test_ingress; /* toggled by user-space */ bool test_ingress = false; /* toggled by user-space */
SEC("sk_skb/stream_parser") SEC("sk_skb/stream_parser")
int prog_stream_parser(struct __sk_buff *skb) int prog_stream_parser(struct __sk_buff *skb)
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
#include <linux/bpf.h> #include <linux/bpf.h>
#include <bpf/bpf_helpers.h> #include <bpf/bpf_helpers.h>
/* 8-byte aligned .bss */ /* 8-byte aligned .data */
static volatile long static_var1; static volatile long static_var1 = 2;
static volatile int static_var11; static volatile int static_var2 = 3;
int var1 = 0; int var1 = 0;
/* 4-byte aligned .rodata */ /* 4-byte aligned .rodata */
const volatile int rovar1; const volatile int rovar1;
...@@ -21,7 +21,7 @@ static __noinline int subprog(int x) ...@@ -21,7 +21,7 @@ static __noinline int subprog(int x)
SEC("raw_tp/sys_enter") SEC("raw_tp/sys_enter")
int handler1(const void *ctx) int handler1(const void *ctx)
{ {
var1 = subprog(rovar1) + static_var1 + static_var11; var1 = subprog(rovar1) + static_var1 + static_var2;
return 0; return 0;
} }
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
#include <linux/bpf.h> #include <linux/bpf.h>
#include <bpf/bpf_helpers.h> #include <bpf/bpf_helpers.h>
/* 4-byte aligned .bss */ /* 4-byte aligned .data */
static volatile int static_var2; static volatile int static_var1 = 5;
static volatile int static_var22; static volatile int static_var2 = 6;
int var2 = 0; int var2 = 0;
/* 8-byte aligned .rodata */ /* 8-byte aligned .rodata */
const volatile long rovar2; const volatile long rovar2;
...@@ -21,7 +21,7 @@ static __noinline int subprog(int x) ...@@ -21,7 +21,7 @@ static __noinline int subprog(int x)
SEC("raw_tp/sys_enter") SEC("raw_tp/sys_enter")
int handler2(const void *ctx) int handler2(const void *ctx)
{ {
var2 = subprog(rovar2) + static_var2 + static_var22; var2 = subprog(rovar2) + static_var1 + static_var2;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment