selftests/bpf: Guess function end for test_get_branch_snapshot
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
This commit is contained in:
parent
b4e8707276
commit
20d1b54a52
@ -97,9 +97,10 @@ void serial_test_get_branch_snapshot(void)
|
|||||||
if (!ASSERT_OK(err, "kallsyms_find"))
|
if (!ASSERT_OK(err, "kallsyms_find"))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
err = kallsyms_find_next("bpf_testmod_loop_test", &skel->bss->address_high);
|
/* Just a guess for the end of this function, as module functions
|
||||||
if (!ASSERT_OK(err, "kallsyms_find_next"))
|
* in /proc/kallsyms could come in any order.
|
||||||
goto cleanup;
|
*/
|
||||||
|
skel->bss->address_high = skel->bss->address_low + 128;
|
||||||
|
|
||||||
err = get_branch_snapshot__attach(skel);
|
err = get_branch_snapshot__attach(skel);
|
||||||
if (!ASSERT_OK(err, "get_branch_snapshot__attach"))
|
if (!ASSERT_OK(err, "get_branch_snapshot__attach"))
|
||||||
|
@ -118,42 +118,6 @@ out:
|
|||||||
return err;
|
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)
|
void read_trace_pipe(void)
|
||||||
{
|
{
|
||||||
int trace_fd;
|
int trace_fd;
|
||||||
|
@ -16,11 +16,6 @@ long ksym_get_addr(const char *name);
|
|||||||
/* open kallsyms and find addresses on the fly, faster than load + search. */
|
/* open kallsyms and find addresses on the fly, faster than load + search. */
|
||||||
int kallsyms_find(const char *sym, unsigned long long *addr);
|
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);
|
void read_trace_pipe(void);
|
||||||
|
|
||||||
ssize_t get_uprobe_offset(const void *addr, ssize_t base);
|
ssize_t get_uprobe_offset(const void *addr, ssize_t base);
|
||||||
|
Loading…
Reference in New Issue
Block a user