diff mbox series

syscalls/fanotify: Fix running tests in a loop

Message ID 20210714180840.160798-1-amir73il@gmail.com
State Accepted
Headers show
Series syscalls/fanotify: Fix running tests in a loop | expand

Commit Message

Amir Goldstein July 14, 2021, 6:08 p.m. UTC
Both fanotify19 and fanotify18 leaked fds when run in a loop.
fanotify19 was not checking child process exit status correctly
which resulted in random failures.

Reported-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 testcases/kernel/syscalls/fanotify/fanotify18.c | 5 ++++-
 testcases/kernel/syscalls/fanotify/fanotify19.c | 4 +++-
 2 files changed, 7 insertions(+), 2 deletions(-)

Comments

Petr Vorel July 15, 2021, 7:08 a.m. UTC | #1
Hi Amir,

> Both fanotify19 and fanotify18 leaked fds when run in a loop.
> fanotify19 was not checking child process exit status correctly
> which resulted in random failures.

Thanks for a quick fix!
Reviewed-by: Petr Vorel <pvorel@suse.cz>

FYI both fixes prolonged running for about 100% (comparing with runs on master
which don't fail). Of course, that's not a problem at all, it's just interesting
for me how simple closing of file descriptor can be expensive.

Kind regards,
Petr

# time ./fanotify19 -i40

Summary:
passed   360
failed   0
broken   0
skipped  0
warnings 0

real	0m0,871s
user	0m0,028s
sys	0m0,116s

vs.

Summary:
passed   360
failed   0
broken   0
skipped  0
warnings 0

real	0m0,387s
user	0m0,016s
sys	0m0,122s

# time ./fanotify19 -i10
Summary:
passed   160
failed   0
broken   0
skipped  0
warnings 0

real	0m0,436s
user	0m0,032s
sys	0m0,128s

vs.

Summary:
passed   160
failed   0
broken   0
skipped  0
warnings 0

real	0m0,876s
user	0m0,052s
sys	0m0,105s
Amir Goldstein July 15, 2021, 9:05 a.m. UTC | #2
On Thu, Jul 15, 2021 at 10:08 AM Petr Vorel <pvorel@suse.cz> wrote:
>
> Hi Amir,
>
> > Both fanotify19 and fanotify18 leaked fds when run in a loop.
> > fanotify19 was not checking child process exit status correctly
> > which resulted in random failures.
>
> Thanks for a quick fix!
> Reviewed-by: Petr Vorel <pvorel@suse.cz>
>
> FYI both fixes prolonged running for about 100% (comparing with runs on master
> which don't fail). Of course, that's not a problem at all, it's just interesting
> for me how simple closing of file descriptor can be expensive.
>

Nice observation! LTP is not the only test suite that observed this issue. See:
https://lore.kernel.org/linux-fsdevel/CAC-ggsFLmFpz5Y=-9MMLwxuO2LOS9rhpewDp_-u2hrT9J79ryg@mail.gmail.com/

In order to fix that issue we will need some LTP helpers to take care of closing
fanotify/inotify fds in batches for loop runs, which is kind of what
happened before
the fd leak fix only the batch was infinite...

Attached sample patch for fanotify18.
You will need to run some more experiments to see if it is worth it or not
and then if it is worth it, probably generalize the helpers.

Thanks,
Amir.




> Kind regards,
> Petr
>
> # time ./fanotify19 -i40
>
> Summary:
> passed   360
> failed   0
> broken   0
> skipped  0
> warnings 0
>
> real    0m0,871s
> user    0m0,028s
> sys     0m0,116s
>
> vs.
>
> Summary:
> passed   360
> failed   0
> broken   0
> skipped  0
> warnings 0
>
> real    0m0,387s
> user    0m0,016s
> sys     0m0,122s
>
> # time ./fanotify19 -i10
> Summary:
> passed   160
> failed   0
> broken   0
> skipped  0
> warnings 0
>
> real    0m0,436s
> user    0m0,032s
> sys     0m0,128s
>
> vs.
>
> Summary:
> passed   160
> failed   0
> broken   0
> skipped  0
> warnings 0
>
> real    0m0,876s
> user    0m0,052s
> sys     0m0,105s
Petr Vorel July 15, 2021, 9:29 a.m. UTC | #3
Hi Amir,

...
> > FYI both fixes prolonged running for about 100% (comparing with runs on master
> > which don't fail). Of course, that's not a problem at all, it's just interesting
> > for me how simple closing of file descriptor can be expensive.

> Nice observation! LTP is not the only test suite that observed this issue. See:
> https://lore.kernel.org/linux-fsdevel/CAC-ggsFLmFpz5Y=-9MMLwxuO2LOS9rhpewDp_-u2hrT9J79ryg@mail.gmail.com/

> In order to fix that issue we will need some LTP helpers to take care of closing
> fanotify/inotify fds in batches for loop runs, which is kind of what
> happened before
> the fd leak fix only the batch was infinite...

> Attached sample patch for fanotify18.
> You will need to run some more experiments to see if it is worth it or not
> and then if it is worth it, probably generalize the helpers.

Thanks for detailed info and patch. I'm going to merge the original patch as
it's not an issue to run tests slower (more important is to actually fix the
issue) and have look into your patchset whether it's worth of adding it.

Kind regards,
Petr
Petr Vorel July 15, 2021, 11:42 a.m. UTC | #4
Hi Amir,

merged, thanks!

Kind regards,
Petr
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/fanotify/fanotify18.c b/testcases/kernel/syscalls/fanotify/fanotify18.c
index 8a7eebba3..54a4b8ba0 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify18.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify18.c
@@ -136,7 +136,7 @@  static void test_fanotify(unsigned int n)
 			(tc->mark_flags & DISALLOWED_MARK_FLAGS ||
 			 tc->mark_mask & FAN_ALL_PERM_EVENTS)) {
 			tst_res(TPASS, "Received result EPERM, as expected");
-			return;
+			goto out;
 		}
 
 		tst_brk(TBROK | TERRNO,
@@ -151,6 +151,9 @@  static void test_fanotify(unsigned int n)
 	tst_res(TPASS,
 		"fanotify_init() and fanotify_mark() returned successfully, "
 		"as expected");
+
+out:
+	SAFE_CLOSE(fd_notify);
 }
 
 static void setup(void)
diff --git a/testcases/kernel/syscalls/fanotify/fanotify19.c b/testcases/kernel/syscalls/fanotify/fanotify19.c
index 60714408d..fac257bb4 100644
--- a/testcases/kernel/syscalls/fanotify/fanotify19.c
+++ b/testcases/kernel/syscalls/fanotify/fanotify19.c
@@ -132,7 +132,7 @@  static void do_fork(void)
 
 	SAFE_WAITPID(child, &status, 0);
 
-	if (WIFEXITED(child) && WEXITSTATUS(child) != 0)
+	if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
 		tst_brk(TBROK, "Child process terminated incorrectly. Aborting");
 }
 
@@ -255,6 +255,8 @@  static void test_fanotify(unsigned int n)
 			event = FAN_EVENT_NEXT(event, len);
 		}
 	}
+
+	SAFE_CLOSE(fd_notify);
 }
 
 static void setup(void)