diff --git a/src/task_bulk.bpf.c b/src/task_bulk.bpf.c index b20758104dea1e10a5a4f12bc395ef2d2aa17e34..999558b2c2bfc08e3651c8ef536d6c33d2e2421a 100644 --- a/src/task_bulk.bpf.c +++ b/src/task_bulk.bpf.c @@ -9,14 +9,15 @@ char LICENSE[] SEC("license") = "Dual BSD/GPL"; char *dir; +size_t nr_syscalls; int fds[SIZE]; SEC("task") -int entry(long **ctx) +int openv(long **ctx) { int err = 0; - for (int i = 0; i < SIZE; i++) { + for (int i = 0; i < SIZE && i < nr_syscalls; i++) { int fd = bpf_task_sys_open_3((uint64_t) dir, O_TMPFILE | O_RDWR, 0777); if (fd == -1) { err = -1; @@ -25,7 +26,16 @@ int entry(long **ctx) fds[i] = fd; } - for (int i = 0; i < SIZE; i++) { +end: + return err; +} + +SEC("task") +int closev(long **ctx) +{ + int err = 0; + + for (int i = 0; i < SIZE && i < nr_syscalls; i++) { err = bpf_task_sys_close_1(fds[i]); if (err) { break; diff --git a/src/task_bulk.c b/src/task_bulk.c index b4c12f02d5423bea655b310ec06eb8d8f26998c0..c63d2ac24427e9bc4a8ec3b7163baa01743b24cf 100644 --- a/src/task_bulk.c +++ b/src/task_bulk.c @@ -41,12 +41,12 @@ static void bump_memlock_rlimit(void) } static void print_usage(char **argv) { - fprintf(stderr, "Usage: %s user|bpf <init> <iter>", argv[0]); + fprintf(stderr, "Usage: %s user|bpf <nr_init> <iter> <nr_syscalls>", argv[0]); } int main(int argc, char **argv) { - if (argc != 4) { + if (argc != 5) { print_usage(argv); return 1; } @@ -61,8 +61,8 @@ int main(int argc, char **argv) return 1; } - int init = atoi(argv[2]); - if (init < 0) { + int nr_init = atoi(argv[2]); + if (nr_init < 0) { print_usage(argv); return 1; } @@ -73,8 +73,14 @@ int main(int argc, char **argv) return 1; } + int nr_syscalls = atoi(argv[4]); + if (nr_syscalls < 0) { + print_usage(argv); + return 1; + } + int err = 0; - for (int k = 0; k < init; k++) { + for (int k = 0; k < nr_init; k++) { if (user) { int *fds = malloc(sizeof(int) * SIZE); if (fds == NULL) { @@ -82,7 +88,7 @@ int main(int argc, char **argv) } for (int j = 0; j < iter; j++) { - for (int i = 0; i < SIZE; i++) { + for (int i = 0; i < SIZE && i < nr_syscalls; i++) { int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); if (fd == -1) { perror("open"); @@ -90,7 +96,7 @@ int main(int argc, char **argv) } fds[i] = fd; } - for (int i = 0; i < SIZE; i++) { + for (int i = 0; i < SIZE && i < nr_syscalls; i++) { err = close(fds[i]); if (err) { perror("close"); @@ -103,9 +109,6 @@ int main(int argc, char **argv) } else { struct task_bulk_bpf *skel; - /* Set up libbpf errors and debug info callback */ - /* libbpf_set_print(libbpf_print_fn); */ - /* Bump RLIMIT_MEMLOCK to allow BPF sub-system to do anything */ bump_memlock_rlimit(); @@ -117,6 +120,7 @@ int main(int argc, char **argv) } skel->bss->dir = "/tmp"; + skel->bss->nr_syscalls = nr_syscalls; /* Load & verify BPF programs */ err = task_bulk_bpf__load(skel); @@ -125,10 +129,19 @@ int main(int argc, char **argv) goto cleanup; } - int prog_fd = bpf_program__fd(skel->progs.entry); + int open_prog_fd = bpf_program__fd(skel->progs.openv); + int close_prog_fd = bpf_program__fd(skel->progs.closev); for (int j = 0; j < iter; j++) { - err = syscall(SYS_bpftask, prog_fd, NULL); + err = syscall(SYS_bpftask, open_prog_fd, NULL); + if (err) { + break; + } + + err = syscall(SYS_bpftask, close_prog_fd, NULL); + if (err) { + break; + } } cleanup: