Message ID | 20230112135853.3786675-3-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | Optimize posix_spawn signal setup with clone3 | expand |
On 1/12/23 08:58, Adhemerval Zanella wrote: > Different than kernel, clone3 returns EINVAL for NULL struct > clone_args or function pointer. This is similar to clone > interface that return EINVAL for NULL function argument. > > It also clean up the Linux clone3.h interface, since it not > currently exported. > > Checked on x86_64-linux-gnu. OK for 2.28. Reviewed-by: Carlos O'Donell <carlos@redhat.com> > --- > include/clone_internal.h | 24 +++++++++++++++++++----- > sysdeps/unix/sysv/linux/clone3.h | 10 +--------- > 2 files changed, 20 insertions(+), 14 deletions(-) > > diff --git a/include/clone_internal.h b/include/clone_internal.h > index 4b23ef33ce..73b8114df4 100644 > --- a/include/clone_internal.h > +++ b/include/clone_internal.h > @@ -1,10 +1,24 @@ > -#ifndef _CLONE3_H > -#include_next <clone3.h> > +#ifndef _CLONE_INTERNAL_H > +#define _CLONE_INTERNAL_H > > -extern __typeof (clone3) __clone3; > +#include <clone3.h> > > -/* The internal wrapper of clone/clone2 and clone3. If __clone3 returns > - -1 with ENOSYS, fall back to clone or clone2. */ > +/* The clone3 syscall provides a superset of the functionality of the clone > + interface. The kernel might extend __CL_ARGS struct in the future, with > + each version with a diffent __SIZE. If the child is created, it will > + start __FUNC function with __ARG arguments. > + > + Different than kernel, the implementation also returns EINVAL for an > + invalid NULL __CL_ARGS or __FUNC (similar to __clone). > + > + This function is only implemented if the ABI defines HAVE_CLONE3_WRAPPER. > +*/ > +extern int __clone3 (struct clone_args *__cl_args, size_t __size, > + int (*__func) (void *__arg), void *__arg); > + > +/* The internal wrapper of clone/clone2 and clone3. Different than __clone3, > + it will align the stack if required. If __clone3 returns -1 with ENOSYS, > + fall back to clone or clone2. */ > extern int __clone_internal (struct clone_args *__cl_args, > int (*__func) (void *__arg), void *__arg); > > diff --git a/sysdeps/unix/sysv/linux/clone3.h b/sysdeps/unix/sysv/linux/clone3.h > index 42055ea981..e4d642e521 100644 > --- a/sysdeps/unix/sysv/linux/clone3.h > +++ b/sysdeps/unix/sysv/linux/clone3.h > @@ -1,4 +1,4 @@ > -/* The wrapper of clone3. > +/* The clone3 kernel interface definitions. > Copyright (C) 2021-2023 Free Software Foundation, Inc. > This file is part of the GNU C Library. > > @@ -23,8 +23,6 @@ > #include <stddef.h> > #include <bits/types.h> > > -__BEGIN_DECLS > - > /* The unsigned 64-bit and 8-byte aligned integer type. */ > typedef __U64_TYPE __aligned_uint64_t __attribute__ ((__aligned__ (8))); > > @@ -58,10 +56,4 @@ struct clone_args > __aligned_uint64_t cgroup; > }; > > -/* The wrapper of clone3. */ > -extern int clone3 (struct clone_args *__cl_args, size_t __size, > - int (*__func) (void *__arg), void *__arg); > - > -__END_DECLS > - > #endif /* clone3.h */
diff --git a/include/clone_internal.h b/include/clone_internal.h index 4b23ef33ce..73b8114df4 100644 --- a/include/clone_internal.h +++ b/include/clone_internal.h @@ -1,10 +1,24 @@ -#ifndef _CLONE3_H -#include_next <clone3.h> +#ifndef _CLONE_INTERNAL_H +#define _CLONE_INTERNAL_H -extern __typeof (clone3) __clone3; +#include <clone3.h> -/* The internal wrapper of clone/clone2 and clone3. If __clone3 returns - -1 with ENOSYS, fall back to clone or clone2. */ +/* The clone3 syscall provides a superset of the functionality of the clone + interface. The kernel might extend __CL_ARGS struct in the future, with + each version with a diffent __SIZE. If the child is created, it will + start __FUNC function with __ARG arguments. + + Different than kernel, the implementation also returns EINVAL for an + invalid NULL __CL_ARGS or __FUNC (similar to __clone). + + This function is only implemented if the ABI defines HAVE_CLONE3_WRAPPER. +*/ +extern int __clone3 (struct clone_args *__cl_args, size_t __size, + int (*__func) (void *__arg), void *__arg); + +/* The internal wrapper of clone/clone2 and clone3. Different than __clone3, + it will align the stack if required. If __clone3 returns -1 with ENOSYS, + fall back to clone or clone2. */ extern int __clone_internal (struct clone_args *__cl_args, int (*__func) (void *__arg), void *__arg); diff --git a/sysdeps/unix/sysv/linux/clone3.h b/sysdeps/unix/sysv/linux/clone3.h index 42055ea981..e4d642e521 100644 --- a/sysdeps/unix/sysv/linux/clone3.h +++ b/sysdeps/unix/sysv/linux/clone3.h @@ -1,4 +1,4 @@ -/* The wrapper of clone3. +/* The clone3 kernel interface definitions. Copyright (C) 2021-2023 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -23,8 +23,6 @@ #include <stddef.h> #include <bits/types.h> -__BEGIN_DECLS - /* The unsigned 64-bit and 8-byte aligned integer type. */ typedef __U64_TYPE __aligned_uint64_t __attribute__ ((__aligned__ (8))); @@ -58,10 +56,4 @@ struct clone_args __aligned_uint64_t cgroup; }; -/* The wrapper of clone3. */ -extern int clone3 (struct clone_args *__cl_args, size_t __size, - int (*__func) (void *__arg), void *__arg); - -__END_DECLS - #endif /* clone3.h */