Skip to content

Commit

Permalink
selftests/bpf: Guess function end for test_get_branch_snapshot
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Song Liu authored and Andrii Nakryiko committed Oct 26, 2021
1 parent b4e8707 commit 20d1b54
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 44 deletions.
7 changes: 4 additions & 3 deletions tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Expand Down
36 changes: 0 additions & 36 deletions tools/testing/selftests/bpf/trace_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,42 +118,6 @@ int kallsyms_find(const char *sym, unsigned long long *addr)
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;
Expand Down
5 changes: 0 additions & 5 deletions tools/testing/selftests/bpf/trace_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 20d1b54

Please sign in to comment.