Skip to content

Commit 28dbf86

Browse files
yonghong-songAlexei Starovoitov
authored andcommitted
samples/bpf: move common-purpose trace functions to selftests
There is no functionality change in this patch. The common-purpose trace functions, including perf_event polling and ksym lookup, are moved from trace_output_user.c and bpf_load.c to selftests/bpf/trace_helpers.c so that these function can be reused later in selftests. Acked-by: Alexei Starovoitov <ast@fb.com> Signed-off-by: Yonghong Song <yhs@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent de2ff05 commit 28dbf86

File tree

10 files changed

+223
-175
lines changed

10 files changed

+223
-175
lines changed

samples/bpf/Makefile

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ hostprogs-y += xdp_adjust_tail
4949
# Libbpf dependencies
5050
LIBBPF := ../../tools/lib/bpf/bpf.o ../../tools/lib/bpf/nlattr.o
5151
CGROUP_HELPERS := ../../tools/testing/selftests/bpf/cgroup_helpers.o
52+
TRACE_HELPERS := ../../tools/testing/selftests/bpf/trace_helpers.o
5253

5354
test_lru_dist-objs := test_lru_dist.o $(LIBBPF)
5455
sock_example-objs := sock_example.o $(LIBBPF)
@@ -65,10 +66,10 @@ tracex6-objs := bpf_load.o $(LIBBPF) tracex6_user.o
6566
tracex7-objs := bpf_load.o $(LIBBPF) tracex7_user.o
6667
load_sock_ops-objs := bpf_load.o $(LIBBPF) load_sock_ops.o
6768
test_probe_write_user-objs := bpf_load.o $(LIBBPF) test_probe_write_user_user.o
68-
trace_output-objs := bpf_load.o $(LIBBPF) trace_output_user.o
69+
trace_output-objs := bpf_load.o $(LIBBPF) trace_output_user.o $(TRACE_HELPERS)
6970
lathist-objs := bpf_load.o $(LIBBPF) lathist_user.o
70-
offwaketime-objs := bpf_load.o $(LIBBPF) offwaketime_user.o
71-
spintest-objs := bpf_load.o $(LIBBPF) spintest_user.o
71+
offwaketime-objs := bpf_load.o $(LIBBPF) offwaketime_user.o $(TRACE_HELPERS)
72+
spintest-objs := bpf_load.o $(LIBBPF) spintest_user.o $(TRACE_HELPERS)
7273
map_perf_test-objs := bpf_load.o $(LIBBPF) map_perf_test_user.o
7374
test_overhead-objs := bpf_load.o $(LIBBPF) test_overhead_user.o
7475
test_cgrp2_array_pin-objs := $(LIBBPF) test_cgrp2_array_pin.o
@@ -82,8 +83,8 @@ xdp2-objs := bpf_load.o $(LIBBPF) xdp1_user.o
8283
xdp_router_ipv4-objs := bpf_load.o $(LIBBPF) xdp_router_ipv4_user.o
8384
test_current_task_under_cgroup-objs := bpf_load.o $(LIBBPF) $(CGROUP_HELPERS) \
8485
test_current_task_under_cgroup_user.o
85-
trace_event-objs := bpf_load.o $(LIBBPF) trace_event_user.o
86-
sampleip-objs := bpf_load.o $(LIBBPF) sampleip_user.o
86+
trace_event-objs := bpf_load.o $(LIBBPF) trace_event_user.o $(TRACE_HELPERS)
87+
sampleip-objs := bpf_load.o $(LIBBPF) sampleip_user.o $(TRACE_HELPERS)
8788
tc_l2_redirect-objs := bpf_load.o $(LIBBPF) tc_l2_redirect_user.o
8889
lwt_len_hist-objs := bpf_load.o $(LIBBPF) lwt_len_hist_user.o
8990
xdp_tx_iptunnel-objs := bpf_load.o $(LIBBPF) xdp_tx_iptunnel_user.o

