Skip to content

Commit af50442

Browse files
olsajirikernel-patches-bot
authored andcommitted
Some kernels builds might inline vfs_getattr call within
fstat syscall code path, so fentry/vfs_getattr trampoline is not called. I'm not sure how to handle this in some generic way other than use some other function, but that might get inlined at some point as well. Adding flags that indicate trampolines were called and failing the test if neither of them got called. $ sudo ./test_progs -t d_path test_d_path:PASS:setup 0 nsec ... trigger_fstat_events:PASS:trigger 0 nsec test_d_path:FAIL:124 trampolines not called #22 d_path:FAIL Summary: 0/0 PASSED, 0 SKIPPED, 1 FAILED If only one trampoline is called, it's still enough to test the helper, so only warn about missing trampoline call and continue in test. $ sudo ./test_progs -t d_path -v test_d_path:PASS:setup 0 nsec ... trigger_fstat_events:PASS:trigger 0 nsec fentry/vfs_getattr not called #22 d_path:OK Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Jiri Olsa <[email protected]> --- .../testing/selftests/bpf/prog_tests/d_path.c | 25 +++++++++++++++---- .../testing/selftests/bpf/progs/test_d_path.c | 7 ++++++ 2 files changed, 27 insertions(+), 5 deletions(-)
1 parent 54f552a commit af50442

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

tools/testing/selftests/bpf/prog_tests/d_path.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,26 +120,41 @@ void test_d_path(void)
120120
if (err < 0)
121121
goto cleanup;
122122

123+
if (!bss->called_stat && !bss->called_close) {
124+
PRINT_FAIL("trampolines not called\n");
125+
goto cleanup;
126+
}
127+
128+
if (!bss->called_stat) {
129+
fprintf(stdout, "fentry/vfs_getattr not called\n");
130+
goto cleanup;
131+
}
132+
133+
if (!bss->called_close) {
134+
fprintf(stdout, "fentry/filp_close not called\n");
135+
goto cleanup;
136+
}
137+
123138
for (int i = 0; i < MAX_FILES; i++) {
124-
CHECK(strncmp(src.paths[i], bss->paths_stat[i], MAX_PATH_LEN),
139+
CHECK(bss->called_stat && strncmp(src.paths[i], bss->paths_stat[i], MAX_PATH_LEN),
125140
"check",
126141
"failed to get stat path[%d]: %s vs %s\n",
127142
i, src.paths[i], bss->paths_stat[i]);
128-
CHECK(strncmp(src.paths[i], bss->paths_close[i], MAX_PATH_LEN),
143+
CHECK(bss->called_close && strncmp(src.paths[i], bss->paths_close[i], MAX_PATH_LEN),
129144
"check",
130145
"failed to get close path[%d]: %s vs %s\n",
131146
i, src.paths[i], bss->paths_close[i]);
132147
/* The d_path helper returns size plus NUL char, hence + 1 */
133-
CHECK(bss->rets_stat[i] != strlen(bss->paths_stat[i]) + 1,
148+
CHECK(bss->called_stat && bss->rets_stat[i] != strlen(bss->paths_stat[i]) + 1,
134149
"check",
135150
"failed to match stat return [%d]: %d vs %zd [%s]\n",
136151
i, bss->rets_stat[i], strlen(bss->paths_stat[i]) + 1,
137152
bss->paths_stat[i]);
138-
CHECK(bss->rets_close[i] != strlen(bss->paths_stat[i]) + 1,
153+
CHECK(bss->called_close && bss->rets_close[i] != strlen(bss->paths_close[i]) + 1,
139154
"check",
140155
"failed to match stat return [%d]: %d vs %zd [%s]\n",
141156
i, bss->rets_close[i], strlen(bss->paths_close[i]) + 1,
142-
bss->paths_stat[i]);
157+
bss->paths_close[i]);
143158
}
144159

145160
cleanup:

tools/testing/selftests/bpf/progs/test_d_path.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ char paths_close[MAX_FILES][MAX_PATH_LEN] = {};
1515
int rets_stat[MAX_FILES] = {};
1616
int rets_close[MAX_FILES] = {};
1717

18+
int called_stat = 0;
19+
int called_close = 0;
20+
1821
SEC("fentry/vfs_getattr")
1922
int BPF_PROG(prog_stat, struct path *path, struct kstat *stat,
2023
__u32 request_mask, unsigned int query_flags)
@@ -23,6 +26,8 @@ int BPF_PROG(prog_stat, struct path *path, struct kstat *stat,
2326
__u32 cnt = cnt_stat;
2427
int ret;
2528

29+
called_stat = 1;
30+
2631
if (pid != my_pid)
2732
return 0;
2833

@@ -42,6 +47,8 @@ int BPF_PROG(prog_close, struct file *file, void *id)
4247
__u32 cnt = cnt_close;
4348
int ret;
4449

50+
called_close = 1;
51+
4552
if (pid != my_pid)
4653
return 0;
4754

0 commit comments

Comments
 (0)