Message ID | 20240429130931.2394118-5-mic@digikod.net (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Fix Kselftest's vfork() side effects | expand |
On Mon, Apr 29, 2024 at 03:09:26PM +0200, Mickaël Salaün wrote: > Fix a race condition when running several FIXTURE_TEARDOWN() managing > the same resource. This fixes a race condition in the Landlock file > system tests when creating or unmounting the same directory. > > Using clone3() with CLONE_VFORK guarantees that the child and grandchild > test processes are sequentially scheduled. This is implemented with a > new clone3_vfork() helper replacing the fork() call. > > This avoids triggering this error in __wait_for_test(): > Test ended in some other way [127] > > Cc: Christian Brauner <brauner@kernel.org> > Cc: David S. Miller <davem@davemloft.net> > Cc: Günther Noack <gnoack@google.com> > Cc: Jakub Kicinski <kuba@kernel.org> > Cc: Kees Cook <keescook@chromium.org> > Cc: Mark Brown <broonie@kernel.org> > Cc: Shuah Khan <shuah@kernel.org> > Cc: Will Drewry <wad@chromium.org> > Fixes: 41cca0542d7c ("selftests/harness: Fix TEST_F()'s vfork handling") > Signed-off-by: Mickaël Salaün <mic@digikod.net> > Link: https://lore.kernel.org/r/20240429130931.2394118-5-mic@digikod.net > --- > tools/testing/selftests/kselftest_harness.h | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h > index 55699a762c45..9f04638707ae 100644 > --- a/tools/testing/selftests/kselftest_harness.h > +++ b/tools/testing/selftests/kselftest_harness.h > @@ -66,6 +66,8 @@ > #include <sys/wait.h> > #include <unistd.h> > #include <setjmp.h> > +#include <syscall.h> > +#include <linux/sched.h> > > #include "kselftest.h" > > @@ -80,6 +82,17 @@ > # define TH_LOG_ENABLED 1 > #endif > > +/* Wait for the child process to end but without sharing memory mapping. */ > +static pid_t __attribute__((__unused__)) clone3_vfork(void) Why "unused"? > +{ > + struct clone_args args = { > + .flags = CLONE_VFORK, > + .exit_signal = SIGCHLD, > + }; > + > + return syscall(__NR_clone3, &args, sizeof(args)); > +} > + > /** > * TH_LOG() > * > @@ -1183,7 +1196,7 @@ void __run_test(struct __fixture_metadata *f, > fflush(stdout); > fflush(stderr); > > - t->pid = fork(); > + t->pid = clone3_vfork(); > if (t->pid < 0) { > ksft_print_msg("ERROR SPAWNING TEST CHILD\n"); > t->exit_code = KSFT_FAIL; Regardless, yup, looks good. Reviewed-by: Kees Cook <keescook@chromium.org>
On Mon, 29 Apr 2024 08:52:36 -0700 Kees Cook wrote: > > +/* Wait for the child process to end but without sharing memory mapping. */ > > +static pid_t __attribute__((__unused__)) clone3_vfork(void) > > Why "unused"? Right, static inline is enough
On Mon, Apr 29, 2024 at 10:16:47AM -0700, Jakub Kicinski wrote: > On Mon, 29 Apr 2024 08:52:36 -0700 Kees Cook wrote: > > > +/* Wait for the child process to end but without sharing memory mapping. */ > > > +static pid_t __attribute__((__unused__)) clone3_vfork(void) > > > > Why "unused"? > > Right, static inline is enough Indeed, I'll fix that.
diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 55699a762c45..9f04638707ae 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -66,6 +66,8 @@ #include <sys/wait.h> #include <unistd.h> #include <setjmp.h> +#include <syscall.h> +#include <linux/sched.h> #include "kselftest.h" @@ -80,6 +82,17 @@ # define TH_LOG_ENABLED 1 #endif +/* Wait for the child process to end but without sharing memory mapping. */ +static pid_t __attribute__((__unused__)) clone3_vfork(void) +{ + struct clone_args args = { + .flags = CLONE_VFORK, + .exit_signal = SIGCHLD, + }; + + return syscall(__NR_clone3, &args, sizeof(args)); +} + /** * TH_LOG() * @@ -1183,7 +1196,7 @@ void __run_test(struct __fixture_metadata *f, fflush(stdout); fflush(stderr); - t->pid = fork(); + t->pid = clone3_vfork(); if (t->pid < 0) { ksft_print_msg("ERROR SPAWNING TEST CHILD\n"); t->exit_code = KSFT_FAIL;
Fix a race condition when running several FIXTURE_TEARDOWN() managing the same resource. This fixes a race condition in the Landlock file system tests when creating or unmounting the same directory. Using clone3() with CLONE_VFORK guarantees that the child and grandchild test processes are sequentially scheduled. This is implemented with a new clone3_vfork() helper replacing the fork() call. This avoids triggering this error in __wait_for_test(): Test ended in some other way [127] Cc: Christian Brauner <brauner@kernel.org> Cc: David S. Miller <davem@davemloft.net> Cc: Günther Noack <gnoack@google.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Kees Cook <keescook@chromium.org> Cc: Mark Brown <broonie@kernel.org> Cc: Shuah Khan <shuah@kernel.org> Cc: Will Drewry <wad@chromium.org> Fixes: 41cca0542d7c ("selftests/harness: Fix TEST_F()'s vfork handling") Signed-off-by: Mickaël Salaün <mic@digikod.net> Link: https://lore.kernel.org/r/20240429130931.2394118-5-mic@digikod.net --- tools/testing/selftests/kselftest_harness.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)