samples/bpf/bpf_load.c

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -648,66 +648,3 @@ void read_trace_pipe(void)
648648
}
649649
}
650650
}
651-
652-
#define MAX_SYMS 300000
653-
static struct ksym syms[MAX_SYMS];
654-
static int sym_cnt;
655-
656-
static int ksym_cmp(const void *p1, const void *p2)
657-
{
658-
return ((struct ksym *)p1)->addr - ((struct ksym *)p2)->addr;
659-
}
660-
661-
int load_kallsyms(void)
662-
{
663-
FILE *f = fopen("/proc/kallsyms", "r");
664-
char func[256], buf[256];
665-
char symbol;
666-
void *addr;
667-
int i = 0;
668-
669-
if (!f)
670-
return -ENOENT;
671-
672-
while (!feof(f)) {
673-
if (!fgets(buf, sizeof(buf), f))
674-
break;
675-
if (sscanf(buf, "%p %c %s", &addr, &symbol, func) != 3)
676-
break;
677-
if (!addr)
678-
continue;
679-
syms[i].addr = (long) addr;
680-
syms[i].name = strdup(func);
681-
i++;
682-
}
683-
sym_cnt = i;
684-
qsort(syms, sym_cnt, sizeof(struct ksym), ksym_cmp);
685-
return 0;
686-
}
687-
688-
struct ksym *ksym_search(long key)
689-
{
690-
int start = 0, end = sym_cnt;
691-
int result;
692-
693-
while (start < end) {
694-
size_t mid = start + (end - start) / 2;
695-
696-
result = key - syms[mid].addr;
697-
if (result < 0)
698-
end = mid;
699-
else if (result > 0)
700-
start = mid + 1;
701-
else
702-
return &syms[mid];
703-
}
704-
705-
if (start >= 1 && syms[start - 1].addr < key &&
706-
key < syms[start].addr)
707-
/* valid ksym */
708-
return &syms[start - 1];
709-
710-
/* out of range. return _stext */
711-
return &syms[0];
712-
}
713-

samples/bpf/bpf_load.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,5 @@ int load_bpf_file(char *path);
5454
int load_bpf_file_fixup_map(const char *path, fixup_map_cb fixup_map);
5555

5656
void read_trace_pipe(void);
57-
struct ksym {
58-
long addr;
59-
char *name;
60-
};
61-
62-
int load_kallsyms(void);
63-
struct ksym *ksym_search(long key);
6457
int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags);
6558
#endif

samples/bpf/offwaketime_user.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <sys/resource.h>
1818
#include "libbpf.h"
1919
#include "bpf_load.h"
20+
#include "trace_helpers.h"
2021

2122
#define PRINT_RAW_ADDR 0
2223

samples/bpf/sampleip_user.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "libbpf.h"
2323
#include "bpf_load.h"
2424
#include "perf-sys.h"
25+
#include "trace_helpers.h"
2526

2627
#define DEFAULT_FREQ 99
2728
#define DEFAULT_SECS 5

samples/bpf/spintest_user.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <sys/resource.h>
88
#include "libbpf.h"
99
#include "bpf_load.h"
10+
#include "trace_helpers.h"
1011

