From: Oren Laadan <orenl@librato.com>
To: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: linux-kernel@vger.kernel.org, randy.dunlap@oracle.com,
arnd@arndb.de, Containers <containers@lists.linux-foundation.org>,
Nathan Lynch <nathanl@austin.ibm.com>,
Louis.Rilling@kerlabs.com,
"Eric W. Biederman" <ebiederm@xmission.com>,
kosaki.motohiro@jp.fujitsu.com, hpa@zytor.com, mingo@elte.hu,
linux-api@vger.kernel.org, torvalds@linux-foundation.org,
Alexey Dobriyan <adobriyan@gmail.com>,
roland@redhat.com, Pavel Emelyanov <xemul@openvz.org>
Subject: Re: [RFC][v8][PATCH 9/10]: Define clone3() syscall
Date: Tue, 13 Oct 2009 14:46:52 -0400 [thread overview]
Message-ID: <4AD4CB1C.7040207@librato.com> (raw)
In-Reply-To: <20091013045439.GI28435@us.ibm.com>
Sukadev Bhattiprolu wrote:
>
> Subject: [RFC][v8][PATCH 9/10]: Define clone3() syscall
>
> Container restart requires that a task have the same pid it had when it was
> checkpointed. When containers are nested the tasks within the containers
> exist in multiple pid namespaces and hence have multiple pids to specify
> during restart.
>
> clone3(), intended for use during restart, is the same as clone(), except
> that it takes a 'pids' paramter. This parameter lets caller choose
> specific pid numbers for the child process, in the process's active and
> ancestor pid namespaces. (Descendant pid namespaces in general don't matter
> since processes don't have pids in them anyway, but see comments in
> copy_target_pids() regarding CLONE_NEWPID).
>
> Clone2() system call also attempts to address a second limitation of the
> clone() system call. clone() is restricted to 32 clone flags and most (all ?)
> of these are in use. If a new clone flag is needed, we will be forced to
> define a new variant of the clone() system call.
>
> To prevent unprivileged processes from misusing this interface, clone3()
> currently needs CAP_SYS_ADMIN, when the 'pids' parameter is non-NULL.
>
> See Documentation/clone3 in next patch for more details of clone3() and an
> example of its usage.
>
> NOTE:
> System calls are restricted to 6 parameters and the number and sizes
> of parameters needed for sys_clone3() exceed 6 integers. The new
> prototype works around this restriction while providing some
> flexibility if clone3() needs to be further extended in the future.
> TODO:
> - May need additional sanity checks in do_fork_with_pids().
>
> Changelog[v8]
> - [Oren Laadan] parent_tid and child_tid fields in 'struct clone_arg'
> must be 64-bit.
> - clone2() is in use in IA64. Rename system call to clone3().
>
> Changelog[v7]:
> - [Peter Zijlstra, Arnd Bergmann] Rename system call to clone2()
> and group parameters into a new 'struct clone_struct' object.
>
> Changelog[v6]:
> - (Nathan Lynch, Arnd Bergmann, H. Peter Anvin, Linus Torvalds)
> Change 'pid_set.pids' to a 'pid_t pids[]' so size of 'struct pid_set'
> is constant across architectures.
> - (Nathan Lynch) Change pid_set.num_pids to unsigned and remove
> 'unum_pids < 0' check.
>
> Changelog[v4]:
> - (Oren Laadan) rename 'struct target_pid_set' to 'struct pid_set'
>
> Changelog[v3]:
> - (Oren Laadan) Allow CLONE_NEWPID flag (by allocating an extra pid
> in the target_pids[] list and setting it 0. See copy_target_pids()).
> - (Oren Laadan) Specified target pids should apply only to youngest
> pid-namespaces (see copy_target_pids())
> - (Matt Helsley) Update patch description.
>
> Changelog[v2]:
> - Remove unnecessary printk and add a note to callers of
> copy_target_pids() to free target_pids.
> - (Serge Hallyn) Mention CAP_SYS_ADMIN restriction in patch description.
> - (Oren Laadan) Add checks for 'num_pids < 0' (return -EINVAL) and
> 'num_pids == 0' (fall back to normal clone()).
> - Move arch-independent code (sanity checks and copy-in of target-pids)
> into kernel/fork.c and simplify sys_clone_with_pids()
>
> Changelog[v1]:
> - Fixed some compile errors (had fixed these errors earlier in my
> git tree but had not refreshed patches before emailing them)
>
> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
> ---
> arch/x86/include/asm/syscalls.h | 1
> arch/x86/include/asm/unistd_32.h | 1
> arch/x86/kernel/process_32.c | 34 +++++++++++++
> arch/x86/kernel/syscall_table_32.S | 1
> include/linux/types.h | 10 +++
> kernel/fork.c | 96 ++++++++++++++++++++++++++++++++++++-
> 6 files changed, 142 insertions(+), 1 deletion(-)
>
> Index: linux-2.6/include/linux/types.h
> ===================================================================
> --- linux-2.6.orig/include/linux/types.h 2009-10-12 19:13:24.000000000 -0700
> +++ linux-2.6/include/linux/types.h 2009-10-12 19:15:08.000000000 -0700
> @@ -204,6 +204,16 @@ struct ustat {
> char f_fpack[6];
> };
>
> +struct clone_struct {
> + u64 flags;
> + u64 child_stack;
> + u32 nr_pids;
> + u32 reserved1;
> + u64 parent_tid;
> + u64 child_tid;
> + u64 reserved2;
> +};
> +
> #endif /* __KERNEL__ */
> #endif /* __ASSEMBLY__ */
> #endif /* _LINUX_TYPES_H */
> Index: linux-2.6/arch/x86/include/asm/syscalls.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/syscalls.h 2009-10-12 19:13:24.000000000 -0700
> +++ linux-2.6/arch/x86/include/asm/syscalls.h 2009-10-12 19:15:08.000000000 -0700
> @@ -55,6 +55,7 @@ struct sel_arg_struct;
> struct oldold_utsname;
> struct old_utsname;
>
> +asmlinkage long sys_clone3(struct clone_struct __user *cs, pid_t *pids);
> asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long,
> unsigned long, unsigned long, unsigned long);
> asmlinkage int old_mmap(struct mmap_arg_struct __user *);
> Index: linux-2.6/arch/x86/include/asm/unistd_32.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/unistd_32.h 2009-10-12 19:13:24.000000000 -0700
> +++ linux-2.6/arch/x86/include/asm/unistd_32.h 2009-10-12 19:15:08.000000000 -0700
> @@ -342,6 +342,7 @@
> #define __NR_pwritev 334
> #define __NR_rt_tgsigqueueinfo 335
> #define __NR_perf_counter_open 336
> +#define __NR_clone3 337
>
> #ifdef __KERNEL__
>
> Index: linux-2.6/arch/x86/kernel/process_32.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/process_32.c 2009-10-12 19:13:24.000000000 -0700
> +++ linux-2.6/arch/x86/kernel/process_32.c 2009-10-12 19:54:34.000000000 -0700
> @@ -443,6 +443,40 @@ int sys_clone(struct pt_regs *regs)
> return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
> }
>
> +asmlinkage long
> +sys_clone3(struct clone_struct __user *ucs, pid_t __user *pids)
> +{
> + int rc;
> + struct clone_struct kcs;
> + unsigned long clone_flags;
> + int __user *parent_tid_ptr;
> + int __user *child_tid_ptr;
> + unsigned long __user child_stack_base;
> + struct pt_regs *regs;
> +
> + rc = copy_from_user(&kcs, ucs, sizeof(kcs));
> + if (rc)
> + return -EFAULT;
> +
> + if (kcs.reserved1 || kcs.reserved2)
> + return -EINVAL;
> +
> + /*
> + * TODO: Convert clone_flags to 64-bit
> + */
> + clone_flags = (unsigned long)kcs.flags;
On 32-bit arch this would dismiss upper half of the flags :(
Is there a reason not to use 64-bit ('u64' or 'long long') now ?
[...]
Oren.
next prev parent reply other threads:[~2009-10-13 18:47 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-13 4:49 [RFC][v8][PATCH 0/10] Implement clone3() system call Sukadev Bhattiprolu
2009-10-13 4:49 ` [RFC][v8][PATCH 1/10]: Factor out code to allocate pidmap page Sukadev Bhattiprolu
2009-10-13 4:50 ` [RFC][v8][PATCH 2/10]: Have alloc_pidmap() return actual error code Sukadev Bhattiprolu
2009-10-13 4:50 ` [RFC][v8][PATCH 3/10]: Make pid_max a pid_ns property Sukadev Bhattiprolu
2009-10-13 5:19 ` Alexey Dobriyan
2009-10-13 13:09 ` Pavel Emelyanov
2009-10-13 15:24 ` Serge E. Hallyn
2009-10-13 16:10 ` Pavel Emelyanov
2009-10-13 16:28 ` Serge E. Hallyn
2009-10-13 4:51 ` [RFC][v8][PATCH 4/10]: Add target_pid parameter to alloc_pidmap() Sukadev Bhattiprolu
2009-10-13 11:50 ` Pavel Emelyanov
2009-10-15 0:24 ` Sukadev Bhattiprolu
2009-10-13 4:51 ` [RFC][v8][PATCH 5/10]: Add target_pids parameter to alloc_pid() Sukadev Bhattiprolu
2009-10-13 4:52 ` [RFC][v8][PATCH 6/10]: Add target_pids parameter to copy_process() Sukadev Bhattiprolu
2009-10-13 4:52 ` [RFC][v8][PATCH 7/10]: Check invalid clone flags Sukadev Bhattiprolu
2009-10-13 18:35 ` Oren Laadan
2009-10-13 23:38 ` Sukadev Bhattiprolu
2009-10-13 4:52 ` [RFC][v8][PATCH 8/10]: Define do_fork_with_pids() Sukadev Bhattiprolu
2009-10-13 4:54 ` [RFC][v8][PATCH 9/10]: Define clone3() syscall Sukadev Bhattiprolu
2009-10-13 18:46 ` Oren Laadan [this message]
2009-10-16 4:20 ` Sukadev Bhattiprolu
2009-10-16 6:25 ` Michael Kerrisk
2009-10-16 18:06 ` Sukadev Bhattiprolu
2009-10-19 17:44 ` Matt Helsley
2009-10-19 21:31 ` H. Peter Anvin
2009-10-19 23:50 ` Matt Helsley
2009-10-21 4:26 ` Michael Kerrisk
2009-10-21 13:03 ` H. Peter Anvin
2009-10-21 19:44 ` Sukadev Bhattiprolu
2009-10-21 22:03 ` H. Peter Anvin
2009-10-22 10:40 ` Michael Kerrisk
2009-10-22 18:10 ` Sukadev Bhattiprolu
2009-10-22 10:26 ` Michael Kerrisk
2009-10-22 11:38 ` H. Peter Anvin
2009-10-22 12:14 ` Michael Kerrisk
2009-10-22 12:19 ` H. Peter Anvin
2009-10-22 13:57 ` Matt Helsley
2009-10-13 4:55 ` [RFC][v8][PATCH 10/10]: Document " Sukadev Bhattiprolu
2009-10-14 12:26 ` Arnd Bergmann
2009-10-14 18:39 ` Sukadev Bhattiprolu
2009-10-19 21:36 ` Pavel Machek
2009-10-21 8:37 ` Arnd Bergmann
2009-10-21 9:33 ` Pavel Machek
2009-10-21 13:26 ` Arnd Bergmann
2009-10-21 18:27 ` Sukadev Bhattiprolu
2009-10-13 20:50 ` [RFC][v8][PATCH 0/10] Implement clone3() system call Roland McGrath
2009-10-13 23:27 ` Sukadev Bhattiprolu
2009-10-13 23:53 ` Roland McGrath
2009-10-14 1:13 ` H. Peter Anvin
2009-10-14 4:36 ` Sukadev Bhattiprolu
2009-10-14 4:38 ` H. Peter Anvin
2009-10-14 22:36 ` Sukadev Bhattiprolu
2009-10-14 22:49 ` H. Peter Anvin
2009-10-15 0:17 ` Sukadev Bhattiprolu
2009-10-13 23:49 ` H. Peter Anvin
2009-10-14 1:39 ` Matt Helsley
2009-10-14 2:24 ` H. Peter Anvin
2009-10-14 4:40 ` Sukadev Bhattiprolu
2009-10-14 4:50 ` H. Peter Anvin
2009-10-14 16:07 ` Serge E. Hallyn
2009-10-16 19:22 ` Daniel Lezcano
2009-10-16 19:44 ` Sukadev Bhattiprolu
2009-10-19 20:34 ` Daniel Lezcano
2009-10-19 21:47 ` Oren Laadan
2009-10-20 0:51 ` Matt Helsley
2009-10-20 3:33 ` Eric W. Biederman
2009-10-20 4:03 ` Sukadev Bhattiprolu
2009-10-20 10:46 ` Eric W. Biederman
2009-10-20 14:16 ` Serge E. Hallyn
2009-10-20 18:33 ` Sukadev Bhattiprolu
2009-10-20 19:26 ` Eric W. Biederman
2009-10-20 20:13 ` Oren Laadan
2009-10-21 6:20 ` Sukadev Bhattiprolu
2009-10-21 9:16 ` Eric W. Biederman
2009-10-21 18:52 ` Sukadev Bhattiprolu
2009-10-21 21:11 ` Eric W. Biederman
2009-10-23 0:42 ` Sukadev Bhattiprolu
2009-10-23 1:03 ` Eric W. Biederman
2009-10-23 5:30 ` Sukadev Bhattiprolu
2009-10-23 5:44 ` Eric W. Biederman
2009-10-23 19:21 ` Sukadev Bhattiprolu
2009-10-23 20:48 ` Sukadev Bhattiprolu
2009-10-23 23:26 ` Eric W. Biederman
2009-10-24 3:38 ` Sukadev Bhattiprolu
2009-10-23 19:16 ` Oren Laadan
2009-10-23 19:34 ` Oren Laadan
2009-10-23 23:12 ` Eric W. Biederman
2009-10-20 14:09 ` Serge E. Hallyn
2009-10-21 15:53 ` Daniel Lezcano
2009-10-21 18:45 ` Oren Laadan
2009-10-22 11:22 ` Daniel Lezcano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4AD4CB1C.7040207@librato.com \
--to=orenl@librato.com \
--cc=Louis.Rilling@kerlabs.com \
--cc=adobriyan@gmail.com \
--cc=arnd@arndb.de \
--cc=containers@lists.linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=hpa@zytor.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-api@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=nathanl@austin.ibm.com \
--cc=randy.dunlap@oracle.com \
--cc=roland@redhat.com \
--cc=sukadev@linux.vnet.ibm.com \
--cc=torvalds@linux-foundation.org \
--cc=xemul@openvz.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox