Skip to content

Commit a86f189

Browse files
committed
selftests/harness: Fix interleaved scheduling leading to race conditions
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 <[email protected]> Cc: David S. Miller <[email protected]> Cc: Günther Noack <[email protected]> Cc: Jakub Kicinski <[email protected]> Cc: Mark Brown <[email protected]> Cc: Shuah Khan <[email protected]> Cc: Will Drewry <[email protected]> Fixes: 41cca05 ("selftests/harness: Fix TEST_F()'s vfork handling") Reviewed-by: Kees Cook <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mickaël Salaün <[email protected]>
1 parent fff37bd commit a86f189

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

tools/testing/selftests/kselftest_harness.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
#include <sys/wait.h>
6767
#include <unistd.h>
6868
#include <setjmp.h>
69+
#include <syscall.h>
70+
#include <linux/sched.h>
6971

7072
#include "kselftest.h"
7173

@@ -80,6 +82,17 @@
8082
# define TH_LOG_ENABLED 1
8183
#endif
8284

85+
/* Wait for the child process to end but without sharing memory mapping. */
86+
static inline pid_t clone3_vfork(void)
87+
{
88+
struct clone_args args = {
89+
.flags = CLONE_VFORK,
90+
.exit_signal = SIGCHLD,
91+
};
92+
93+
return syscall(__NR_clone3, &args, sizeof(args));
94+
}
95+
8396
/**
8497
* TH_LOG()
8598
*
@@ -1183,7 +1196,7 @@ void __run_test(struct __fixture_metadata *f,
11831196
fflush(stdout);
11841197
fflush(stderr);
11851198

1186-
t->pid = fork();
1199+
t->pid = clone3_vfork();
11871200
if (t->pid < 0) {
11881201
ksft_print_msg("ERROR SPAWNING TEST CHILD\n");
11891202
t->exit_code = KSFT_FAIL;

0 commit comments

Comments
 (0)