Skip to content

Commit 5e31d50

Browse files
author
Alexei Starovoitov
committed
Merge branch 'convert-tests-to-libbpf'
Andrii Nakryiko says: ==================== There were few more tests and samples that were using custom perf buffer setup code from trace_helpers.h. This patch set gets rid of all the usages of those and removes helpers themselves. Libbpf provides nicer, but equally powerful set of APIs to work with perf ring buffers, so let's have all the samples use v1->v2: - make logging message one long line instead of two (Song). ==================== Signed-off-by: Alexei Starovoitov <[email protected]>
2 parents f2a3e4e + 47da6e4 commit 5e31d50

File tree

7 files changed

+111
-297
lines changed

7 files changed

+111
-297
lines changed

samples/bpf/trace_output_user.c

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@
1818
#include <libbpf.h>
1919
#include "bpf_load.h"
2020
#include "perf-sys.h"
21-
#include "trace_helpers.h"
22-
23-
static int pmu_fd;
2421

2522
static __u64 time_get_ns(void)
2623
{
@@ -31,12 +28,12 @@ static __u64 time_get_ns(void)
3128
}
3229

3330
static __u64 start_time;
31+
static __u64 cnt;
3432

3533
#define MAX_CNT 100000ll
3634

37-
static int print_bpf_output(void *data, int size)
35+
static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size)
3836
{
39-
static __u64 cnt;
4037
struct {
4138
__u64 pid;
4239
__u64 cookie;
@@ -45,38 +42,22 @@ static int print_bpf_output(void *data, int size)
4542
if (e->cookie != 0x12345678) {
4643
printf("BUG pid %llx cookie %llx sized %d\n",
4744
e->pid, e->cookie, size);
48-
return LIBBPF_PERF_EVENT_ERROR;
45+
return;
4946
}
5047

5148
cnt++;
5249

5350
if (cnt == MAX_CNT) {
5451
printf("recv %lld events per sec\n",
5552
MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
56-
return LIBBPF_PERF_EVENT_DONE;
53+
return;
5754
}
58-
59-
return LIBBPF_PERF_EVENT_CONT;
60-
}
61-
62-
static void test_bpf_perf_event(void)
63-
{
64-
struct perf_event_attr attr = {
65-
.sample_type = PERF_SAMPLE_RAW,
66-
.type = PERF_TYPE_SOFTWARE,
67-
.config = PERF_COUNT_SW_BPF_OUTPUT,
68-
};
69-
int key = 0;
70-
71-
pmu_fd = sys_perf_event_open(&attr, -1/*pid*/, 0/*cpu*/, -1/*group_fd*/, 0);
72-
73-
assert(pmu_fd >= 0);
74-
assert(bpf_map_update_elem(map_fd[0], &key, &pmu_fd, BPF_ANY) == 0);
75-
ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
7655
}
7756

7857
int main(int argc, char **argv)
7958
{
59+
struct perf_buffer_opts pb_opts = {};
60+
struct perf_buffer *pb;
8061
char filename[256];
8162
FILE *f;
8263
int ret;
@@ -88,16 +69,20 @@ int main(int argc, char **argv)
8869
return 1;
8970
}
9071

91-
test_bpf_perf_event();
92-
93-
if (perf_event_mmap(pmu_fd) < 0)
72+
pb_opts.sample_cb = print_bpf_output;
73+
pb = perf_buffer__new(map_fd[0], 8, &pb_opts);
74+
ret = libbpf_get_error(pb);
75+
if (ret) {
76+
printf("failed to setup perf_buffer: %d\n", ret);
9477
return 1;
78+
}
9579

9680
f = popen("taskset 1 dd if=/dev/zero of=/dev/null", "r");
9781
(void) f;
9882

9983
start_time = time_get_ns();
100-
ret = perf_event_poller(pmu_fd, print_bpf_output);
84+
while ((ret = perf_buffer__poll(pb, 1000)) >= 0 && cnt < MAX_CNT) {
85+
}
10186
kill(0, SIGINT);
10287
return ret;
10388
}

samples/bpf/xdp_sample_pkts_user.c

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@
1717
#include <linux/if_link.h>
1818

1919
#include "perf-sys.h"
20-
#include "trace_helpers.h"
2120

2221
#define MAX_CPUS 128
23-
static int pmu_fds[MAX_CPUS], if_idx;
24-
static struct perf_event_mmap_page *headers[MAX_CPUS];
22+
static int if_idx;
2523
static char *if_name;
2624
static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
2725
static __u32 prog_id;
26+
static struct perf_buffer *pb = NULL;
2827

2928
static int do_attach(int idx, int fd, const char *name)
3029
{
@@ -73,7 +72,7 @@ static int do_detach(int idx, const char *name)
7372

7473
#define SAMPLE_SIZE 64
7574

76-
static int print_bpf_output(void *data, int size)
75+
static void print_bpf_output(void *ctx, int cpu, void *data, __u32 size)
7776
{
7877
struct {
7978
__u16 cookie;
@@ -83,45 +82,20 @@ static int print_bpf_output(void *data, int size)
8382
int i;
8483

8584
if (e->cookie != 0xdead) {
86-
printf("BUG cookie %x sized %d\n",
87-
e->cookie, size);
88-
return LIBBPF_PERF_EVENT_ERROR;
85+
printf("BUG cookie %x sized %d\n", e->cookie, size);
86+
return;
8987
}
9088

9189
printf("Pkt len: %-5d bytes. Ethernet hdr: ", e->pkt_len);
9290
for (i = 0; i < 14 && i < e->pkt_len; i++)
9391
printf("%02x ", e->pkt_data[i]);
9492
printf("\n");
95-
96-
return LIBBPF_PERF_EVENT_CONT;
97-
}
98-
99-
static void test_bpf_perf_event(int map_fd, int num)
100-
{
101-
struct perf_event_attr attr = {
102-
.sample_type = PERF_SAMPLE_RAW,
103-
.type = PERF_TYPE_SOFTWARE,
104-
.config = PERF_COUNT_SW_BPF_OUTPUT,
105-
.wakeup_events = 1, /* get an fd notification for every event */
106-
};
107-
int i;
108-
109-
for (i = 0; i < num; i++) {
110-
int key = i;
111-
112-
pmu_fds[i] = sys_perf_event_open(&attr, -1/*pid*/, i/*cpu*/,
113-
-1/*group_fd*/, 0);
114-
115-
assert(pmu_fds[i] >= 0);
116-
assert(bpf_map_update_elem(map_fd, &key,
117-
&pmu_fds[i], BPF_ANY) == 0);
118-
ioctl(pmu_fds[i], PERF_EVENT_IOC_ENABLE, 0);
119-
}
12093
}
12194

12295
static void sig_handler(int signo)
12396
{
12497
do_detach(if_idx, if_name);
98+
perf_buffer__free(pb);
12599
exit(0);
126100
}
127101

@@ -140,13 +114,13 @@ int main(int argc, char **argv)
140114
struct bpf_prog_load_attr prog_load_attr = {
141115
.prog_type = BPF_PROG_TYPE_XDP,
142116
};
117+
struct perf_buffer_opts pb_opts = {};
143118
const char *optstr = "F";
144119
int prog_fd, map_fd, opt;
145120
struct bpf_object *obj;
146121
struct bpf_map *map;
147122
char filename[256];
148-
int ret, err, i;
149-
int numcpus;
123+
int ret, err;
150124

151125
while ((opt = getopt(argc, argv, optstr)) != -1) {
152126
switch (opt) {
@@ -169,10 +143,6 @@ int main(int argc, char **argv)
169143
return 1;
170144
}
171145

172-
numcpus = get_nprocs();
173-
if (numcpus > MAX_CPUS)
174-
numcpus = MAX_CPUS;
175-
176146
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
177147
prog_load_attr.file = filename;
178148

@@ -211,14 +181,17 @@ int main(int argc, char **argv)
211181
return 1;
212182
}
213183

214-
test_bpf_perf_event(map_fd, numcpus);
184+
pb_opts.sample_cb = print_bpf_output;
185+
pb = perf_buffer__new(map_fd, 8, &pb_opts);
186+
err = libbpf_get_error(pb);
187+
if (err) {
188+
perror("perf_buffer setup failed");
189+
return 1;
190+
}
215191

216-
for (i = 0; i < numcpus; i++)
217-
if (perf_event_mmap_header(pmu_fds[i], &headers[i]) < 0)
218-
return 1;
192+
while ((ret = perf_buffer__poll(pb, 1000)) >= 0) {
193+
}
219194

220-
ret = perf_event_poller_multi(pmu_fds, headers, numcpus,
221-
print_bpf_output);
222195
kill(0, SIGINT);
223196
return ret;
224197
}

tools/testing/selftests/bpf/prog_tests/get_stack_raw_tp.c

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
// SPDX-License-Identifier: GPL-2.0
2+
#define _GNU_SOURCE
3+
#include <pthread.h>
4+
#include <sched.h>
5+
#include <sys/socket.h>
26
#include <test_progs.h>
37

48
#define MAX_CNT_RAWTP 10ull
59
#define MAX_STACK_RAWTP 100
10+
11+
static int duration = 0;
12+
613
struct get_stack_trace_t {
714
int pid;
815
int kern_stack_size;
@@ -13,7 +20,7 @@ struct get_stack_trace_t {
1320
struct bpf_stack_build_id user_stack_buildid[MAX_STACK_RAWTP];
1421
};
1522

16-
static int get_stack_print_output(void *data, int size)
23+
static void get_stack_print_output(void *ctx, int cpu, void *data, __u32 size)
1724
{
1825
bool good_kern_stack = false, good_user_stack = false;
1926
const char *nonjit_func = "___bpf_prog_run";
@@ -65,75 +72,76 @@ static int get_stack_print_output(void *data, int size)
6572
if (e->user_stack_size > 0 && e->user_stack_buildid_size > 0)
6673
good_user_stack = true;
6774
}
68-
if (!good_kern_stack || !good_user_stack)
69-
return LIBBPF_PERF_EVENT_ERROR;
7075

71-
if (cnt == MAX_CNT_RAWTP)
72-
return LIBBPF_PERF_EVENT_DONE;
73-
74-
return LIBBPF_PERF_EVENT_CONT;
76+
if (!good_kern_stack)
77+
CHECK(!good_kern_stack, "kern_stack", "corrupted kernel stack\n");
78+
if (!good_user_stack)
79+
CHECK(!good_user_stack, "user_stack", "corrupted user stack\n");
7580
}
7681

7782
void test_get_stack_raw_tp(void)
7883
{
7984
const char *file = "./test_get_stack_rawtp.o";
80-
int i, efd, err, prog_fd, pmu_fd, perfmap_fd;
81-
struct perf_event_attr attr = {};
85+
const char *prog_name = "raw_tracepoint/sys_enter";
86+
int i, err, prog_fd, exp_cnt = MAX_CNT_RAWTP;
87+
struct perf_buffer_opts pb_opts = {};
88+
struct perf_buffer *pb = NULL;
89+
struct bpf_link *link = NULL;
8290
struct timespec tv = {0, 10};
83-
__u32 key = 0, duration = 0;
91+
struct bpf_program *prog;
8492
struct bpf_object *obj;
93+
struct bpf_map *map;
94+
cpu_set_t cpu_set;
8595

8696
err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
8797
if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
8898
return;
8999

90-
efd = bpf_raw_tracepoint_open("sys_enter", prog_fd);
91-
if (CHECK(efd < 0, "raw_tp_open", "err %d errno %d\n", efd, errno))
100+
prog = bpf_object__find_program_by_title(obj, prog_name);
101+
if (CHECK(!prog, "find_probe", "prog '%s' not found\n", prog_name))
92102
goto close_prog;
93103

94-
perfmap_fd = bpf_find_map(__func__, obj, "perfmap");
95-
if (CHECK(perfmap_fd < 0, "bpf_find_map", "err %d errno %d\n",
96-
perfmap_fd, errno))
104+
map = bpf_object__find_map_by_name(obj, "perfmap");
105+
if (CHECK(!map, "bpf_find_map", "not found\n"))
97106
goto close_prog;
98107

99108
err = load_kallsyms();
100109
if (CHECK(err < 0, "load_kallsyms", "err %d errno %d\n", err, errno))
101110
goto close_prog;
102111

103-
attr.sample_type = PERF_SAMPLE_RAW;
104-
attr.type = PERF_TYPE_SOFTWARE;
105-
attr.config = PERF_COUNT_SW_BPF_OUTPUT;
106-
pmu_fd = syscall(__NR_perf_event_open, &attr, getpid()/*pid*/, -1/*cpu*/,
107-
-1/*group_fd*/, 0);
108-
if (CHECK(pmu_fd < 0, "perf_event_open", "err %d errno %d\n", pmu_fd,
109-
errno))
112+
CPU_ZERO(&cpu_set);
113+
CPU_SET(0, &cpu_set);
114+
err = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set), &cpu_set);
115+
if (CHECK(err, "set_affinity", "err %d, errno %d\n", err, errno))
110116
goto close_prog;
111117

112-
err = bpf_map_update_elem(perfmap_fd, &key, &pmu_fd, BPF_ANY);
113-
if (CHECK(err < 0, "bpf_map_update_elem", "err %d errno %d\n", err,
114-
errno))
118+
link = bpf_program__attach_raw_tracepoint(prog, "sys_enter");
119+
if (CHECK(IS_ERR(link), "attach_raw_tp", "err %ld\n", PTR_ERR(link)))
115120
goto close_prog;
116121

117-
err = ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
118-
if (CHECK(err < 0, "ioctl PERF_EVENT_IOC_ENABLE", "err %d errno %d\n",
119-
err, errno))
120-
goto close_prog;
121-
122-
err = perf_event_mmap(pmu_fd);
123-
if (CHECK(err < 0, "perf_event_mmap", "err %d errno %d\n", err, errno))
122+
pb_opts.sample_cb = get_stack_print_output;
123+
pb = perf_buffer__new(bpf_map__fd(map), 8, &pb_opts);
124+
if (CHECK(IS_ERR(pb), "perf_buf__new", "err %ld\n", PTR_ERR(pb)))
124125
goto close_prog;
125126

126127
/* trigger some syscall action */
127128
for (i = 0; i < MAX_CNT_RAWTP; i++)
128129
nanosleep(&tv, NULL);
129130

130-
err = perf_event_poller(pmu_fd, get_stack_print_output);
131-
if (CHECK(err < 0, "perf_event_poller", "err %d errno %d\n", err, errno))
132-
goto close_prog;
131+
while (exp_cnt > 0) {
132+
err = perf_buffer__poll(pb, 100);
133+
if (err < 0 && CHECK(err < 0, "pb__poll", "err %d\n", err))
134+
goto close_prog;
135+
exp_cnt -= err;
136+
}
133137

134138
goto close_prog_noerr;
135139
close_prog:
136140
error_cnt++;
137141
close_prog_noerr:
142+
if (!IS_ERR_OR_NULL(link))
143+
bpf_link__destroy(link);
144+
if (!IS_ERR_OR_NULL(pb))
145+
perf_buffer__free(pb);
138146
bpf_object__close(obj);
139147
}

tools/testing/selftests/bpf/progs/test_get_stack_rawtp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct {
5555
__type(value, raw_stack_trace_t);
5656
} rawdata_map SEC(".maps");
5757

58-
SEC("tracepoint/raw_syscalls/sys_enter")
58+
SEC("raw_tracepoint/sys_enter")
5959
int bpf_prog1(void *ctx)
6060
{
6161
int max_len, max_buildid_len, usize, ksize, total_size;

0 commit comments

Comments
 (0)