From 09cee55c78fe5c165c7d7c21f596c23831f844e1 Mon Sep 17 00:00:00 2001 From: Jerome Marchand Date: Tue, 19 Apr 2022 18:02:13 +0200 Subject: [PATCH] Revert libbpf 1.0 changes Revert "libbpf-tools: remove now unnecessary bump_memlock_rlimit()" This reverts commit 5d8f5c45b16c389bb342d2b80c9f5e13e4f3b112. Revert "libbpf-tools: update vfsstat for libbpf 1.0" This reverts commit f083d3dc37372e555133519cb417f893c431eef0. Revert "libbpf-tools: update tcprtt for libbpf 1.0" This reverts commit a5b6c3cb2d20718ef002e7447046fad877590b91. Revert "libbpf-tools: update tcpconnlat for libbpf 1.0" This reverts commit aae06012af8cc8c2b592340f8783a2873aad2023. Revert "libbpf-tools: update tcpconnect for libbpf 1.0" This reverts commit 4051a9e83cb68733af20ce263fcc41c8aadc2622. Revert "libbpf-tools: update syscount for libbpf 1.0" This reverts commit d2dc7bcd0d94ef54e336119a2a79113b87839820. Revert "libbpf-tools: update statsnoop for libbpf 1.0" This reverts commit 0e348e5ed66aabd0cd5c0c75932f245bd1385b3b. Revert "libbpf-tools: update solisten for libbpf 1.0" This reverts commit 60dd074e26e762727e685334999bec5851adaef9. Revert "libbpf-tools: update softirqs for libbpf 1.0" This reverts commit 92806a435c2e1b248acdb9d0dc5b3eedc86994b0. Revert "libbpf-tools: update runqslower for libbpf 1.0" This reverts commit e6477620ccfc9abe10f7e630e65381204daa5ba8. Revert "libbpf-tools: update runqlen for libbpf 1.0" This reverts commit a7f0148372018140940d66f8faf53cb5add1e858. Revert "libbpf-tools: update runqlat for libbpf 1.0" This reverts commit 865f990b7139dca166a43bbc8159f6acd4bfbee6. Revert "libbpf-tools: update readahead for libbpf 1.0" This reverts commit 3c5dae6380dcc2034a8746c648e3bb24ea61f886. Revert "libbpf-tools: update opensnoop for libbpf 1.0" This reverts commit 34a680ba8da7e61befad67ebccb69c5041e9e288. Revert "libbpf-tools: update offcputime for libbpf 1.0" This reverts commit 5ef6d9922841d7cfde1994c25ccbac53858ed99f. Revert "libbpf-tools: update numamove for libbpf 1.0" This reverts commit 824ffd2a1fbb527f5fd25e2caa4b43fbf1ee858b. Revert "libbpf-tools: update mountsnoop for libbpf 1.0" This reverts commit 08301e93e5cea8575d5dc4b66fb7a76cebd5969b. Revert "libbpf-tools: update llcstat for libbpf 1.0" This reverts commit dbee9ea8ede33166fa70ecc33af7d7721ef26280. Revert "libbpf-tools: update hardirqs for libbpf 1.0" This reverts commit 8fcf08c81d30d80f89f995f79ef3246ce99c72dd. Revert "libbpf-tools: update gethostlatency for libbpf 1.0" This reverts commit 54a239abd21df9d6fc5d8db7ae7a26c5d8db2440. Revert "libbpf-tools: update funclatency for libbpf 1.0" This reverts commit d7b3ed3a8b2169087534738670d108489711f2d1. Revert "libbpf-tools: update fsslower for libbpf 1.0" This reverts commit 511ab72f046848d6df3f7c6ec0411b1609e165fb. Revert "libbpf-tools: update fsdist for libbpf 1.0" This reverts commit 21586658c86e1a20e9195d8715d37d714be93bb6. Revert "libbpf-tools: update filetop for libbpf 1.0" This reverts commit e6d151227f56433a317790d56ba7875ccae00448. Revert "libbpf-tools: update filelife for libbpf 1.0" This reverts commit 4ca8dd95efb7c4f149b889b700beeda036ebe822. Revert "libbpf-tools: update exitsnoop for libbpf 1.0" This reverts commit 0a035be644cf818354f3faab25a74e005a66d954. Revert "libbpf-tools: update execsnoop for libbpf 1.0" This reverts commit 7da38aabbefa41b8553e9fdec7744a5e423b5119. Revert "libbpf-tools: update cpudist for libbpf 1.0" This reverts commit dab1d09ef49e74c4c95f933e97e16dfc074338c2. Revert "libbpf-tools: update drsnoop for libbpf 1.0" This reverts commit 9cfdf5e04b32ca079a634ff60de7c08e3c41ccf5. Revert "libbpf-tools: fix cpufreq.bpf.c and update cpufreq for libbpf 1.0" This reverts commit f2006eaa5901d6ccf51d24b18c644f2fb1d41757. Revert "libbpf-tools: update cachestat for libbpf 1.0" This reverts commit 4970d23f9ff308c5860612ad6395d7692b05104e. Revert "libbpf-tools: update bitesize for libbpf 1.0" This reverts commit 7bea6c4ad9a460fc34eb618e488e44ca014e8ac7. Revert "libbpf-tools: update biostacks for libbpf 1.0" This reverts commit 49bb367628500104411d42851194162bec5d1f4c. Revert "libbpf-tools: update biosnoop for libbpf 1.0" This reverts commit 519ed8cf9c0daff75ecb3f435a3efec2087945a6. Revert "libbpf-tools: update biopattern for libbpf 1.0" This reverts commit c5b17e65a6e59fae1223bf493648050643ad9179. Revert "libbpf-tools: update biolatency for libbpf 1.0" This reverts commit 24d723699fbeeb8686acabc09ecefcceb749b9e0. Revert "libbpf-tools: update bindsnoop for libbpf 1.0" This reverts commit 7f2f4c4123a55438754b1a29f7ad3d3cfdbc7373. Revert "libbpf-tools: update ksnoop for libbpf 1.0" This reverts commit 18dc2ac7d84a854e2f5ac9ce1b532a0c59acf49e. Revert "libbpf-tools: update bashreadline for libbpf 1.0" This reverts commit 2cf0ba491d16386529c50ff0a9ec3eb9f86a2493. Signed-off-by: Jerome Marchand --- libbpf-tools/bashreadline.c | 24 ++++++++----- libbpf-tools/bindsnoop.c | 21 +++++++---- libbpf-tools/biolatency.c | 28 +++++++++------ libbpf-tools/biopattern.c | 7 +++- libbpf-tools/biosnoop.c | 67 +++++++++++++++++++++-------------- libbpf-tools/biostacks.c | 39 ++++++++++++-------- libbpf-tools/bitesize.c | 7 +++- libbpf-tools/cachestat.c | 7 +++- libbpf-tools/cpudist.c | 7 +++- libbpf-tools/cpufreq.bpf.c | 11 ------ libbpf-tools/cpufreq.c | 15 +++++--- libbpf-tools/drsnoop.c | 21 +++++++---- libbpf-tools/execsnoop.c | 22 ++++++++---- libbpf-tools/exitsnoop.c | 20 +++++++---- libbpf-tools/filelife.c | 21 +++++++---- libbpf-tools/filetop.c | 6 +++- libbpf-tools/fsdist.c | 38 +++++++++++++------- libbpf-tools/fsslower.c | 46 ++++++++++++++++-------- libbpf-tools/funclatency.c | 32 ++++++++++------- libbpf-tools/gethostlatency.c | 49 +++++++++++++++---------- libbpf-tools/hardirqs.c | 34 +++++++++++------- libbpf-tools/ksnoop.c | 65 ++++++++++++++++----------------- libbpf-tools/llcstat.bpf.c | 4 +-- libbpf-tools/llcstat.c | 13 +++++-- libbpf-tools/mountsnoop.c | 20 +++++++---- libbpf-tools/numamove.c | 16 ++++++--- libbpf-tools/offcputime.c | 7 +++- libbpf-tools/opensnoop.c | 21 +++++++---- libbpf-tools/readahead.c | 7 +++- libbpf-tools/runqlat.c | 7 +++- libbpf-tools/runqlen.c | 13 +++++-- libbpf-tools/runqslower.c | 22 ++++++++---- libbpf-tools/softirqs.c | 7 +++- libbpf-tools/solisten.c | 20 +++++++---- libbpf-tools/statsnoop.c | 20 +++++++---- libbpf-tools/syscount.c | 18 ++++++---- libbpf-tools/tcpconnect.c | 25 ++++++++----- libbpf-tools/tcpconnlat.c | 24 +++++++++---- libbpf-tools/tcprtt.c | 7 +++- libbpf-tools/trace_helpers.c | 22 ++++++++---- libbpf-tools/trace_helpers.h | 1 + libbpf-tools/vfsstat.c | 8 ++++- 42 files changed, 576 insertions(+), 293 deletions(-) diff --git a/libbpf-tools/bashreadline.c b/libbpf-tools/bashreadline.c index 2fcb2e2c..ab3b955e 100644 --- a/libbpf-tools/bashreadline.c +++ b/libbpf-tools/bashreadline.c @@ -149,6 +149,7 @@ int main(int argc, char **argv) .doc = argp_program_doc, }; struct bashreadline_bpf *obj = NULL; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; char *readline_so_path; off_t func_off; @@ -165,7 +166,11 @@ int main(int argc, char **argv) return 1; } - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + goto cleanup; + } libbpf_set_print(libbpf_print_fn); obj = bashreadline_bpf__open_and_load(); @@ -182,16 +187,17 @@ int main(int argc, char **argv) obj->links.printret = bpf_program__attach_uprobe(obj->progs.printret, true, -1, readline_so_path, func_off); - if (!obj->links.printret) { - err = -errno; + err = libbpf_get_error(obj->links.printret); + if (err) { warn("failed to attach readline: %d\n", err); goto cleanup; } - pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; + pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, &pb_opts); + err = libbpf_get_error(pb); + if (err) { warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -205,8 +211,8 @@ int main(int argc, char **argv) printf("%-9s %-7s %s\n", "TIME", "PID", "COMMAND"); while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + warn("error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } err = 0; diff --git a/libbpf-tools/bindsnoop.c b/libbpf-tools/bindsnoop.c index 5d87d484..c75b57e0 100644 --- a/libbpf-tools/bindsnoop.c +++ b/libbpf-tools/bindsnoop.c @@ -174,6 +174,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct bindsnoop_bpf *obj; int err, port_map_fd; @@ -184,7 +185,11 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); obj = bindsnoop_bpf__open(); @@ -219,10 +224,12 @@ int main(int argc, char **argv) goto cleanup; } - pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; + pb = perf_buffer__new(bpf_map__fd(obj->maps.events), + PERF_BUFFER_PAGES, &pb_opts); + err = libbpf_get_error(pb); + if (err) { warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -240,8 +247,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + warn("error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/biolatency.c b/libbpf-tools/biolatency.c index 51afa509..f2cf5ffd 100644 --- a/libbpf-tools/biolatency.c +++ b/libbpf-tools/biolatency.c @@ -255,9 +255,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = biolatency_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -308,22 +313,25 @@ int main(int argc, char **argv) } if (env.queued) { - obj->links.block_rq_insert = bpf_program__attach(obj->progs.block_rq_insert); - if (!obj->links.block_rq_insert) { - err = -errno; + obj->links.block_rq_insert = + bpf_program__attach(obj->progs.block_rq_insert); + err = libbpf_get_error(obj->links.block_rq_insert); + if (err) { fprintf(stderr, "failed to attach: %s\n", strerror(-err)); goto cleanup; } } - obj->links.block_rq_issue = bpf_program__attach(obj->progs.block_rq_issue); - if (!obj->links.block_rq_issue) { - err = -errno; + obj->links.block_rq_issue = + bpf_program__attach(obj->progs.block_rq_issue); + err = libbpf_get_error(obj->links.block_rq_issue); + if (err) { fprintf(stderr, "failed to attach: %s\n", strerror(-err)); goto cleanup; } - obj->links.block_rq_complete = bpf_program__attach(obj->progs.block_rq_complete); - if (!obj->links.block_rq_complete) { - err = -errno; + obj->links.block_rq_complete = + bpf_program__attach(obj->progs.block_rq_complete); + err = libbpf_get_error(obj->links.block_rq_complete); + if (err) { fprintf(stderr, "failed to attach: %s\n", strerror(-err)); goto cleanup; } diff --git a/libbpf-tools/biopattern.c b/libbpf-tools/biopattern.c index 92324702..2cc0d9a3 100644 --- a/libbpf-tools/biopattern.c +++ b/libbpf-tools/biopattern.c @@ -172,9 +172,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = biopattern_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/biosnoop.c b/libbpf-tools/biosnoop.c index f0f665a6..618af38e 100644 --- a/libbpf-tools/biosnoop.c +++ b/libbpf-tools/biosnoop.c @@ -190,6 +190,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct ksyms *ksyms = NULL; struct biosnoop_bpf *obj; @@ -202,9 +203,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = biosnoop_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -251,55 +257,64 @@ int main(int argc, char **argv) } } - obj->links.blk_account_io_start = bpf_program__attach(obj->progs.blk_account_io_start); - if (!obj->links.blk_account_io_start) { - err = -errno; + obj->links.blk_account_io_start = + bpf_program__attach(obj->progs.blk_account_io_start); + err = libbpf_get_error(obj->links.blk_account_io_start); + if (err) { fprintf(stderr, "failed to attach blk_account_io_start: %s\n", - strerror(-err)); + strerror(err)); goto cleanup; } ksyms = ksyms__load(); if (!ksyms) { - err = -ENOMEM; fprintf(stderr, "failed to load kallsyms\n"); goto cleanup; } if (ksyms__get_symbol(ksyms, "blk_account_io_merge_bio")) { obj->links.blk_account_io_merge_bio = bpf_program__attach(obj->progs.blk_account_io_merge_bio); - if (!obj->links.blk_account_io_merge_bio) { - err = -errno; - fprintf(stderr, "failed to attach blk_account_io_merge_bio: %s\n", - strerror(-err)); + err = libbpf_get_error(obj->links.blk_account_io_merge_bio); + if (err) { + fprintf(stderr, "failed to attach " + "blk_account_io_merge_bio: %s\n", + strerror(err)); goto cleanup; } } if (env.queued) { obj->links.block_rq_insert = bpf_program__attach(obj->progs.block_rq_insert); - if (!obj->links.block_rq_insert) { - err = -errno; - fprintf(stderr, "failed to attach block_rq_insert: %s\n", strerror(-err)); + err = libbpf_get_error(obj->links.block_rq_insert); + if (err) { + fprintf(stderr, "failed to attach block_rq_insert: %s\n", + strerror(err)); goto cleanup; } } - obj->links.block_rq_issue = bpf_program__attach(obj->progs.block_rq_issue); - if (!obj->links.block_rq_issue) { - err = -errno; - fprintf(stderr, "failed to attach block_rq_issue: %s\n", strerror(-err)); + obj->links.block_rq_issue = + bpf_program__attach(obj->progs.block_rq_issue); + err = libbpf_get_error(obj->links.block_rq_issue); + if (err) { + fprintf(stderr, "failed to attach block_rq_issue: %s\n", + strerror(err)); goto cleanup; } - obj->links.block_rq_complete = bpf_program__attach(obj->progs.block_rq_complete); - if (!obj->links.block_rq_complete) { - err = -errno; - fprintf(stderr, "failed to attach block_rq_complete: %s\n", strerror(-err)); + obj->links.block_rq_complete = + bpf_program__attach(obj->progs.block_rq_complete); + err = libbpf_get_error(obj->links.block_rq_complete); + if (err) { + fprintf(stderr, "failed to attach block_rq_complete: %s\n", + strerror(err)); goto cleanup; } + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; fprintf(stderr, "failed to open perf buffer: %d\n", err); goto cleanup; } @@ -323,8 +338,8 @@ int main(int argc, char **argv) /* main: poll */ while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } if (env.duration && get_ktime_ns() > time_end) diff --git a/libbpf-tools/biostacks.c b/libbpf-tools/biostacks.c index 260bc235..c98fd532 100644 --- a/libbpf-tools/biostacks.c +++ b/libbpf-tools/biostacks.c @@ -145,9 +145,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = biostacks_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -179,10 +184,12 @@ int main(int argc, char **argv) goto cleanup; } - obj->links.blk_account_io_start = bpf_program__attach(obj->progs.blk_account_io_start); - if (!obj->links.blk_account_io_start) { - err = -errno; - fprintf(stderr, "failed to attach blk_account_io_start: %s\n", strerror(-err)); + obj->links.blk_account_io_start = + bpf_program__attach(obj->progs.blk_account_io_start); + err = libbpf_get_error(obj->links.blk_account_io_start); + if (err) { + fprintf(stderr, "failed to attach blk_account_io_start: %s\n", + strerror(err)); goto cleanup; } ksyms = ksyms__load(); @@ -192,19 +199,23 @@ int main(int argc, char **argv) } if (ksyms__get_symbol(ksyms, "blk_account_io_merge_bio")) { obj->links.blk_account_io_merge_bio = - bpf_program__attach(obj->progs.blk_account_io_merge_bio); - if (!obj->links.blk_account_io_merge_bio) { - err = -errno; - fprintf(stderr, "failed to attach blk_account_io_merge_bio: %s\n", - strerror(-err)); + bpf_program__attach(obj-> + progs.blk_account_io_merge_bio); + err = libbpf_get_error(obj-> + links.blk_account_io_merge_bio); + if (err) { + fprintf(stderr, "failed to attach " + "blk_account_io_merge_bio: %s\n", + strerror(err)); goto cleanup; } } - obj->links.blk_account_io_done = bpf_program__attach(obj->progs.blk_account_io_done); - if (!obj->links.blk_account_io_done) { - err = -errno; + obj->links.blk_account_io_done = + bpf_program__attach(obj->progs.blk_account_io_done); + err = libbpf_get_error(obj->links.blk_account_io_done); + if (err) { fprintf(stderr, "failed to attach blk_account_io_done: %s\n", - strerror(-err)); + strerror(err)); goto cleanup; } diff --git a/libbpf-tools/bitesize.c b/libbpf-tools/bitesize.c index 4c371508..41b1a7db 100644 --- a/libbpf-tools/bitesize.c +++ b/libbpf-tools/bitesize.c @@ -167,9 +167,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = bitesize_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/cachestat.c b/libbpf-tools/cachestat.c index 05785251..abc81878 100644 --- a/libbpf-tools/cachestat.c +++ b/libbpf-tools/cachestat.c @@ -139,9 +139,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = cachestat_bpf__open_and_load(); if (!obj) { fprintf(stderr, "failed to open and/or load BPF object\n"); diff --git a/libbpf-tools/cpudist.c b/libbpf-tools/cpudist.c index f76d8a67..035100ea 100644 --- a/libbpf-tools/cpudist.c +++ b/libbpf-tools/cpudist.c @@ -197,9 +197,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = cpudist_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/cpufreq.bpf.c b/libbpf-tools/cpufreq.bpf.c index 88a1bd25..697620ba 100644 --- a/libbpf-tools/cpufreq.bpf.c +++ b/libbpf-tools/cpufreq.bpf.c @@ -17,21 +17,11 @@ struct { __type(value, struct hist); } hists SEC(".maps"); -#define clamp_umax(VAR, UMAX) \ - asm volatile ( \ - "if %0 <= %[max] goto +1\n" \ - "%0 = %[max]\n" \ - : "+r"(VAR) \ - : [max]"i"(UMAX) \ - ) - SEC("tp_btf/cpu_frequency") int BPF_PROG(cpu_frequency, unsigned int state, unsigned int cpu_id) { if (cpu_id >= MAX_CPU_NR) return 0; - - clamp_umax(cpu_id, MAX_CPU_NR - 1); freqs_mhz[cpu_id] = state / 1000; return 0; } @@ -46,7 +36,6 @@ int do_sample(struct bpf_perf_event_data *ctx) if (cpu >= MAX_CPU_NR) return 0; - clamp_umax(cpu, MAX_CPU_NR - 1); freq_mhz = freqs_mhz[cpu]; if (!freq_mhz) return 0; diff --git a/libbpf-tools/cpufreq.c b/libbpf-tools/cpufreq.c index c5839560..65876587 100644 --- a/libbpf-tools/cpufreq.c +++ b/libbpf-tools/cpufreq.c @@ -102,8 +102,10 @@ static int open_and_attach_perf_event(int freq, struct bpf_program *prog, return -1; } links[i] = bpf_program__attach_perf_event(prog, fd); - if (!links[i]) { - fprintf(stderr, "failed to attach perf event on cpu: %d\n", i); + if (libbpf_get_error(links[i])) { + fprintf(stderr, "failed to attach perf event on cpu: " + "%d\n", i); + links[i] = NULL; close(fd); return -1; } @@ -173,7 +175,7 @@ static void print_linear_hists(struct bpf_map *hists, printf("\n"); print_linear_hist(bss->syswide.slots, MAX_SLOTS, 0, HIST_STEP_SIZE, - "syswide"); + "syswide"); } int main(int argc, char **argv) @@ -191,9 +193,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + nr_cpus = libbpf_num_possible_cpus(); if (nr_cpus < 0) { fprintf(stderr, "failed to get # of possible cpus: '%s'!\n", diff --git a/libbpf-tools/drsnoop.c b/libbpf-tools/drsnoop.c index 705db9a4..89285871 100644 --- a/libbpf-tools/drsnoop.c +++ b/libbpf-tools/drsnoop.c @@ -146,6 +146,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct ksyms *ksyms = NULL; const struct ksym *ksym; @@ -157,9 +158,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = drsnoop_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -207,10 +213,13 @@ int main(int argc, char **argv) printf(" %8s", "FREE(KB)"); printf("\n"); + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; fprintf(stderr, "failed to open perf buffer: %d\n", err); goto cleanup; } @@ -228,8 +237,8 @@ int main(int argc, char **argv) /* main: poll */ while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } if (env.duration && get_ktime_ns() > time_end) diff --git a/libbpf-tools/execsnoop.c b/libbpf-tools/execsnoop.c index 38294816..1fd573da 100644 --- a/libbpf-tools/execsnoop.c +++ b/libbpf-tools/execsnoop.c @@ -263,6 +263,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct execsnoop_bpf *obj; int err; @@ -271,9 +272,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = execsnoop_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -311,10 +317,12 @@ int main(int argc, char **argv) printf("%-16s %-6s %-6s %3s %s\n", "PCOMM", "PID", "PPID", "RET", "ARGS"); /* setup event callbacks */ - pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; + pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; fprintf(stderr, "failed to open perf buffer: %d\n", err); goto cleanup; } @@ -328,8 +336,8 @@ int main(int argc, char **argv) /* main: poll */ while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/exitsnoop.c b/libbpf-tools/exitsnoop.c index bca9d4d3..410e00da 100644 --- a/libbpf-tools/exitsnoop.c +++ b/libbpf-tools/exitsnoop.c @@ -152,6 +152,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct exitsnoop_bpf *obj; int err; @@ -160,7 +161,11 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); obj = exitsnoop_bpf__open(); @@ -185,10 +190,11 @@ int main(int argc, char **argv) goto cleanup; } - pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; + pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, &pb_opts); + err = libbpf_get_error(pb); + if (err) { warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -206,8 +212,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + warn("error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/filelife.c b/libbpf-tools/filelife.c index ba6b9440..1f94039e 100644 --- a/libbpf-tools/filelife.c +++ b/libbpf-tools/filelife.c @@ -110,6 +110,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct filelife_bpf *obj; int err; @@ -118,9 +119,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = filelife_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -145,10 +151,13 @@ int main(int argc, char **argv) printf("Tracing the lifespan of short-lived files ... Hit Ctrl-C to end.\n"); printf("%-8s %-6s %-16s %-7s %s\n", "TIME", "PID", "COMM", "AGE(s)", "FILE"); + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; fprintf(stderr, "failed to open perf buffer: %d\n", err); goto cleanup; } @@ -161,8 +170,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/filetop.c b/libbpf-tools/filetop.c index 70240d85..f1f7ba96 100644 --- a/libbpf-tools/filetop.c +++ b/libbpf-tools/filetop.c @@ -268,7 +268,11 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); obj = filetop_bpf__open(); diff --git a/libbpf-tools/fsdist.c b/libbpf-tools/fsdist.c index f411d162..782a0e6a 100644 --- a/libbpf-tools/fsdist.c +++ b/libbpf-tools/fsdist.c @@ -299,44 +299,53 @@ static int attach_kprobes(struct fsdist_bpf *obj) /* READ */ obj->links.file_read_entry = bpf_program__attach_kprobe(obj->progs.file_read_entry, false, cfg->op_funcs[READ]); - if (!obj->links.file_read_entry) + err = libbpf_get_error(obj->links.file_read_entry); + if (err) goto errout; obj->links.file_read_exit = bpf_program__attach_kprobe(obj->progs.file_read_exit, true, cfg->op_funcs[READ]); - if (!obj->links.file_read_exit) + err = libbpf_get_error(obj->links.file_read_exit); + if (err) goto errout; /* WRITE */ obj->links.file_write_entry = bpf_program__attach_kprobe(obj->progs.file_write_entry, false, cfg->op_funcs[WRITE]); - if (!obj->links.file_write_entry) + err = libbpf_get_error(obj->links.file_write_entry); + if (err) goto errout; obj->links.file_write_exit = bpf_program__attach_kprobe(obj->progs.file_write_exit, true, cfg->op_funcs[WRITE]); - if (!obj->links.file_write_exit) + err = libbpf_get_error(obj->links.file_write_exit); + if (err) goto errout; /* OPEN */ obj->links.file_open_entry = bpf_program__attach_kprobe(obj->progs.file_open_entry, false, cfg->op_funcs[OPEN]); - if (!obj->links.file_open_entry) + err = libbpf_get_error(obj->links.file_open_entry); + if (err) goto errout; obj->links.file_open_exit = bpf_program__attach_kprobe(obj->progs.file_open_exit, true, cfg->op_funcs[OPEN]); - if (!obj->links.file_open_exit) + err = libbpf_get_error(obj->links.file_open_exit); + if (err) goto errout; /* FSYNC */ obj->links.file_sync_entry = bpf_program__attach_kprobe(obj->progs.file_sync_entry, false, cfg->op_funcs[FSYNC]); - if (!obj->links.file_sync_entry) + err = libbpf_get_error(obj->links.file_sync_entry); + if (err) goto errout; obj->links.file_sync_exit = bpf_program__attach_kprobe(obj->progs.file_sync_exit, true, cfg->op_funcs[FSYNC]); - if (!obj->links.file_sync_exit) + err = libbpf_get_error(obj->links.file_sync_exit); + if (err) goto errout; /* GETATTR */ if (!cfg->op_funcs[GETATTR]) return 0; obj->links.getattr_entry = bpf_program__attach_kprobe(obj->progs.getattr_entry, false, cfg->op_funcs[GETATTR]); - if (!obj->links.getattr_entry) + err = libbpf_get_error(obj->links.getattr_entry); + if (err) goto errout; obj->links.getattr_exit = bpf_program__attach_kprobe(obj->progs.getattr_exit, true, cfg->op_funcs[GETATTR]); - if (!obj->links.getattr_exit) + err = libbpf_get_error(obj->links.getattr_exit); + if (err) goto errout; return 0; errout: - err = -errno; warn("failed to attach kprobe: %ld\n", err); return err; } @@ -364,9 +373,14 @@ int main(int argc, char **argv) return 1; } - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } + skel = fsdist_bpf__open(); if (!skel) { warn("failed to open BPF object\n"); diff --git a/libbpf-tools/fsslower.c b/libbpf-tools/fsslower.c index e96c9efa..2975b493 100644 --- a/libbpf-tools/fsslower.c +++ b/libbpf-tools/fsslower.c @@ -256,36 +256,43 @@ static int attach_kprobes(struct fsslower_bpf *obj) /* READ */ obj->links.file_read_entry = bpf_program__attach_kprobe(obj->progs.file_read_entry, false, cfg->op_funcs[READ]); - if (!obj->links.file_read_entry) + err = libbpf_get_error(obj->links.file_read_entry); + if (err) goto errout; obj->links.file_read_exit = bpf_program__attach_kprobe(obj->progs.file_read_exit, true, cfg->op_funcs[READ]); - if (!obj->links.file_read_exit) + err = libbpf_get_error(obj->links.file_read_exit); + if (err) goto errout; /* WRITE */ obj->links.file_write_entry = bpf_program__attach_kprobe(obj->progs.file_write_entry, false, cfg->op_funcs[WRITE]); - if (!obj->links.file_write_entry) + err = libbpf_get_error(obj->links.file_write_entry); + if (err) goto errout; obj->links.file_write_exit = bpf_program__attach_kprobe(obj->progs.file_write_exit, true, cfg->op_funcs[WRITE]); - if (!obj->links.file_write_exit) + err = libbpf_get_error(obj->links.file_write_exit); + if (err) goto errout; /* OPEN */ obj->links.file_open_entry = bpf_program__attach_kprobe(obj->progs.file_open_entry, false, cfg->op_funcs[OPEN]); - if (!obj->links.file_open_entry) + err = libbpf_get_error(obj->links.file_open_entry); + if (err) goto errout; obj->links.file_open_exit = bpf_program__attach_kprobe(obj->progs.file_open_exit, true, cfg->op_funcs[OPEN]); - if (!obj->links.file_open_exit) + err = libbpf_get_error(obj->links.file_open_exit); + if (err) goto errout; /* FSYNC */ obj->links.file_sync_entry = bpf_program__attach_kprobe(obj->progs.file_sync_entry, false, cfg->op_funcs[FSYNC]); - if (!obj->links.file_sync_entry) + err = libbpf_get_error(obj->links.file_sync_entry); + if (err) goto errout; obj->links.file_sync_exit = bpf_program__attach_kprobe(obj->progs.file_sync_exit, true, cfg->op_funcs[FSYNC]); - if (!obj->links.file_sync_exit) + err = libbpf_get_error(obj->links.file_sync_exit); + if (err) goto errout; return 0; errout: - err = -errno; warn("failed to attach kprobe: %ld\n", err); return err; } @@ -354,6 +361,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct fsslower_bpf *skel; __u64 time_end = 0; @@ -369,9 +377,14 @@ int main(int argc, char **argv) return 1; } - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } + skel = fsslower_bpf__open(); if (!skel) { warn("failed to open BPF object\n"); @@ -415,10 +428,13 @@ int main(int argc, char **argv) goto cleanup; } + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(skel->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -437,8 +453,8 @@ int main(int argc, char **argv) /* main: poll */ while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } if (duration && get_ktime_ns() > time_end) diff --git a/libbpf-tools/funclatency.c b/libbpf-tools/funclatency.c index 3ea0fec3..b079292e 100644 --- a/libbpf-tools/funclatency.c +++ b/libbpf-tools/funclatency.c @@ -185,18 +185,20 @@ static int attach_kprobes(struct funclatency_bpf *obj) { long err; - obj->links.dummy_kprobe = bpf_program__attach_kprobe(obj->progs.dummy_kprobe, false, - env.funcname); - if (!obj->links.dummy_kprobe) { - err = -errno; + obj->links.dummy_kprobe = + bpf_program__attach_kprobe(obj->progs.dummy_kprobe, false, + env.funcname); + err = libbpf_get_error(obj->links.dummy_kprobe); + if (err) { warn("failed to attach kprobe: %ld\n", err); return -1; } - obj->links.dummy_kretprobe = bpf_program__attach_kprobe(obj->progs.dummy_kretprobe, true, - env.funcname); - if (!obj->links.dummy_kretprobe) { - err = -errno; + obj->links.dummy_kretprobe = + bpf_program__attach_kprobe(obj->progs.dummy_kretprobe, true, + env.funcname); + err = libbpf_get_error(obj->links.dummy_kretprobe); + if (err) { warn("failed to attach kretprobe: %ld\n", err); return -1; } @@ -237,8 +239,8 @@ static int attach_uprobes(struct funclatency_bpf *obj) obj->links.dummy_kprobe = bpf_program__attach_uprobe(obj->progs.dummy_kprobe, false, env.pid ?: -1, bin_path, func_off); - if (!obj->links.dummy_kprobe) { - err = -errno; + err = libbpf_get_error(obj->links.dummy_kprobe); + if (err) { warn("Failed to attach uprobe: %ld\n", err); goto out_binary; } @@ -246,8 +248,8 @@ static int attach_uprobes(struct funclatency_bpf *obj) obj->links.dummy_kretprobe = bpf_program__attach_uprobe(obj->progs.dummy_kretprobe, true, env.pid ?: -1, bin_path, func_off); - if (!obj->links.dummy_kretprobe) { - err = -errno; + err = libbpf_get_error(obj->links.dummy_kretprobe); + if (err) { warn("Failed to attach uretprobe: %ld\n", err); goto out_binary; } @@ -296,7 +298,11 @@ int main(int argc, char **argv) sigaction(SIGINT, &sigact, 0); - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); obj = funclatency_bpf__open(); diff --git a/libbpf-tools/gethostlatency.c b/libbpf-tools/gethostlatency.c index 9b3ebc28..12076e6a 100644 --- a/libbpf-tools/gethostlatency.c +++ b/libbpf-tools/gethostlatency.c @@ -164,14 +164,16 @@ static int attach_uprobes(struct gethostlatency_bpf *obj, struct bpf_link *links } links[0] = bpf_program__attach_uprobe(obj->progs.handle_entry, false, target_pid ?: -1, libc_path, func_off); - if (!links[0]) { - warn("failed to attach getaddrinfo: %d\n", -errno); + err = libbpf_get_error(links[0]); + if (err) { + warn("failed to attach getaddrinfo: %d\n", err); return -1; } links[1] = bpf_program__attach_uprobe(obj->progs.handle_return, true, target_pid ?: -1, libc_path, func_off); - if (!links[1]) { - warn("failed to attach getaddrinfo: %d\n", -errno); + err = libbpf_get_error(links[1]); + if (err) { + warn("failed to attach getaddrinfo: %d\n", err); return -1; } @@ -182,14 +184,16 @@ static int attach_uprobes(struct gethostlatency_bpf *obj, struct bpf_link *links } links[2] = bpf_program__attach_uprobe(obj->progs.handle_entry, false, target_pid ?: -1, libc_path, func_off); - if (!links[2]) { - warn("failed to attach gethostbyname: %d\n", -errno); + err = libbpf_get_error(links[2]); + if (err) { + warn("failed to attach gethostbyname: %d\n", err); return -1; } links[3] = bpf_program__attach_uprobe(obj->progs.handle_return, true, target_pid ?: -1, libc_path, func_off); - if (!links[3]) { - warn("failed to attach gethostbyname: %d\n", -errno); + err = libbpf_get_error(links[3]); + if (err) { + warn("failed to attach gethostbyname: %d\n", err); return -1; } @@ -200,14 +204,16 @@ static int attach_uprobes(struct gethostlatency_bpf *obj, struct bpf_link *links } links[4] = bpf_program__attach_uprobe(obj->progs.handle_entry, false, target_pid ?: -1, libc_path, func_off); - if (!links[4]) { - warn("failed to attach gethostbyname2: %d\n", -errno); + err = libbpf_get_error(links[4]); + if (err) { + warn("failed to attach gethostbyname2: %d\n", err); return -1; } links[5] = bpf_program__attach_uprobe(obj->progs.handle_return, true, target_pid ?: -1, libc_path, func_off); - if (!links[5]) { - warn("failed to attach gethostbyname2: %d\n", -errno); + err = libbpf_get_error(links[5]); + if (err) { + warn("failed to attach gethostbyname2: %d\n", err); return -1; } @@ -221,6 +227,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct bpf_link *links[6] = {}; struct gethostlatency_bpf *obj; @@ -230,7 +237,11 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); obj = gethostlatency_bpf__open(); @@ -251,10 +262,12 @@ int main(int argc, char **argv) if (err) goto cleanup; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + &pb_opts); + err = libbpf_get_error(pb); + if (err) { warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -270,8 +283,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + warn("error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/hardirqs.c b/libbpf-tools/hardirqs.c index a2475ef1..759b3949 100644 --- a/libbpf-tools/hardirqs.c +++ b/libbpf-tools/hardirqs.c @@ -185,9 +185,14 @@ int main(int argc, char **argv) return 1; } - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = hardirqs_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -207,27 +212,30 @@ int main(int argc, char **argv) } if (env.count) { - obj->links.handle__irq_handler = bpf_program__attach(obj->progs.handle__irq_handler); - if (!obj->links.handle__irq_handler) { - err = -errno; + obj->links.handle__irq_handler = + bpf_program__attach(obj->progs.handle__irq_handler); + err = libbpf_get_error(obj->links.handle__irq_handler); + if (err) { fprintf(stderr, "failed to attach irq/irq_handler_entry: %s\n", - strerror(-err)); + strerror(err)); } } else { - obj->links.irq_handler_entry = bpf_program__attach(obj->progs.irq_handler_entry); - if (!obj->links.irq_handler_entry) { - err = -errno; + obj->links.irq_handler_entry = + bpf_program__attach(obj->progs.irq_handler_entry); + err = libbpf_get_error(obj->links.irq_handler_entry); + if (err) { fprintf(stderr, "failed to attach irq_handler_entry: %s\n", - strerror(-err)); + strerror(err)); } - obj->links.irq_handler_exit_exit = bpf_program__attach(obj->progs.irq_handler_exit_exit); - if (!obj->links.irq_handler_exit_exit) { - err = -errno; + obj->links.irq_handler_exit_exit = + bpf_program__attach(obj->progs.irq_handler_exit_exit); + err = libbpf_get_error(obj->links.irq_handler_exit_exit); + if (err) { fprintf(stderr, "failed to attach irq_handler_exit: %s\n", - strerror(-err)); + strerror(err)); } } diff --git a/libbpf-tools/ksnoop.c b/libbpf-tools/ksnoop.c index a6ea6107..a5f59a0f 100644 --- a/libbpf-tools/ksnoop.c +++ b/libbpf-tools/ksnoop.c @@ -38,6 +38,7 @@ static bool verbose = false; static __u32 filter_pid; static bool stack_mode; +#define libbpf_errstr(val) strerror(-libbpf_get_error(val)) static void __p(enum log_level level, char *level_str, char *fmt, ...) { @@ -222,12 +223,14 @@ static int get_func_btf(struct btf *btf, struct func *func) return -ENOENT; } type = btf__type_by_id(btf, func->id); - if (!type || BTF_INFO_KIND(type->info) != BTF_KIND_FUNC) { + if (libbpf_get_error(type) || + BTF_INFO_KIND(type->info) != BTF_KIND_FUNC) { p_err("Error looking up function type via id '%d'", func->id); return -EINVAL; } type = btf__type_by_id(btf, type->type); - if (!type || BTF_INFO_KIND(type->info) != BTF_KIND_FUNC_PROTO) { + if (libbpf_get_error(type) || + BTF_INFO_KIND(type->info) != BTF_KIND_FUNC_PROTO) { p_err("Error looking up function proto type via id '%d'", func->id); return -EINVAL; @@ -341,16 +344,15 @@ static int trace_to_value(struct btf *btf, struct func *func, char *argname, static struct btf *get_btf(const char *name) { struct btf *mod_btf; - int err; p_debug("getting BTF for %s", name && strlen(name) > 0 ? name : "vmlinux"); if (!vmlinux_btf) { vmlinux_btf = btf__load_vmlinux_btf(); - if (!vmlinux_btf) { - err = -errno; - p_err("No BTF, cannot determine type info: %s", strerror(-err)); + if (libbpf_get_error(vmlinux_btf)) { + p_err("No BTF, cannot determine type info: %s", + libbpf_errstr(vmlinux_btf)); return NULL; } } @@ -358,9 +360,9 @@ static struct btf *get_btf(const char *name) return vmlinux_btf; mod_btf = btf__load_module_btf(name, vmlinux_btf); - if (!mod_btf) { - err = -errno; - p_err("No BTF for module '%s': %s", name, strerror(-err)); + if (libbpf_get_error(mod_btf)) { + p_err("No BTF for module '%s': %s", + name, libbpf_errstr(mod_btf)); return NULL; } return mod_btf; @@ -394,11 +396,11 @@ static char *type_id_to_str(struct btf *btf, __s32 type_id, char *str) default: do { type = btf__type_by_id(btf, type_id); - if (!type) { + + if (libbpf_get_error(type)) { name = "?"; break; } - switch (BTF_INFO_KIND(type->info)) { case BTF_KIND_CONST: case BTF_KIND_VOLATILE: @@ -553,17 +555,16 @@ static int parse_trace(char *str, struct trace *trace) return ret; } trace->btf = get_btf(func->mod); - if (!trace->btf) { - ret = -errno; + if (libbpf_get_error(trace->btf)) { p_err("could not get BTF for '%s': %s", strlen(func->mod) ? func->mod : "vmlinux", - strerror(-ret)); + libbpf_errstr(trace->btf)); return -ENOENT; } trace->dump = btf_dump__new(trace->btf, NULL, &opts, trace_printf); - if (!trace->dump) { - ret = -errno; - p_err("could not create BTF dump : %n", strerror(-ret)); + if (libbpf_get_error(trace->dump)) { + p_err("could not create BTF dump : %n", + libbpf_errstr(trace->btf)); return -EINVAL; } @@ -823,20 +824,20 @@ static int attach_traces(struct ksnoop_bpf *skel, struct trace *traces, bpf_program__attach_kprobe(skel->progs.kprobe_entry, false, traces[i].func.name); - if (!traces[i].links[0]) { - ret = -errno; + ret = libbpf_get_error(traces[i].links[0]); + if (ret) { p_err("Could not attach kprobe to '%s': %s", traces[i].func.name, strerror(-ret)); return ret; - } + } p_debug("Attached kprobe for '%s'", traces[i].func.name); traces[i].links[1] = bpf_program__attach_kprobe(skel->progs.kprobe_return, true, traces[i].func.name); - if (!traces[i].links[1]) { - ret = -errno; + ret = libbpf_get_error(traces[i].links[1]); + if (ret) { p_err("Could not attach kretprobe to '%s': %s", traces[i].func.name, strerror(-ret)); return ret; @@ -848,6 +849,7 @@ static int attach_traces(struct ksnoop_bpf *skel, struct trace *traces, static int cmd_trace(int argc, char **argv) { + struct perf_buffer_opts pb_opts = {}; struct bpf_map *perf_map, *func_map; struct perf_buffer *pb = NULL; struct ksnoop_bpf *skel; @@ -860,8 +862,7 @@ static int cmd_trace(int argc, char **argv) skel = ksnoop_bpf__open_and_load(); if (!skel) { - ret = -errno; - p_err("Could not load ksnoop BPF: %s", strerror(-ret)); + p_err("Could not load ksnoop BPF: %s", libbpf_errstr(skel)); return 1; } @@ -886,11 +887,12 @@ static int cmd_trace(int argc, char **argv) goto cleanup; } - pb = perf_buffer__new(bpf_map__fd(perf_map), pages, - trace_handler, lost_handler, NULL, NULL); - if (!pb) { - ret = -errno; - p_err("Could not create perf buffer: %s", strerror(-ret)); + pb_opts.sample_cb = trace_handler; + pb_opts.lost_cb = lost_handler; + pb = perf_buffer__new(bpf_map__fd(perf_map), pages, &pb_opts); + if (libbpf_get_error(pb)) { + p_err("Could not create perf buffer: %s", + libbpf_errstr(pb)); goto cleanup; } @@ -904,8 +906,8 @@ static int cmd_trace(int argc, char **argv) while (!exiting) { ret = perf_buffer__poll(pb, 1); - if (ret < 0 && ret != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-ret)); + if (ret < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset ret to return 0 if exiting */ @@ -1005,7 +1007,6 @@ int main(int argc, char *argv[]) if (argc < 0) usage(); - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); return cmd_select(argc, argv); diff --git a/libbpf-tools/llcstat.bpf.c b/libbpf-tools/llcstat.bpf.c index a36fc2df..fbd5b6c4 100644 --- a/libbpf-tools/llcstat.bpf.c +++ b/libbpf-tools/llcstat.bpf.c @@ -36,13 +36,13 @@ int trace_event(__u64 sample_period, bool miss) return 0; } -SEC("perf_event") +SEC("perf_event/1") int on_cache_miss(struct bpf_perf_event_data *ctx) { return trace_event(ctx->sample_period, true); } -SEC("perf_event") +SEC("perf_event/2") int on_cache_ref(struct bpf_perf_event_data *ctx) { return trace_event(ctx->sample_period, false); diff --git a/libbpf-tools/llcstat.c b/libbpf-tools/llcstat.c index be437bc2..150dd38b 100644 --- a/libbpf-tools/llcstat.c +++ b/libbpf-tools/llcstat.c @@ -106,8 +106,10 @@ static int open_and_attach_perf_event(__u64 config, int period, return -1; } links[i] = bpf_program__attach_perf_event(prog, fd); - if (!links[i]) { - fprintf(stderr, "failed to attach perf event on cpu: %d\n", i); + if (libbpf_get_error(links[i])) { + fprintf(stderr, "failed to attach perf event on cpu: " + "%d\n", i); + links[i] = NULL; close(fd); return -1; } @@ -182,9 +184,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + nr_cpus = libbpf_num_possible_cpus(); if (nr_cpus < 0) { fprintf(stderr, "failed to get # of possible cpus: '%s'!\n", diff --git a/libbpf-tools/mountsnoop.c b/libbpf-tools/mountsnoop.c index ac2acc45..0955f59e 100644 --- a/libbpf-tools/mountsnoop.c +++ b/libbpf-tools/mountsnoop.c @@ -249,6 +249,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct mountsnoop_bpf *obj; int err; @@ -257,7 +258,11 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); obj = mountsnoop_bpf__open(); @@ -280,10 +285,11 @@ int main(int argc, char **argv) goto cleanup; } - pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; + pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, &pb_opts); + err = libbpf_get_error(pb); + if (err) { warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -302,8 +308,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/numamove.c b/libbpf-tools/numamove.c index 0747f841..66a53ed6 100644 --- a/libbpf-tools/numamove.c +++ b/libbpf-tools/numamove.c @@ -80,9 +80,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = numamove_bpf__open_and_load(); if (!obj) { fprintf(stderr, "failed to open and/or load BPF object\n"); @@ -102,15 +107,18 @@ int main(int argc, char **argv) signal(SIGINT, sig_handler); - printf("%-10s %18s %18s\n", "TIME", "NUMA_migrations", "NUMA_migrations_ms"); + printf("%-10s %18s %18s\n", "TIME", "NUMA_migrations", + "NUMA_migrations_ms"); while (!exiting) { sleep(1); time(&t); tm = localtime(&t); strftime(ts, sizeof(ts), "%H:%M:%S", tm); printf("%-10s %18lld %18lld\n", ts, - __atomic_exchange_n(&obj->bss->num, 0, __ATOMIC_RELAXED), - __atomic_exchange_n(&obj->bss->latency, 0, __ATOMIC_RELAXED)); + __atomic_exchange_n(&obj->bss->num, 0, + __ATOMIC_RELAXED), + __atomic_exchange_n(&obj->bss->latency, 0, + __ATOMIC_RELAXED)); } cleanup: diff --git a/libbpf-tools/offcputime.c b/libbpf-tools/offcputime.c index 37a8ec2c..0582b158 100644 --- a/libbpf-tools/offcputime.c +++ b/libbpf-tools/offcputime.c @@ -279,9 +279,14 @@ int main(int argc, char **argv) return 1; } - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = offcputime_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/opensnoop.c b/libbpf-tools/opensnoop.c index 557a63cd..5cdac0e5 100644 --- a/libbpf-tools/opensnoop.c +++ b/libbpf-tools/opensnoop.c @@ -219,6 +219,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct opensnoop_bpf *obj; __u64 time_end = 0; @@ -228,9 +229,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = opensnoop_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -276,10 +282,13 @@ int main(int argc, char **argv) printf("%s\n", "PATH"); /* setup event callbacks */ + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; fprintf(stderr, "failed to open perf buffer: %d\n", err); goto cleanup; } @@ -297,8 +306,8 @@ int main(int argc, char **argv) /* main: poll */ while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } if (env.duration && get_ktime_ns() > time_end) diff --git a/libbpf-tools/readahead.c b/libbpf-tools/readahead.c index 17079389..77986011 100644 --- a/libbpf-tools/readahead.c +++ b/libbpf-tools/readahead.c @@ -109,9 +109,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = readahead_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/runqlat.c b/libbpf-tools/runqlat.c index 5a60b874..249bf794 100644 --- a/libbpf-tools/runqlat.c +++ b/libbpf-tools/runqlat.c @@ -193,9 +193,14 @@ int main(int argc, char **argv) return 1; } - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = runqlat_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/runqlen.c b/libbpf-tools/runqlen.c index 9cbbc739..2f6c5789 100644 --- a/libbpf-tools/runqlen.c +++ b/libbpf-tools/runqlen.c @@ -145,8 +145,10 @@ static int open_and_attach_perf_event(int freq, struct bpf_program *prog, return -1; } links[i] = bpf_program__attach_perf_event(prog, fd); - if (!links[i]) { - fprintf(stderr, "failed to attach perf event on cpu: %d\n", i); + if (libbpf_get_error(links[i])) { + fprintf(stderr, "failed to attach perf event on cpu: " + "%d\n", i); + links[i] = NULL; close(fd); return -1; } @@ -229,9 +231,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + nr_cpus = libbpf_num_possible_cpus(); if (nr_cpus < 0) { printf("failed to get # of possible cpus: '%s'!\n", diff --git a/libbpf-tools/runqslower.c b/libbpf-tools/runqslower.c index b038173e..b21894ca 100644 --- a/libbpf-tools/runqslower.c +++ b/libbpf-tools/runqslower.c @@ -145,6 +145,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct runqslower_bpf *obj; int err; @@ -153,9 +154,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = runqslower_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -185,10 +191,12 @@ int main(int argc, char **argv) else printf("%-8s %-16s %-6s %14s\n", "TIME", "COMM", "TID", "LAT(us)"); - pb = perf_buffer__new(bpf_map__fd(obj->maps.events), 64, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; + pb = perf_buffer__new(bpf_map__fd(obj->maps.events), 64, &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; fprintf(stderr, "failed to open perf buffer: %d\n", err); goto cleanup; } @@ -201,8 +209,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, 100); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/softirqs.c b/libbpf-tools/softirqs.c index 34cfdb77..f1678d4c 100644 --- a/libbpf-tools/softirqs.c +++ b/libbpf-tools/softirqs.c @@ -195,9 +195,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = softirqs_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/solisten.c b/libbpf-tools/solisten.c index adaa668d..e5812f0c 100644 --- a/libbpf-tools/solisten.c +++ b/libbpf-tools/solisten.c @@ -137,6 +137,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct solisten_bpf *obj; int err; @@ -145,7 +146,11 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); obj = solisten_bpf__open(); @@ -175,10 +180,11 @@ int main(int argc, char **argv) goto cleanup; } - pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; + pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, &pb_opts); + err = libbpf_get_error(pb); + if (err) { warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -196,8 +202,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + warn("error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/statsnoop.c b/libbpf-tools/statsnoop.c index 3f8f5c58..76779da6 100644 --- a/libbpf-tools/statsnoop.c +++ b/libbpf-tools/statsnoop.c @@ -127,6 +127,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct statsnoop_bpf *obj; int err; @@ -135,9 +136,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %d\n", err); + return 1; + } libbpf_set_print(libbpf_print_fn); + obj = statsnoop_bpf__open(); if (!obj) { warn("failed to open BPF object\n"); @@ -159,10 +165,12 @@ int main(int argc, char **argv) goto cleanup; } + pb_opts.sample_cb = handle_event; + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + &pb_opts); + err = libbpf_get_error(pb); + if (err) { warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -180,8 +188,8 @@ int main(int argc, char **argv) while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + warn("error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/syscount.c b/libbpf-tools/syscount.c index 2d687573..35c0e095 100644 --- a/libbpf-tools/syscount.c +++ b/libbpf-tools/syscount.c @@ -390,9 +390,14 @@ int main(int argc, char **argv) goto free_names; } - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %s\n", strerror(errno)); + goto free_names; + } + obj = syscount_bpf__open(); if (!obj) { warn("failed to open BPF object\n"); @@ -418,15 +423,16 @@ int main(int argc, char **argv) } obj->links.sys_exit = bpf_program__attach(obj->progs.sys_exit); - if (!obj->links.sys_exit) { - err = -errno; - warn("failed to attach sys_exit program: %s\n", strerror(-err)); + err = libbpf_get_error(obj->links.sys_exit); + if (err) { + warn("failed to attach sys_exit program: %s\n", + strerror(-err)); goto cleanup_obj; } if (env.latency) { obj->links.sys_enter = bpf_program__attach(obj->progs.sys_enter); - if (!obj->links.sys_enter) { - err = -errno; + err = libbpf_get_error(obj->links.sys_enter); + if (err) { warn("failed to attach sys_enter programs: %s\n", strerror(-err)); goto cleanup_obj; diff --git a/libbpf-tools/tcpconnect.c b/libbpf-tools/tcpconnect.c index 101cf72b..82b2bebb 100644 --- a/libbpf-tools/tcpconnect.c +++ b/libbpf-tools/tcpconnect.c @@ -324,13 +324,17 @@ static void handle_lost_events(void *ctx, int cpu, __u64 lost_cnt) static void print_events(int perf_map_fd) { - struct perf_buffer *pb; + struct perf_buffer_opts pb_opts = { + .sample_cb = handle_event, + .lost_cb = handle_lost_events, + }; + struct perf_buffer *pb = NULL; int err; - pb = perf_buffer__new(perf_map_fd, 128, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - err = -errno; + pb = perf_buffer__new(perf_map_fd, 128, &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; warn("failed to open perf buffer: %d\n", err); goto cleanup; } @@ -338,8 +342,8 @@ static void print_events(int perf_map_fd) print_events_header(); while (!exiting) { err = perf_buffer__poll(pb, 100); - if (err < 0 && err != -EINTR) { - warn("error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + warn("error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ @@ -365,9 +369,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + warn("failed to increase rlimit: %s\n", strerror(errno)); + return 1; + } + obj = tcpconnect_bpf__open(); if (!obj) { warn("failed to open BPF object\n"); diff --git a/libbpf-tools/tcpconnlat.c b/libbpf-tools/tcpconnlat.c index 8eae76ae..3cab2115 100644 --- a/libbpf-tools/tcpconnlat.c +++ b/libbpf-tools/tcpconnlat.c @@ -161,6 +161,7 @@ int main(int argc, char **argv) .parser = parse_arg, .doc = argp_program_doc, }; + struct perf_buffer_opts pb_opts; struct perf_buffer *pb = NULL; struct tcpconnlat_bpf *obj; int err; @@ -169,9 +170,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = tcpconnlat_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); @@ -193,10 +199,15 @@ int main(int argc, char **argv) goto cleanup; } + pb_opts.sample_cb = handle_event; + + pb_opts.lost_cb = handle_lost_events; pb = perf_buffer__new(bpf_map__fd(obj->maps.events), PERF_BUFFER_PAGES, - handle_event, handle_lost_events, NULL, NULL); - if (!pb) { - fprintf(stderr, "failed to open perf buffer: %d\n", errno); + &pb_opts); + err = libbpf_get_error(pb); + if (err) { + pb = NULL; + fprintf(stderr, "failed to open perf buffer: %d\n", err); goto cleanup; } @@ -211,6 +222,7 @@ int main(int argc, char **argv) "PID", "COMM", "IP", "SADDR", "DADDR", "DPORT", "LAT(ms)"); } + if (signal(SIGINT, sig_int) == SIG_ERR) { fprintf(stderr, "can't set signal handler: %s\n", strerror(errno)); err = 1; @@ -220,8 +232,8 @@ int main(int argc, char **argv) /* main: poll */ while (!exiting) { err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS); - if (err < 0 && err != -EINTR) { - fprintf(stderr, "error polling perf buffer: %s\n", strerror(-err)); + if (err < 0 && errno != EINTR) { + fprintf(stderr, "error polling perf buffer: %s\n", strerror(errno)); goto cleanup; } /* reset err to return 0 if exiting */ diff --git a/libbpf-tools/tcprtt.c b/libbpf-tools/tcprtt.c index bed6efa7..bdff55bb 100644 --- a/libbpf-tools/tcprtt.c +++ b/libbpf-tools/tcprtt.c @@ -225,9 +225,14 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %d\n", err); + return 1; + } + obj = tcprtt_bpf__open(); if (!obj) { fprintf(stderr, "failed to open BPF object\n"); diff --git a/libbpf-tools/trace_helpers.c b/libbpf-tools/trace_helpers.c index 322b3c4f..f37015e7 100644 --- a/libbpf-tools/trace_helpers.c +++ b/libbpf-tools/trace_helpers.c @@ -967,6 +967,16 @@ unsigned long long get_ktime_ns(void) return ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec; } +int bump_memlock_rlimit(void) +{ + struct rlimit rlim_new = { + .rlim_cur = RLIM_INFINITY, + .rlim_max = RLIM_INFINITY, + }; + + return setrlimit(RLIMIT_MEMLOCK, &rlim_new); +} + bool is_kernel_module(const char *name) { bool found = false; @@ -997,22 +1007,20 @@ bool fentry_exists(const char *name, const char *mod) const struct btf_type *type; const struct btf_enum *e; char sysfs_mod[80]; - int id = -1, i, err; + int id = -1, i; base = btf__parse(sysfs_vmlinux, NULL); - if (!base) { - err = -errno; + if (libbpf_get_error(base)) { fprintf(stderr, "failed to parse vmlinux BTF at '%s': %s\n", - sysfs_vmlinux, strerror(-err)); + sysfs_vmlinux, strerror(-libbpf_get_error(base))); goto err_out; } if (mod && module_btf_exists(mod)) { snprintf(sysfs_mod, sizeof(sysfs_mod), "/sys/kernel/btf/%s", mod); btf = btf__parse_split(sysfs_mod, base); - if (!btf) { - err = -errno; + if (libbpf_get_error(btf)) { fprintf(stderr, "failed to load BTF from %s: %s\n", - sysfs_mod, strerror(-err)); + sysfs_mod, strerror(-libbpf_get_error(btf))); btf = base; base = NULL; } diff --git a/libbpf-tools/trace_helpers.h b/libbpf-tools/trace_helpers.h index 98fd640f..61cbe433 100644 --- a/libbpf-tools/trace_helpers.h +++ b/libbpf-tools/trace_helpers.h @@ -58,6 +58,7 @@ void print_linear_hist(unsigned int *vals, int vals_size, unsigned int base, unsigned int step, const char *val_type); unsigned long long get_ktime_ns(void); +int bump_memlock_rlimit(void); bool is_kernel_module(const char *name); diff --git a/libbpf-tools/vfsstat.c b/libbpf-tools/vfsstat.c index 5519c366..3a8a51d8 100644 --- a/libbpf-tools/vfsstat.c +++ b/libbpf-tools/vfsstat.c @@ -150,9 +150,15 @@ int main(int argc, char **argv) if (err) return err; - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + err = bump_memlock_rlimit(); + if (err) { + fprintf(stderr, "failed to increase rlimit: %s\n", + strerror(errno)); + return 1; + } + skel = vfsstat_bpf__open(); if (!skel) { fprintf(stderr, "failed to open BPF skelect\n"); -- 2.35.1