1112
int main(int ac, char **argv)
1213
{

samples/bpf/trace_event_user.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "libbpf.h"
2222
#include "bpf_load.h"
2323
#include "perf-sys.h"
24+
#include "trace_helpers.h"
2425

2526
#define SAMPLE_FREQ 50
2627

samples/bpf/trace_output_user.c

Lines changed: 10 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -21,100 +21,10 @@
2121
#include "libbpf.h"
2222
#include "bpf_load.h"
2323
#include "perf-sys.h"
24+
#include "trace_helpers.h"
2425

2526
static int pmu_fd;
2627

27-
int page_size;
28-
int page_cnt = 8;
29-
volatile struct perf_event_mmap_page *header;
30-
31-
typedef void (*print_fn)(void *data, int size);
32-
33-
static int perf_event_mmap(int fd)
34-
{
35-
void *base;
36-
int mmap_size;
37-
38-
page_size = getpagesize();
39-
mmap_size = page_size * (page_cnt + 1);
40-
41-
base = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
42-
if (base == MAP_FAILED) {
43-
printf("mmap err\n");
44-
return -1;
45-
}
46-
47-
header = base;
48-
return 0;
49-
}
50-
51-
static int perf_event_poll(int fd)
52-
{
53-
struct pollfd pfd = { .fd = fd, .events = POLLIN };
54-
55-
return poll(&pfd, 1, 1000);
56-
}
57-
58-
struct perf_event_sample {
59-
struct perf_event_header header;
60-
__u32 size;
61-
char data[];
62-
};
63-
64-
static void perf_event_read(print_fn fn)
65-
{
66-
__u64 data_tail = header->data_tail;
67-
__u64 data_head = header->data_head;
68-
__u64 buffer_size = page_cnt * page_size;
69-
void *base, *begin, *end;
70-
char buf[256];
71-
72-
asm volatile("" ::: "memory"); /* in real code it should be smp_rmb() */
73-
if (data_head == data_tail)
74-
return;
75-
76-
base = ((char *)header) + page_size;
77-
78-
begin = base + data_tail % buffer_size;
79-
end = base + data_head % buffer_size;
80-
81-
while (begin != end) {
82-
struct perf_event_sample *e;
83-
84-
e = begin;
85-
if (begin + e->header.size > base + buffer_size) {
86-
long len = base + buffer_size - begin;
87-
88-
assert(len < e->header.size);
89-
memcpy(buf, begin, len);
90-
memcpy(buf + len, base, e->header.size - len);
91-
e = (void *) buf;
92-
begin = base + e->header.size - len;
93-
} else if (begin + e->header.size == base + buffer_size) {
94-
begin = base;
95-
} else {
96-
begin += e->header.size;
97-
}
98-
99-
if (e->header.type == PERF_RECORD_SAMPLE) {
100-
fn(e->data, e->size);
101-
} else if (e->header.type == PERF_RECORD_LOST) {
102-
struct {
103-
struct perf_event_header header;
104-
__u64 id;
105-
__u64 lost;
106-
} *lost = (void *) e;
107-
printf("lost %lld events\n", lost->lost);
108-
} else {
109-
printf("unknown event type=%d size=%d\n",
110-
e->header.type, e->header.size);
111-
}
112-
}
113-
114-
__sync_synchronize(); /* smp_mb() */
115-
header->data_tail = data_head;
116-
}
117-
11828
static __u64 time_get_ns(void)
11929
{
12030
struct timespec ts;
@@ -127,7 +37,7 @@ static __u64 start_time;
12737

12838
#define MAX_CNT 100000ll
12939

130-
static void print_bpf_output(void *data, int size)
40+
static int print_bpf_output(void *data, int size)
13141
{
13242
static __u64 cnt;
13343
struct {
@@ -138,16 +48,18 @@ static void print_bpf_output(void *data, int size)
13848
if (e->cookie != 0x12345678) {
13949
printf("BUG pid %llx cookie %llx sized %d\n",
14050
e->pid, e->cookie, size);
141-
kill(0, SIGINT);
51+
return PERF_EVENT_ERROR;
14252
}
14353

14454
cnt++;
14555

14656
if (cnt == MAX_CNT) {
14757
printf("recv %lld events per sec\n",
14858
MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
149-
kill(0, SIGINT);
59+
return PERF_EVENT_DONE;
15060
}
61+
62+
return PERF_EVENT_CONT;
15163
}
15264

15365
static void test_bpf_perf_event(void)
@@ -170,6 +82,7 @@ int main(int argc, char **argv)
17082
{
17183
char filename[256];
17284
FILE *f;
85+
int ret;
17386

17487
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
17588

@@ -187,10 +100,7 @@ int main(int argc, char **argv)
187100
(void) f;
188101

189102
start_time = time_get_ns();
190-
for (;;) {
191-
perf_event_poll(pmu_fd);
192-
perf_event_read(print_bpf_output);
193-
}
194-
195-
return 0;
103+
ret = perf_event_poller(pmu_fd, print_bpf_output);
104+
kill(0, SIGINT);
105+
return ret;
196106
}

0 commit comments

Comments
 (0)