selftests/bpf: Guess function end for test_get_branch_snapshot
authorSong Liu <songliubraving@fb.com>
Fri, 22 Oct 2021 23:48:14 +0000 (16:48 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Tue, 26 Oct 2021 04:43:05 +0000 (21:43 -0700)
Function in modules could appear in /proc/kallsyms in random order.

ffffffffa02608a0 t bpf_testmod_loop_test
ffffffffa02600c0 t __traceiter_bpf_testmod_test_writable_bare
ffffffffa0263b60 d __tracepoint_bpf_testmod_test_write_bare
ffffffffa02608c0 T bpf_testmod_test_read
ffffffffa0260d08 t __SCT__tp_func_bpf_testmod_test_writable_bare
ffffffffa0263300 d __SCK__tp_func_bpf_testmod_test_read
ffffffffa0260680 T bpf_testmod_test_write
ffffffffa0260860 t bpf_testmod_test_mod_kfunc

Therefore, we cannot reliably use kallsyms_find_next() to find the end of
a function. Replace it with a simple guess (start + 128). This is good
enough for this test.

Signed-off-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20211022234814.318457-1-songliubraving@fb.com
tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c
tools/testing/selftests/bpf/trace_helpers.c
tools/testing/selftests/bpf/trace_helpers.h

index 81402e443984470a065ebaab4b7da51d97fe33d9..3948da12a5284d7fab87c594f9b57b19d1d471e7 100644 (file)
@@ -97,9 +97,10 @@ void serial_test_get_branch_snapshot(void)
        if (!ASSERT_OK(err, "kallsyms_find"))
                goto cleanup;
 
-       err = kallsyms_find_next("bpf_testmod_loop_test", &skel->bss->address_high);
-       if (!ASSERT_OK(err, "kallsyms_find_next"))
-               goto cleanup;
+       /* Just a guess for the end of this function, as module functions
+        * in /proc/kallsyms could come in any order.
+        */
+       skel->bss->address_high = skel->bss->address_low + 128;
 
        err = get_branch_snapshot__attach(skel);
        if (!ASSERT_OK(err, "get_branch_snapshot__attach"))
index 5100a169b72b1c138c577fc623abf4c089764c3b..7b7f918eda776871ad680e191fb0e5477a0a761a 100644 (file)
@@ -118,42 +118,6 @@ out:
        return err;
 }
 
-/* find the address of the next symbol of the same type, this can be used
- * to determine the end of a function.
- */
-int kallsyms_find_next(const char *sym, unsigned long long *addr)
-{
-       char type, found_type, name[500];
-       unsigned long long value;
-       bool found = false;
-       int err = 0;
-       FILE *f;
-
-       f = fopen("/proc/kallsyms", "r");
-       if (!f)
-               return -EINVAL;
-
-       while (fscanf(f, "%llx %c %499s%*[^\n]\n", &value, &type, name) > 0) {
-               /* Different types of symbols in kernel modules are mixed
-                * in /proc/kallsyms. Only return the next matching type.
-                * Use tolower() for type so that 'T' matches 't'.
-                */
-               if (found && found_type == tolower(type)) {
-                       *addr = value;
-                       goto out;
-               }
-               if (strcmp(name, sym) == 0) {
-                       found = true;
-                       found_type = tolower(type);
-               }
-       }
-       err = -ENOENT;
-
-out:
-       fclose(f);
-       return err;
-}
-
 void read_trace_pipe(void)
 {
        int trace_fd;
index bc8ed86105d94cd3cca6da6aaeb5041ebed17014..d907b445524d52d13a99ed658061b0829c8db4d5 100644 (file)
@@ -16,11 +16,6 @@ long ksym_get_addr(const char *name);
 /* open kallsyms and find addresses on the fly, faster than load + search. */
 int kallsyms_find(const char *sym, unsigned long long *addr);
 
-/* find the address of the next symbol, this can be used to determine the
- * end of a function
- */
-int kallsyms_find_next(const char *sym, unsigned long long *addr);
-
 void read_trace_pipe(void);
 
 ssize_t get_uprobe_offset(const void *addr, ssize_t base);