On Thu, Aug 31, 2023 at 08:37:52PM +0800, Hou Tao wrote: > 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. right, just saw that ;-) > > 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() nice, thanks for all the info jirka > > > > > >> 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; > >> } > >> >