-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: Add trace_vprintk test prog
This commit adds a test prog for vprintk which confirms that: * bpf_trace_vprintk is writing to /sys/kernel/debug/tracing/trace_pipe * __bpf_vprintk macro works as expected * >3 args are printed * bpf_printk w/ 0 format args compiles * bpf_trace_vprintk call w/ a fmt specifier but NULL fmt data fails Approach and code are borrowed from trace_printk test. Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20210917182911.2426606-9-davemarchevsky@fb.com
- Loading branch information
Dave Marchevsky
authored and
Alexei Starovoitov
committed
Sep 17, 2021
1 parent
d313d45
commit 7606729
Showing
3 changed files
with
103 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2021 Facebook */ | ||
|
||
#include <test_progs.h> | ||
|
||
#include "trace_vprintk.lskel.h" | ||
|
||
#define TRACEBUF "/sys/kernel/debug/tracing/trace_pipe" | ||
#define SEARCHMSG "1,2,3,4,5,6,7,8,9,10" | ||
|
||
void test_trace_vprintk(void) | ||
{ | ||
int err = 0, iter = 0, found = 0; | ||
struct trace_vprintk__bss *bss; | ||
struct trace_vprintk *skel; | ||
char *buf = NULL; | ||
FILE *fp = NULL; | ||
size_t buflen; | ||
|
||
skel = trace_vprintk__open_and_load(); | ||
if (!ASSERT_OK_PTR(skel, "trace_vprintk__open_and_load")) | ||
goto cleanup; | ||
|
||
bss = skel->bss; | ||
|
||
err = trace_vprintk__attach(skel); | ||
if (!ASSERT_OK(err, "trace_vprintk__attach")) | ||
goto cleanup; | ||
|
||
fp = fopen(TRACEBUF, "r"); | ||
if (!ASSERT_OK_PTR(fp, "fopen(TRACEBUF)")) | ||
goto cleanup; | ||
|
||
/* We do not want to wait forever if this test fails... */ | ||
fcntl(fileno(fp), F_SETFL, O_NONBLOCK); | ||
|
||
/* wait for tracepoint to trigger */ | ||
usleep(1); | ||
trace_vprintk__detach(skel); | ||
|
||
if (!ASSERT_GT(bss->trace_vprintk_ran, 0, "bss->trace_vprintk_ran")) | ||
goto cleanup; | ||
|
||
if (!ASSERT_GT(bss->trace_vprintk_ret, 0, "bss->trace_vprintk_ret")) | ||
goto cleanup; | ||
|
||
/* verify our search string is in the trace buffer */ | ||
while (getline(&buf, &buflen, fp) >= 0 || errno == EAGAIN) { | ||
if (strstr(buf, SEARCHMSG) != NULL) | ||
found++; | ||
if (found == bss->trace_vprintk_ran) | ||
break; | ||
if (++iter > 1000) | ||
break; | ||
} | ||
|
||
if (!ASSERT_EQ(found, bss->trace_vprintk_ran, "found")) | ||
goto cleanup; | ||
|
||
if (!ASSERT_LT(bss->null_data_vprintk_ret, 0, "bss->null_data_vprintk_ret")) | ||
goto cleanup; | ||
|
||
cleanup: | ||
trace_vprintk__destroy(skel); | ||
free(buf); | ||
if (fp) | ||
fclose(fp); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (c) 2021 Facebook */ | ||
|
||
#include "vmlinux.h" | ||
#include <bpf/bpf_helpers.h> | ||
#include <bpf/bpf_tracing.h> | ||
|
||
char _license[] SEC("license") = "GPL"; | ||
|
||
int null_data_vprintk_ret = 0; | ||
int trace_vprintk_ret = 0; | ||
int trace_vprintk_ran = 0; | ||
|
||
SEC("fentry/__x64_sys_nanosleep") | ||
int sys_enter(void *ctx) | ||
{ | ||
static const char one[] = "1"; | ||
static const char three[] = "3"; | ||
static const char five[] = "5"; | ||
static const char seven[] = "7"; | ||
static const char nine[] = "9"; | ||
static const char f[] = "%pS\n"; | ||
|
||
/* runner doesn't search for \t, just ensure it compiles */ | ||
bpf_printk("\t"); | ||
|
||
trace_vprintk_ret = __bpf_vprintk("%s,%d,%s,%d,%s,%d,%s,%d,%s,%d %d\n", | ||
one, 2, three, 4, five, 6, seven, 8, nine, 10, ++trace_vprintk_ran); | ||
|
||
/* non-NULL fmt w/ NULL data should result in error */ | ||
null_data_vprintk_ret = bpf_trace_vprintk(f, sizeof(f), NULL, 0); | ||
return 0; | ||
} |