[1/4] support: Add xclone

Message ID 20201222212754.387111-1-adhemerval.zanella@linaro.org
State Superseded
Headers
Series [1/4] support: Add xclone |

Commit Message

Adhemerval Zanella Netto Dec. 22, 2020, 9:27 p.m. UTC
  It is a wrapper for Linux close syscall, to simplify the call to the
use only the most common arguments and remove architecture specific
handling (such as ia64 different name and signature).
---
 support/Makefile |  1 +
 support/xclone.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 support/xsched.h | 36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+)
 create mode 100644 support/xclone.c
 create mode 100644 support/xsched.h
  

Comments

Florian Weimer Dec. 23, 2020, 11:35 a.m. UTC | #1
* Adhemerval Zanella:

> diff --git a/support/xclone.c b/support/xclone.c
> new file mode 100644
> index 0000000000..e7efffb82b
> --- /dev/null
> +++ b/support/xclone.c
> @@ -0,0 +1,46 @@
> +/* Auxiliary wrapper to issue the clone symbol.

Same wording issue as before.

> +   Copyright (C) 2020 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <stackinfo.h>  /* For _STACK_GROWS_{UP,DOWN}.  */
> +#include <xsched.h>
> +
> +pid_t
> +xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
> +	int flags)
> +{
> +  pid_t r = -1;
> +
> +#ifdef __linux__
> +# ifdef __ia64__
> +  extern int __clone2 (int (*fn) (void *arg), void *stack, size_t stack_size,
> +		       int flags, void *arg, ...);
> +  r = __clone2 (f, stack, stack_size, flags, arg, /* ptid */ NULL,
> +		/* tls */ NULL, /* ctid  */ ctid);
> +# else
> +#  if _STACK_GROWS_DOWN
> +  r = clone (fn, stack + stack_size, flags, arg, /* ptid */ NULL,
> +	     /* tls */ NULL, /* ctid */  NULL);
> +#  elif _STACK_GROWS_UP
> +  r = clone (fn, stack, flags, arg, /* ptid */ NULL, /* tls */ NULL,
> +	     &ctid);
> +#  endif
> +# endif
> +#endif
> +
> +  return r;
> +}

Maybe #ifdef CLONE_VM instead of #ifdef __linux__?  And around the whole
function definition?

Then you can check for an error return from the system call, too, to
match the x* function pattern.

Thanks,
Florian
  
Christian Brauner Dec. 23, 2020, 12:20 p.m. UTC | #2
On Tue, Dec 22, 2020 at 06:27:51PM -0300, Adhemerval Zanella via Libc-alpha wrote:
> It is a wrapper for Linux close syscall, to simplify the call to the

s/close/clone/?

