[CRIU] [PATCH 2/3] utils: Add sys_clone_unified()

Michael Holzheu holzheu at linux.vnet.ibm.com
Fri Jun 30 20:47:19 MSK 2017


Am Fri, 30 Jun 2017 20:03:06 +0300
schrieb Kirill Tkhai <ktkhai at virtuozzo.com>:

> Cleanup fork() definition and make a generic function
> for all archs. It may be useful, when you want to add
> more clone flags to fork(), or if you want to pass more,
> than one argument to child function (glibc's clone
> alows only one).
> 
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
>  criu/include/util.h  |    3 +++
>  criu/util.c          |   16 +++++++++++++++-
>  test/zdtm/lib/test.c |   20 +++++++++++++++-----
>  3 files changed, 33 insertions(+), 6 deletions(-)
> 
> diff --git a/criu/include/util.h b/criu/include/util.h
> index ec93fd5c6..3285c30ce 100644
> --- a/criu/include/util.h
> +++ b/criu/include/util.h
> @@ -61,6 +61,9 @@ extern int open_pid_proc(pid_t pid);
>  extern int close_pid_proc(void);
>  extern int set_proc_fd(int fd);
> 
> +extern pid_t sys_clone_unified(unsigned long flags, void *child_stack, void *parent_tid,
> +			       void *child_tid, unsigned long newtls);
> +
>  /*
>   * Values for pid argument of the proc opening routines below.
>   * SELF would open file under /proc/self
> diff --git a/criu/util.c b/criu/util.c
> index db484f2f8..ecbd07e6a 100644
> --- a/criu/util.c
> +++ b/criu/util.c
> @@ -1417,6 +1417,20 @@ int getpid()
>         return syscall(__NR_getpid);
>  }
> 
> +pid_t sys_clone_unified(unsigned long flags, void *child_stack, void *parent_tid,
> +			void *child_tid, unsigned long newtls)
> +{
> +#ifdef __x86_64__
> +	return (pid_t)syscall(__NR_clone, flags, child_stack, parent_tid, child_tid, newtls);
> +#elif (__i386__ || __arm__ || __aarch64__ || __powerpc64__)
> +	return (pid_t)syscall(__NR_clone, flags, child_stack, parent_tid, newtls, child_tid);
> +#elif __s390x__
> +	return (pid_t)syscall(__NR_clone, child_stack, flags, parent_tid, child_tid, newtls);
> +#else
> +#error "Unsupported architecture"
> +#endif
> +}
> +
>  /*
>   * In glibc 2.24, fork() may fail when parent and child are
>   * from different pid namespaces and have the same pid.
> @@ -1427,5 +1441,5 @@ pid_t fork()
>  	 * Two last arguments are swapped on different archs,
>  	 * but we don't care as they are zero anyway.
>  	 */
> -	return (pid_t)syscall(__NR_clone, SIGCHLD, 0, 0, 0, 0);
> +	return sys_clone_unified(SIGCHLD, 0, NULL, NULL, 0);
>  }
> diff --git a/test/zdtm/lib/test.c b/test/zdtm/lib/test.c
> index 76357da01..620dcfce6 100644
> --- a/test/zdtm/lib/test.c
> +++ b/test/zdtm/lib/test.c
> @@ -286,13 +286,23 @@ void test_waitsig(void)
>  	futex_wait_while(&sig_received, 0);
>  }
> 
> +pid_t sys_clone_unified(unsigned long flags, void *child_stack, void *parent_tid,
> +			void *child_tid, unsigned long newtls)
> +{
> +#ifdef __x86_64__
> +	return (pid_t)syscall(__NR_clone, flags, child_stack, parent_tid, child_tid, newtls);
> +#elif (__i386__ || __arm__ || __aarch64__ ||__powerpc64__)
> +	return (pid_t)syscall(__NR_clone, flags, child_stack, parent_tid, newtls, child_tid);
> +#elif __s390x__
> +	return (pid_t)syscall(__NR_clone, child_stack, flags, parent_tid, child_tid, newtls);

Looks good for s390x, thanks!
Michael



More information about the CRIU mailing list