mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 04:24:31 +01:00
tools/nolibc: align sys_vfork() with sys_fork()
Currently the generic variants of sys_fork() and sys_vfork() differ in both they precedence of used system calls and the usage of sys_clone() vs sys_clone3(). While the interface of clone3() in sys_vfork() is more consistent over different architectures, qemu-user does not support it, making testing harder. We already handle the different clone() interfaces for sys_fork() in the architecture-specific headers, and can do so also for sys_vfork(). In fact SPARC already has such handling and only s390 is currently missing. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Acked-by: Willy Tarreau <w@1wt.eu> Link: https://patch.msgid.link/20260104-nolibc-vfork-v1-1-a63464b9e4e6@weissschuh.net
This commit is contained in:
parent
0313992485
commit
57624b38ce
2 changed files with 13 additions and 13 deletions
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include "types.h"
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/unistd.h>
|
||||
|
||||
|
|
@ -189,4 +190,11 @@ pid_t sys_fork(void)
|
|||
}
|
||||
#define sys_fork sys_fork
|
||||
|
||||
static __attribute__((unused))
|
||||
pid_t sys_vfork(void)
|
||||
{
|
||||
return my_syscall5(__NR_clone, 0, CLONE_VM | CLONE_VFORK | SIGCHLD, 0, 0, 0);
|
||||
}
|
||||
#define sys_vfork sys_vfork
|
||||
|
||||
#endif /* _NOLIBC_ARCH_S390_H */
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/time.h>
|
||||
#include <linux/auxvec.h>
|
||||
#include <linux/fcntl.h> /* for O_* and AT_* */
|
||||
#include <linux/sched.h> /* for clone_args */
|
||||
#include <linux/sched.h> /* for CLONE_* */
|
||||
#include <linux/stat.h> /* for statx() */
|
||||
|
||||
#include "errno.h"
|
||||
|
|
@ -363,19 +363,11 @@ pid_t fork(void)
|
|||
static __attribute__((unused))
|
||||
pid_t sys_vfork(void)
|
||||
{
|
||||
#if defined(__NR_vfork)
|
||||
#if defined(__NR_clone)
|
||||
/* See the note in sys_fork(). */
|
||||
return my_syscall5(__NR_clone, CLONE_VM | CLONE_VFORK | SIGCHLD, 0, 0, 0, 0);
|
||||
#elif defined(__NR_vfork)
|
||||
return my_syscall0(__NR_vfork);
|
||||
#else
|
||||
/*
|
||||
* clone() could be used but has different argument orders per
|
||||
* architecture.
|
||||
*/
|
||||
struct clone_args args = {
|
||||
.flags = CLONE_VM | CLONE_VFORK,
|
||||
.exit_signal = SIGCHLD,
|
||||
};
|
||||
|
||||
return my_syscall2(__NR_clone3, &args, sizeof(args));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue