forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bpf: add a test case for syscalls/sys_{enter|exit}_* tracepoints
Signed-off-by: Yonghong Song <[email protected]> Acked-by: Daniel Borkmann <[email protected]> Signed-off-by: David S. Miller <[email protected]>
- Loading branch information
1 parent
cf5f5ce
commit 1da236b
Showing
3 changed files
with
137 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
/* Copyright (c) 2017 Facebook | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of version 2 of the GNU General Public | ||
* License as published by the Free Software Foundation. | ||
*/ | ||
#include <uapi/linux/bpf.h> | ||
#include "bpf_helpers.h" | ||
|
||
struct syscalls_enter_open_args { | ||
unsigned long long unused; | ||
long syscall_nr; | ||
long filename_ptr; | ||
long flags; | ||
long mode; | ||
}; | ||
|
||
struct syscalls_exit_open_args { | ||
unsigned long long unused; | ||
long syscall_nr; | ||
long ret; | ||
}; | ||
|
||
struct bpf_map_def SEC("maps") enter_open_map = { | ||
.type = BPF_MAP_TYPE_ARRAY, | ||
.key_size = sizeof(u32), | ||
.value_size = sizeof(u32), | ||
.max_entries = 1, | ||
}; | ||
|
||
struct bpf_map_def SEC("maps") exit_open_map = { | ||
.type = BPF_MAP_TYPE_ARRAY, | ||
.key_size = sizeof(u32), | ||
.value_size = sizeof(u32), | ||
.max_entries = 1, | ||
}; | ||
|
||
static __always_inline void count(void *map) | ||
{ | ||
u32 key = 0; | ||
u32 *value, init_val = 1; | ||
|
||
value = bpf_map_lookup_elem(map, &key); | ||
if (value) | ||
*value += 1; | ||
else | ||
bpf_map_update_elem(map, &key, &init_val, BPF_NOEXIST); | ||
} | ||
|
||
SEC("tracepoint/syscalls/sys_enter_open") | ||
int trace_enter_open(struct syscalls_enter_open_args *ctx) | ||
{ | ||
count((void *)&enter_open_map); | ||
return 0; | ||
} | ||
|
||
SEC("tracepoint/syscalls/sys_exit_open") | ||
int trace_enter_exit(struct syscalls_exit_open_args *ctx) | ||
{ | ||
count((void *)&exit_open_map); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/* Copyright (c) 2017 Facebook | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of version 2 of the GNU General Public | ||
* License as published by the Free Software Foundation. | ||
*/ | ||
#include <stdio.h> | ||
#include <unistd.h> | ||
#include <fcntl.h> | ||
#include <stdlib.h> | ||
#include <signal.h> | ||
#include <linux/bpf.h> | ||
#include <string.h> | ||
#include <linux/perf_event.h> | ||
#include <errno.h> | ||
#include <assert.h> | ||
#include <stdbool.h> | ||
#include <sys/resource.h> | ||
#include "libbpf.h" | ||
#include "bpf_load.h" | ||
|
||
/* This program verifies bpf attachment to tracepoint sys_enter_* and sys_exit_*. | ||
* This requires kernel CONFIG_FTRACE_SYSCALLS to be set. | ||
*/ | ||
|
||
static void verify_map(int map_id) | ||
{ | ||
__u32 key = 0; | ||
__u32 val; | ||
|
||
if (bpf_map_lookup_elem(map_id, &key, &val) != 0) { | ||
fprintf(stderr, "map_lookup failed: %s\n", strerror(errno)); | ||
return; | ||
} | ||
if (val == 0) | ||
fprintf(stderr, "failed: map #%d returns value 0\n", map_id); | ||
} | ||
|
||
int main(int argc, char **argv) | ||
{ | ||
struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; | ||
char filename[256]; | ||
int fd; | ||
|
||
setrlimit(RLIMIT_MEMLOCK, &r); | ||
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); | ||
|
||
if (load_bpf_file(filename)) { | ||
fprintf(stderr, "%s", bpf_log_buf); | ||
return 1; | ||
} | ||
|
||
/* current load_bpf_file has perf_event_open default pid = -1 | ||
* and cpu = 0, which permits attached bpf execution on | ||
* all cpus for all pid's. bpf program execution ignores | ||
* cpu affinity. | ||
*/ | ||
/* trigger some "open" operations */ | ||
fd = open(filename, O_RDONLY); | ||
if (fd < 0) { | ||
fprintf(stderr, "open failed: %s\n", strerror(errno)); | ||
return 1; | ||
} | ||
close(fd); | ||
|
||
/* verify the map */ | ||
verify_map(map_fd[0]); | ||
verify_map(map_fd[1]); | ||
|
||
return 0; | ||
} |