> use only the most common arguments and remove architecture specific
> handling (such as ia64 different name and signature).
> ---
>  support/Makefile |  1 +
>  support/xclone.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  support/xsched.h | 36 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 83 insertions(+)
>  create mode 100644 support/xclone.c
>  create mode 100644 support/xsched.h
> 
> diff --git a/support/Makefile b/support/Makefile
> index 3198eb5022..aecd27316e 100644
> --- a/support/Makefile
> +++ b/support/Makefile
> @@ -89,6 +89,7 @@ libsupport-routines = \
>    xcalloc \
>    xchroot \
>    xclock_gettime \
> +  xclone \
>    xclose \
>    xconnect \
>    xcopy_file_range \
> diff --git a/support/xclone.c b/support/xclone.c
> new file mode 100644
> index 0000000000..e7efffb82b
> --- /dev/null
> +++ b/support/xclone.c
> @@ -0,0 +1,46 @@
> +/* Auxiliary wrapper to issue the clone symbol.
> +   Copyright (C) 2020 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <stackinfo.h>  /* For _STACK_GROWS_{UP,DOWN}.  */
> +#include <xsched.h>
> +
> +pid_t
> +xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
> +	int flags)
> +{
> +  pid_t r = -1;
> +
> +#ifdef __linux__
> +# ifdef __ia64__
> +  extern int __clone2 (int (*fn) (void *arg), void *stack, size_t stack_size,
> +		       int flags, void *arg, ...);
> +  r = __clone2 (f, stack, stack_size, flags, arg, /* ptid */ NULL,
> +		/* tls */ NULL, /* ctid  */ ctid);
> +# else
> +#  if _STACK_GROWS_DOWN
> +  r = clone (fn, stack + stack_size, flags, arg, /* ptid */ NULL,
> +	     /* tls */ NULL, /* ctid */  NULL);
> +#  elif _STACK_GROWS_UP
> +  r = clone (fn, stack, flags, arg, /* ptid */ NULL, /* tls */ NULL,
> +	     &ctid);
> +#  endif
> +# endif
> +#endif
> +
> +  return r;
> +}
> diff --git a/support/xsched.h b/support/xsched.h
> new file mode 100644
> index 0000000000..8523f03f82
> --- /dev/null
> +++ b/support/xsched.h
> @@ -0,0 +1,36 @@
> +/* Wrapper for sched.h functions.
> +   Copyright (C) 2020 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#ifndef SUPPORT_XSCHED_H
> +#define SUPPORT_XSCHED_H
> +
> +__BEGIN_DECLS
> +
> +#include <sched.h>
> +#include <sys/types.h>
> +
> +#define DEFINE_STACK(name, size) \
> +  char name[size] __attribute__ ((aligned))
> +
> +pid_t
> +xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
> +	int flags);
> +
> +__END_DECLS
> +
> +#endif
> -- 
> 2.25.1
>
  
Adhemerval Zanella Netto Dec. 23, 2020, 1:05 p.m. UTC | #3
On 23/12/2020 09:20, Christian Brauner wrote:
> On Tue, Dec 22, 2020 at 06:27:51PM -0300, Adhemerval Zanella via Libc-alpha wrote:
>> It is a wrapper for Linux close syscall, to simplify the call to the
> 
> s/close/clone/?

Ack.
  
Adhemerval Zanella Netto Dec. 23, 2020, 1:13 p.m. UTC | #4
On 23/12/2020 08:35, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
>> diff --git a/support/xclone.c b/support/xclone.c
>> new file mode 100644
>> index 0000000000..e7efffb82b
>> --- /dev/null
>> +++ b/support/xclone.c
>> @@ -0,0 +1,46 @@
>> +/* Auxiliary wrapper to issue the clone symbol.
> 
> Same wording issue as before.

Ack, I forgot to adjust the new file as well.

> 
>> +   Copyright (C) 2020 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <stackinfo.h>  /* For _STACK_GROWS_{UP,DOWN}.  */
>> +#include <xsched.h>
>> +
>> +pid_t
>> +xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
>> +	int flags)
>> +{
>> +  pid_t r = -1;
>> +
>> +#ifdef __linux__
>> +# ifdef __ia64__
>> +  extern int __clone2 (int (*fn) (void *arg), void *stack, size_t stack_size,
>> +		       int flags, void *arg, ...);
>> +  r = __clone2 (f, stack, stack_size, flags, arg, /* ptid */ NULL,
>> +		/* tls */ NULL, /* ctid  */ ctid);
>> +# else
>> +#  if _STACK_GROWS_DOWN
>> +  r = clone (fn, stack + stack_size, flags, arg, /* ptid */ NULL,
>> +	     /* tls */ NULL, /* ctid */  NULL);
>> +#  elif _STACK_GROWS_UP
>> +  r = clone (fn, stack, flags, arg, /* ptid */ NULL, /* tls */ NULL,
>> +	     &ctid);
>> +#  endif
>> +# endif
>> +#endif
>> +
>> +  return r;
>> +}
> 
> Maybe #ifdef CLONE_VM instead of #ifdef __linux__?  And around the whole
> function definition?

The __linux__ is already use on other support implementations, so I think
it would be ok to specific this is system specific wrapper.

For function support, maybe not providing for no Linux build would be
better indeed (the tests will fail to build instead of fail at runtime). 

> 
> Then you can check for an error return from the system call, too, to
> match the x* function pattern.

Ack.
  

Patch

diff --git a/support/Makefile b/support/Makefile
index 3198eb5022..aecd27316e 100644
--- a/support/Makefile
+++ b/support/Makefile
@@ -89,6 +89,7 @@  libsupport-routines = \
   xcalloc \
   xchroot \
   xclock_gettime \
+  xclone \
   xclose \
   xconnect \
   xcopy_file_range \
diff --git a/support/xclone.c b/support/xclone.c
new file mode 100644
index 0000000000..e7efffb82b
--- /dev/null
+++ b/support/xclone.c
@@ -0,0 +1,46 @@ 
+/* Auxiliary wrapper to issue the clone symbol.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stackinfo.h>  /* For _STACK_GROWS_{UP,DOWN}.  */
+#include <xsched.h>
+
+pid_t
+xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
+	int flags)
+{
+  pid_t r = -1;
+
+#ifdef __linux__
+# ifdef __ia64__
+  extern int __clone2 (int (*fn) (void *arg), void *stack, size_t stack_size,
+		       int flags, void *arg, ...);
+  r = __clone2 (f, stack, stack_size, flags, arg, /* ptid */ NULL,
+		/* tls */ NULL, /* ctid  */ ctid);
+# else
+#  if _STACK_GROWS_DOWN
+  r = clone (fn, stack + stack_size, flags, arg, /* ptid */ NULL,
+	     /* tls */ NULL, /* ctid */  NULL);
+#  elif _STACK_GROWS_UP
+  r = clone (fn, stack, flags, arg, /* ptid */ NULL, /* tls */ NULL,
+	     &ctid);
+#  endif
+# endif
+#endif
+
+  return r;
+}
diff --git a/support/xsched.h b/support/xsched.h
new file mode 100644
index 0000000000..8523f03f82
--- /dev/null
+++ b/support/xsched.h
@@ -0,0 +1,36 @@ 
+/* Wrapper for sched.h functions.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef SUPPORT_XSCHED_H
+#define SUPPORT_XSCHED_H
+
+__BEGIN_DECLS
+
+#include <sched.h>
+#include <sys/types.h>
+
+#define DEFINE_STACK(name, size) \
+  char name[size] __attribute__ ((aligned))
+
+pid_t
+xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
+	int flags);
+
+__END_DECLS
+
+#endif