Message ID | 20230701080817.1768865-1-liu.yun@linux.dev (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | [v2,1/2] libbpf: kprobe.multi: cross filter using available_filter_functions and kallsyms | expand |
Context | Check | Description |
---|---|---|
bpf/vmtest-bpf-next-PR | fail | PR summary |
bpf/vmtest-bpf-next-VM_Test-1 | success | Logs for ${{ matrix.test }} on ${{ matrix.arch }} with ${{ matrix.toolchain_full }} |
bpf/vmtest-bpf-next-VM_Test-2 | success | Logs for ShellCheck |
bpf/vmtest-bpf-next-VM_Test-3 | success | Logs for build for aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-4 | success | Logs for build for s390x with gcc |
bpf/vmtest-bpf-next-VM_Test-5 | success | Logs for build for x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-6 | fail | Logs for build for x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-7 | success | Logs for set-matrix |
bpf/vmtest-bpf-next-VM_Test-8 | success | Logs for veristat |
netdev/tree_selection | success | Not a local patch |
Hi Jackie,
kernel test robot noticed the following build errors:
[auto build test ERROR on bpf-next/master]
[also build test ERROR on bpf/master linus/master v6.4 next-20230630]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Jackie-Liu/libbpf-kprobe-multi-Filter-with-available_filter_functions_addrs/20230701-161010
base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
patch link: https://lore.kernel.org/r/20230701080817.1768865-1-liu.yun%40linux.dev
patch subject: [PATCH v2 1/2] libbpf: kprobe.multi: cross filter using available_filter_functions and kallsyms
config: x86_64-buildonly-randconfig-r001-20230702 (https://download.01.org/0day-ci/archive/20230703/202307030355.TdXOHklM-lkp@intel.com/config)
compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project.git 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a)
reproduce: (https://download.01.org/0day-ci/archive/20230703/202307030355.TdXOHklM-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202307030355.TdXOHklM-lkp@intel.com/
All errors (new ones prefixed by >>):
>> libbpf.c:10626:57: error: 'fscanf' may overflow; destination buffer in argument 4 has size 256, but the corresponding specifier may require size 500 [-Werror,-Wfortify-source]
ret = fscanf(f, "%llx %*c %499s%*[^\n]\n", &sym_addr, sym_name);
^
1 error generated.
make[5]: *** [tools/build/Makefile.build:97: tools/bpf/resolve_btfids/libbpf/staticobjs/libbpf.o] Error 1
make[5]: *** Waiting for unfinished jobs....
make[4]: *** [Makefile:157: tools/bpf/resolve_btfids/libbpf/staticobjs/libbpf-in.o] Error 2
make[3]: *** [Makefile:63: tools/bpf/resolve_btfids//libbpf/libbpf.a] Error 2
make[2]: *** [Makefile:76: bpf/resolve_btfids] Error 2 shuffle=967315254
make[1]: *** [Makefile:1446: tools/bpf/resolve_btfids] Error 2 shuffle=967315254
make[1]: Target 'prepare' not remade because of errors.
make: *** [Makefile:226: __sub-make] Error 2 shuffle=967315254
make: Target 'prepare' not remade because of errors.
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 214f828ece6b..8ea13de02c67 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -10224,6 +10224,12 @@ static const char *tracefs_uprobe_events(void) return use_debugfs() ? DEBUGFS"/uprobe_events" : TRACEFS"/uprobe_events"; } +static const char *tracefs_available_filter_functions(void) +{ + return use_debugfs() ? DEBUGFS"/available_filter_functions" : + TRACEFS"/available_filter_functions"; +} + static void gen_kprobe_legacy_event_name(char *buf, size_t buf_sz, const char *kfunc_name, size_t offset) { @@ -10539,23 +10545,113 @@ struct kprobe_multi_resolve { size_t cnt; }; -static int -resolve_kprobe_multi_cb(unsigned long long sym_addr, char sym_type, - const char *sym_name, void *ctx) +static int qsort_compare_function(const void *a, const void *b) { - struct kprobe_multi_resolve *res = ctx; - int err; + return strcmp(*(const char **)a, *(const char **)b); +} - if (!glob_match(sym_name, res->pattern)) - return 0; +static int bsearch_compare_function(const void *a, const void *b) +{ + return strcmp((const char *)a, *(const char **)b); +} - err = libbpf_ensure_mem((void **) &res->addrs, &res->cap, sizeof(unsigned long), - res->cnt + 1); - if (err) +static int libbpf_available_kallsyms_parse(struct kprobe_multi_resolve *res) +{ + char sym_name[256]; + const char *available_functions_file = tracefs_available_filter_functions(); + FILE *f; + int err = 0, ret, i; + struct function_info { + const char **syms; + size_t cap; + size_t cnt; + } infos = {}; + + f = fopen(available_functions_file, "r"); + if (!f) { + err = -errno; + pr_warn("failed to open %s\n", available_functions_file); return err; + } - res->addrs[res->cnt++] = (unsigned long) sym_addr; - return 0; + while (true) { + char *name; + + ret = fscanf(f, "%s%*[^\n]\n", sym_name); + if (ret == EOF && feof(f)) + break; + + if (ret != 1) { + pr_warn("failed to read available function file entry: %d\n", + ret); + err = -EINVAL; + goto cleanup; + } + + if (!glob_match(sym_name, res->pattern)) + continue; + + err = libbpf_ensure_mem((void **)&infos.syms, &infos.cap, + sizeof(void *), infos.cnt + 1); + if (err) + goto cleanup; + + name = strdup(sym_name); + if (!name) { + err = -errno; + goto cleanup; + } + + infos.syms[infos.cnt++] = name; + } + fclose(f); + + /* sort available functions */ + qsort(infos.syms, infos.cnt, sizeof(void *), qsort_compare_function); + + f = fopen("/proc/kallsyms", "r"); + if (!f) { + err = -errno; + pr_warn("failed to open /proc/kallsyms\n"); + goto free_infos; + } + + while (true) { + unsigned long long sym_addr; + + ret = fscanf(f, "%llx %*c %499s%*[^\n]\n", &sym_addr, sym_name); + if (ret == EOF && feof(f)) + break; + + if (ret != 2) { + pr_warn("failed to read kallsyms entry: %d\n", ret); + err = -EINVAL; + break; + } + + if (!glob_match(sym_name, res->pattern)) + continue; + + if (!bsearch(&sym_name, infos.syms, infos.cnt, sizeof(void *), + bsearch_compare_function)) + continue; + + err = libbpf_ensure_mem((void **)&res->addrs, &res->cap, + sizeof(unsigned long), res->cnt + 1); + if (err) + break; + + res->addrs[res->cnt++] = (unsigned long)sym_addr; + } + +cleanup: + fclose(f); +free_infos: + for (i = 0; i < infos.cnt; i++) + free((char *)infos.syms[i]); + free(infos.syms); + + return err; } struct bpf_link * @@ -10594,7 +10690,7 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, return libbpf_err_ptr(-EINVAL); if (pattern) { - err = libbpf_kallsyms_parse(resolve_kprobe_multi_cb, &res); + err = libbpf_available_kallsyms_parse(&res); if (err) goto error; if (!res.cnt) {