Skip to content

Commit

Permalink
samples: bpf: Refactor test_overhead program with libbpf
Browse files Browse the repository at this point in the history
This commit refactors the existing program with libbpf bpf loader.
Since the kprobe, tracepoint and raw_tracepoint bpf program can be
attached with single bpf_program__attach() interface, so the
corresponding function of libbpf is used here.

Rather than specifying the number of cpus inside the code, this commit
uses the number of available cpus with _SC_NPROCESSORS_ONLN.

Signed-off-by: Daniel T. Lee <[email protected]>
Signed-off-by: Andrii Nakryiko <[email protected]>
Acked-by: Andrii Nakryiko <[email protected]>
Link: https://lore.kernel.org/bpf/[email protected]
  • Loading branch information
DanielTimLee authored and anakryiko committed Nov 27, 2020
1 parent 763af20 commit c6497df
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 24 deletions.
2 changes: 1 addition & 1 deletion samples/bpf/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ lathist-objs := lathist_user.o
offwaketime-objs := offwaketime_user.o $(TRACE_HELPERS)
spintest-objs := spintest_user.o $(TRACE_HELPERS)
map_perf_test-objs := map_perf_test_user.o
test_overhead-objs := bpf_load.o test_overhead_user.o
test_overhead-objs := test_overhead_user.o
test_cgrp2_array_pin-objs := test_cgrp2_array_pin.o
test_cgrp2_attach-objs := test_cgrp2_attach.o
test_cgrp2_sock-objs := test_cgrp2_sock.o
Expand Down
82 changes: 59 additions & 23 deletions samples/bpf/test_overhead_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,14 @@
#include <time.h>
#include <sys/resource.h>
#include <bpf/bpf.h>
#include "bpf_load.h"
#include <bpf/libbpf.h>

#define MAX_CNT 1000000

static struct bpf_link *links[2];
static struct bpf_object *obj;
static int cnt;

static __u64 time_get_ns(void)
{
struct timespec ts;
Expand Down Expand Up @@ -115,20 +119,54 @@ static void run_perf_test(int tasks, int flags)
}
}

static int load_progs(char *filename)
{
struct bpf_program *prog;
int err = 0;

obj = bpf_object__open_file(filename, NULL);
err = libbpf_get_error(obj);
if (err < 0) {
fprintf(stderr, "ERROR: opening BPF object file failed\n");
return err;
}

/* load BPF program */
err = bpf_object__load(obj);
if (err < 0) {
fprintf(stderr, "ERROR: loading BPF object file failed\n");
return err;
}

bpf_object__for_each_program(prog, obj) {
links[cnt] = bpf_program__attach(prog);
err = libbpf_get_error(links[cnt]);
if (err < 0) {
fprintf(stderr, "ERROR: bpf_program__attach failed\n");
links[cnt] = NULL;
return err;
}
cnt++;
}

return err;
}

static void unload_progs(void)
{
close(prog_fd[0]);
close(prog_fd[1]);
close(event_fd[0]);
close(event_fd[1]);
while (cnt)
bpf_link__destroy(links[--cnt]);

bpf_object__close(obj);
}

int main(int argc, char **argv)
{
struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
char filename[256];
int num_cpu = 8;
int num_cpu = sysconf(_SC_NPROCESSORS_ONLN);
int test_flags = ~0;
char filename[256];
int err = 0;

setrlimit(RLIMIT_MEMLOCK, &r);

Expand All @@ -145,38 +183,36 @@ int main(int argc, char **argv)
if (test_flags & 0xC) {
snprintf(filename, sizeof(filename),
"%s_kprobe_kern.o", argv[0]);
if (load_bpf_file(filename)) {
printf("%s", bpf_log_buf);
return 1;
}

printf("w/KPROBE\n");
run_perf_test(num_cpu, test_flags >> 2);
err = load_progs(filename);
if (!err)
run_perf_test(num_cpu, test_flags >> 2);

unload_progs();
}

if (test_flags & 0x30) {
snprintf(filename, sizeof(filename),
"%s_tp_kern.o", argv[0]);
if (load_bpf_file(filename)) {
printf("%s", bpf_log_buf);
return 1;
}
printf("w/TRACEPOINT\n");
run_perf_test(num_cpu, test_flags >> 4);
err = load_progs(filename);
if (!err)
run_perf_test(num_cpu, test_flags >> 4);

unload_progs();
}

if (test_flags & 0xC0) {
snprintf(filename, sizeof(filename),
"%s_raw_tp_kern.o", argv[0]);
if (load_bpf_file(filename)) {
printf("%s", bpf_log_buf);
return 1;
}
printf("w/RAW_TRACEPOINT\n");
run_perf_test(num_cpu, test_flags >> 6);
err = load_progs(filename);
if (!err)
run_perf_test(num_cpu, test_flags >> 6);

unload_progs();
}

return 0;
return err;
}

0 comments on commit c6497df

Please sign in to comment.