Hi, On 8/31/2023 7:46 PM, Daniel Borkmann wrote: > On 8/31/23 1:00 PM, Jiri Olsa wrote: >> Recent commit [1] broken d_path test, because now filp_close is not >> called >> directly from sys_close, but eventually later when the file is finally >> released. >> >> As suggested by Hou Tao we don't need to re-hook the bpf program, but >> just >> instead we can use sys_close_range to trigger filp_close synchronously. >> >> [1] 021a160abf62 ("fs: use __fput_sync in close(2)") >> Suggested-by: Hou Tao <houtao@xxxxxxxxxxxxxxx> >> Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> >> --- >> tools/testing/selftests/bpf/prog_tests/d_path.c | 8 +++++++- >> 1 file changed, 7 insertions(+), 1 deletion(-) >> >> diff --git a/tools/testing/selftests/bpf/prog_tests/d_path.c >> b/tools/testing/selftests/bpf/prog_tests/d_path.c >> index 911345c526e6..81e34a4a05d1 100644 >> --- a/tools/testing/selftests/bpf/prog_tests/d_path.c >> +++ b/tools/testing/selftests/bpf/prog_tests/d_path.c >> @@ -90,7 +90,11 @@ static int trigger_fstat_events(pid_t pid) >> fstat(indicatorfd, &fileStat); >> out_close: >> - /* triggers filp_close */ >> + /* sys_close no longer triggers filp_close, but we can >> + * call sys_close_range instead which still does >> + */ >> +#define close(fd) close_range(fd, fd, 0) >> + > > The BPF CI selftest build says: > > [...] > TEST-OBJ [test_progs] lookup_key.test.o > TEST-OBJ [test_progs] migrate_reuseport.test.o > TEST-OBJ [test_progs] user_ringbuf.test.o > /tmp/work/bpf/bpf/tools/testing/selftests/bpf/prog_tests/d_path.c: > In function ‘trigger_fstat_events’: > > /tmp/work/bpf/bpf/tools/testing/selftests/bpf/prog_tests/d_path.c:96:19: > error: implicit declaration of function ‘close_range’ > [-Werror=implicit-function-declaration] > 96 | #define close(fd) close_range(fd, fd, 0) > | ^~~~~~~~~~~ > > /tmp/work/bpf/bpf/tools/testing/selftests/bpf/prog_tests/d_path.c:98:2: > note: in expansion of macro ‘close’ > 98 | close(pipefd[0]); > | ^~~~~ > TEST-OBJ [test_progs] task_pt_regs.test.o > [...] > > Perhaps #include <linux/close_range.h> missing ? Including <linux/close_range.h> doesn't help because it only defines two macros. I got the same error when testing locally. It seems close_range() was introduced by glibc 2.34 [1] and it was defined in <unistd.h>, but the version of glibc in my local VM is 2.29. I modify d_path locally to call close_range through syscall(): diff --git a/tools/testing/selftests/bpf/prog_tests/d_path.c b/tools/testing/selftests/bpf/prog_tests/d_path.c index 81e34a4a05d1..c5811843ce7e 100644 --- a/tools/testing/selftests/bpf/prog_tests/d_path.c +++ b/tools/testing/selftests/bpf/prog_tests/d_path.c @@ -12,6 +12,14 @@ #include "test_d_path_check_rdonly_mem.skel.h" #include "test_d_path_check_types.skel.h" +#ifndef __NR_close_range +#ifdef __alpha__ +#define __NR_close_range 546 +#else +#define __NR_close_range 436 +#endif +#endif + static int duration; static struct { @@ -93,7 +101,7 @@ static int trigger_fstat_events(pid_t pid) /* sys_close no longer triggers filp_close, but we can * call sys_close_range instead which still does */ -#define close(fd) close_range(fd, fd, 0) +#define close(fd) syscall(__NR_close_range, fd, fd, 0) [1]: 9b4feb630e8e arch: wire-up close_range() > >> close(pipefd[0]); >> close(pipefd[1]); >> close(sockfd); >> @@ -98,6 +102,8 @@ static int trigger_fstat_events(pid_t pid) >> close(devfd); >> close(localfd); >> close(indicatorfd); >> + >> +#undef close >> return ret; >> } >>