[v3,1/4] support: Add xclone

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

Commit Message

Adhemerval Zanella Netto Dec. 23, 2020, 4:36 p.m. UTC
  Changes from previous version:

  - Fixed typos and corrected one line file description.

--

It is a wrapper for Linux clone 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 | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
 support/xsched.h | 38 ++++++++++++++++++++++++++++++++++++
 3 files changed, 89 insertions(+)
 create mode 100644 support/xclone.c
 create mode 100644 support/xsched.h
  

Comments

Florian Weimer March 9, 2021, 9:19 a.m. UTC | #1
* Adhemerval Zanella via Libc-alpha:

> +#ifdef __linux__
> +# define DEFINE_STACK(name, size) \
> +  char name[size] __attribute__ ((aligned))

In the light of the MINSIGSTKSZ problems, is this really an appropriate
interface?  Should there be separate functions for stack allocation and
deallocation?

The actual xclone implementation looks okay to me.

Thanks,
Florian
  
Adhemerval Zanella Netto March 9, 2021, 4:17 p.m. UTC | #2
On 09/03/2021 06:19, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:
> 
>> +#ifdef __linux__
>> +# define DEFINE_STACK(name, size) \
>> +  char name[size] __attribute__ ((aligned))
> 
> In the light of the MINSIGSTKSZ problems, is this really an appropriate
> interface?  Should there be separate functions for stack allocation and
> deallocation?

Indeed, I think routines similar to xalloc_sigstack should be better
than this ad hoc routine to make the stack correctly aligned.

> 
> The actual xclone implementation looks okay to me.
> 
> Thanks,
> Florian
>
  

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..027b367ba1
--- /dev/null
+++ b/support/xclone.c
@@ -0,0 +1,50 @@ 
+/* Auxiliary functions to issue the clone syscall.
+   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/>.  */
+
+#ifdef __linux__
+# include <support/check.h>
+# 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 __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
+
+  if (r < 0)
+    FAIL_EXIT1 ("clone: %m");
+
+  return r;
+}
+#endif
diff --git a/support/xsched.h b/support/xsched.h
new file mode 100644
index 0000000000..1b7ce7286f
--- /dev/null
+++ b/support/xsched.h
@@ -0,0 +1,38 @@ 
+/* 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>
+
+#ifdef __linux__
+# 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);
+#endif
+
+__END_DECLS
+
+#endif