1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

Linux: optimize clone3 internal usage

Add an optimization to avoid calling clone3 when glibc detects that
there is no kernel support.  It also adds __ASSUME_CLONE3, which allows
skipping this optimization and issuing the clone3 syscall directly.

It does not handle the the small window between 5.3 and 5.5 for
posix_spawn (CLONE_CLEAR_SIGHAND was added in 5.5).

Checked on x86_64-linux-gnu.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Adhemerval Zanella Netto
2023-01-12 10:58:53 -03:00
committed by Adhemerval Zanella
parent 1e442efd57
commit 98f9435f33
3 changed files with 37 additions and 1 deletions

View File

@ -76,6 +76,28 @@ __clone_internal_fallback (struct clone_args *cl_args,
return ret;
}
int
__clone3_internal (struct clone_args *cl_args, int (*func) (void *args),
void *arg)
{
#ifdef HAVE_CLONE3_WRAPPER
# if __ASSUME_CLONE3
return __clone3 (cl_args, sizeof (*cl_args), func, arg);
# else
static int clone3_supported = 1;
if (atomic_load_relaxed (&clone3_supported) == 1)
{
int ret = __clone3 (cl_args, sizeof (*cl_args), func, arg);
if (ret != -1 || errno != ENOSYS)
return ret;
atomic_store_relaxed (&clone3_supported, 0);
}
# endif
#endif
__set_errno (ENOSYS);
return -1;
}
int
__clone_internal (struct clone_args *cl_args,
@ -83,7 +105,7 @@ __clone_internal (struct clone_args *cl_args,
{
#ifdef HAVE_CLONE3_WRAPPER
int saved_errno = errno;
int ret = __clone3 (cl_args, sizeof (*cl_args), func, arg);
int ret = __clone3_internal (cl_args, func, arg);
if (ret != -1 || errno != ENOSYS)
return ret;