From: sukadev@linux.vnet.ibm.com (Sukadev Bhattiprolu)
To: linux-arm-kernel@lists.infradead.org
Subject: [C/R ARM][PATCH 2/3] ARM: Add the eclone system call
Date: Wed, 24 Mar 2010 11:19:07 -0700 [thread overview]
Message-ID: <20100324181907.GA28161@us.ibm.com> (raw)
In-Reply-To: <20100323210616.GB19572@n2100.arm.linux.org.uk>
Russell King - ARM Linux [linux at arm.linux.org.uk] wrote:
| > +asmlinkage int sys_eclone(unsigned flags_low, struct clone_args __user *uca,
| > + int args_size, pid_t __user *pids,
| > + struct pt_regs *regs)
| > +{
| > + int rc;
| > + struct clone_args kca;
| > + unsigned long flags;
| > + int __user *parent_tidp;
| > + int __user *child_tidp;
| > + unsigned long __user stack;
|
| __user on an integer type doesn't make any sense; integer types do not
| have address spaces.
Ah, will fix that for x86 32/64 bit implementations.
|
| > + unsigned long stack_size;
| > +
| > + rc = fetch_clone_args_from_user(uca, args_size, &kca);
| > + if (rc)
| > + return rc;
| > +
| > + /*
| > + * TODO: Convert 'clone-flags' to 64-bits on all architectures.
| > + * TODO: When ->clone_flags_high is non-zero, copy it in to the
| > + * higher word(s) of 'flags':
| > + *
| > + * flags = (kca.clone_flags_high << 32) | flags_low;
| > + */
| > + flags = flags_low;
| > + parent_tidp = (int *)(unsigned long)kca.parent_tid_ptr;
| > + child_tidp = (int *)(unsigned long)kca.child_tid_ptr;
|
| This will produce sparse errors. Is there a reason why 'clone_args'
| tid pointers aren't already pointers marked with __user ?
Making them pointers would make them 32-bit on some and 64-bit on other
architectures. We wanted the fields to be the same size on all architectures
for easier portability/extensibility. Given that we are copying-in a structure
from user-space, copying in a few extra bytes on the 32-bit architectures
would not be significant.
|
| > +
| > + stack_size = (unsigned long)kca.child_stack_size;
|
| Shouldn't this already be of integer type?
|
| > + if (stack_size)
| > + return -EINVAL;
|
| So the stack must have a zero size? Is this missing a '!' ?
Some architectures (IA64 ?) use the stack-size field. Those that don't
need it should error out. Again, its because we are trying to keep the
interface common across architectures.
|
| > +
| > + stack = (unsigned long)kca.child_stack;
| > + if (!stack)
| > + stack = regs->ARM_sp;
| > +
| > + return do_fork_with_pids(flags, stack, regs, stack_size, parent_tidp,
| > + child_tidp, kca.nr_pids, pids);
|
| Hmm, so let me get this syscall interface right. We have some arguments
| passed in registers and others via a (variable sized?) structure. It seems
| really weird to have, eg, a pointer to the pids and the number of pids
| passed in two separate ways.
|
| The grouping between what's passed in registers and via this clone_args
| structure seems to be random. Can it be sanitized?
:-) Well, we went through a lot of discussions on this. Here is one pointer
http://lkml.org/lkml/2009/9/11/92 (and that was version 6 of 13+ :-).
We wanted the first parameter of eclone(), flags, to remain 32-bit value to
avoid confusing user-space. (i.e if they accidentally pass a 64-bit flags
value to the clone() system call which takes 32-bit flags, the higher-32
bits would silently be dropped).
By sticking the higher clone-flags in 'struct clone_args', all architectures
would have to do the same extra work to set the higher flags so less
chance of error.
Re: passing the number of pids, nr_pids in the structure, I think it was
just that by passing it in the structure, we could avoid using an extra
register for the system call parameter.
'pid_t *' would be of different size on different architecutres. Passing
it as a separate parameter would avoid the pointer conversion. Note
that unlike the tid pointers above which are a few individual fields,
the pid_t array could in theory be large.
Hope that helps. Thanks the review comments.
Sukadev
WARNING: multiple messages have this Message-ID (diff)
From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
To: Russell King - ARM Linux <linux@arm.linux.org.uk>
Cc: Christoffer Dall <christofferdall@christofferdall.dk>,
containers <containers@lists.linux-foundation.org>,
linux-arm-kernel <linux-arm-kernel@lists.infradead.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
libc-ports <libc-ports@sourceware.org>
Subject: Re: [C/R ARM][PATCH 2/3] ARM: Add the eclone system call
Date: Wed, 24 Mar 2010 11:19:07 -0700 [thread overview]
Message-ID: <20100324181907.GA28161@us.ibm.com> (raw)
In-Reply-To: <20100323210616.GB19572@n2100.arm.linux.org.uk>
Russell King - ARM Linux [linux@arm.linux.org.uk] wrote:
| > +asmlinkage int sys_eclone(unsigned flags_low, struct clone_args __user *uca,
| > + int args_size, pid_t __user *pids,
| > + struct pt_regs *regs)
| > +{
| > + int rc;
| > + struct clone_args kca;
| > + unsigned long flags;
| > + int __user *parent_tidp;
| > + int __user *child_tidp;
| > + unsigned long __user stack;
|
| __user on an integer type doesn't make any sense; integer types do not
| have address spaces.
Ah, will fix that for x86 32/64 bit implementations.
|
| > + unsigned long stack_size;
| > +
| > + rc = fetch_clone_args_from_user(uca, args_size, &kca);
| > + if (rc)
| > + return rc;
| > +
| > + /*
| > + * TODO: Convert 'clone-flags' to 64-bits on all architectures.
| > + * TODO: When ->clone_flags_high is non-zero, copy it in to the
| > + * higher word(s) of 'flags':
| > + *
| > + * flags = (kca.clone_flags_high << 32) | flags_low;
| > + */
| > + flags = flags_low;
| > + parent_tidp = (int *)(unsigned long)kca.parent_tid_ptr;
| > + child_tidp = (int *)(unsigned long)kca.child_tid_ptr;
|
| This will produce sparse errors. Is there a reason why 'clone_args'
| tid pointers aren't already pointers marked with __user ?
Making them pointers would make them 32-bit on some and 64-bit on other
architectures. We wanted the fields to be the same size on all architectures
for easier portability/extensibility. Given that we are copying-in a structure
from user-space, copying in a few extra bytes on the 32-bit architectures
would not be significant.
|
| > +
| > + stack_size = (unsigned long)kca.child_stack_size;
|
| Shouldn't this already be of integer type?
|
| > + if (stack_size)
| > + return -EINVAL;
|
| So the stack must have a zero size? Is this missing a '!' ?
Some architectures (IA64 ?) use the stack-size field. Those that don't
need it should error out. Again, its because we are trying to keep the
interface common across architectures.
|
| > +
| > + stack = (unsigned long)kca.child_stack;
| > + if (!stack)
| > + stack = regs->ARM_sp;
| > +
| > + return do_fork_with_pids(flags, stack, regs, stack_size, parent_tidp,
| > + child_tidp, kca.nr_pids, pids);
|
| Hmm, so let me get this syscall interface right. We have some arguments
| passed in registers and others via a (variable sized?) structure. It seems
| really weird to have, eg, a pointer to the pids and the number of pids
| passed in two separate ways.
|
| The grouping between what's passed in registers and via this clone_args
| structure seems to be random. Can it be sanitized?
:-) Well, we went through a lot of discussions on this. Here is one pointer
http://lkml.org/lkml/2009/9/11/92 (and that was version 6 of 13+ :-).
We wanted the first parameter of eclone(), flags, to remain 32-bit value to
avoid confusing user-space. (i.e if they accidentally pass a 64-bit flags
value to the clone() system call which takes 32-bit flags, the higher-32
bits would silently be dropped).
By sticking the higher clone-flags in 'struct clone_args', all architectures
would have to do the same extra work to set the higher flags so less
chance of error.
Re: passing the number of pids, nr_pids in the structure, I think it was
just that by passing it in the structure, we could avoid using an extra
register for the system call parameter.
'pid_t *' would be of different size on different architecutres. Passing
it as a separate parameter would avoid the pointer conversion. Note
that unlike the tid pointers above which are a few individual fields,
the pid_t array could in theory be large.
Hope that helps. Thanks the review comments.
Sukadev
next prev parent reply other threads:[~2010-03-24 18:19 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-22 1:06 [C/R ARM][PATCH 0/3] Linux Checkpoint-Restart - ARM port Christoffer Dall
2010-03-22 1:06 ` Christoffer Dall
2010-03-22 1:06 ` [C/R ARM][PATCH 1/3] ARM: Rudimentary syscall interfaces Christoffer Dall
2010-03-22 1:06 ` Christoffer Dall
[not found] ` <1269219965-23923-2-git-send-email-christofferdall-77OGu6e99YhyO3AAkE1OcX9LOBIZ5rWg@public.gmane.org>
2010-03-23 20:53 ` Russell King - ARM Linux
2010-03-23 20:53 ` Russell King - ARM Linux
2010-03-23 20:53 ` Russell King - ARM Linux
2010-03-24 2:03 ` Matt Helsley
2010-03-24 2:03 ` Matt Helsley
[not found] ` <20100324020342.GB5704-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-03-24 4:57 ` Oren Laadan
2010-03-24 4:57 ` Oren Laadan
2010-03-24 4:57 ` Oren Laadan
2010-03-24 14:02 ` Matt Helsley
2010-03-24 14:02 ` Matt Helsley
2010-03-24 15:53 ` Oren Laadan
2010-03-24 15:53 ` Oren Laadan
2010-03-24 19:36 ` Christoffer Dall
2010-03-24 19:36 ` Christoffer Dall
2010-03-25 1:11 ` Matt Helsley
2010-03-25 1:11 ` Matt Helsley
2010-03-25 1:17 ` Matt Helsley
2010-03-25 1:17 ` Matt Helsley
2010-03-25 10:29 ` Christoffer Dall
2010-03-25 10:29 ` Christoffer Dall
[not found] ` <20100325011753.GF5704-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-03-25 10:29 ` Christoffer Dall
[not found] ` <20100325011132.GE5704-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-03-25 1:17 ` Matt Helsley
2010-03-25 1:35 ` Oren Laadan
2010-03-25 1:35 ` Oren Laadan
2010-03-25 1:35 ` Oren Laadan
2010-03-25 10:34 ` Christoffer Dall
2010-03-25 10:34 ` Christoffer Dall
[not found] ` <4BAABDF4.8070904-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2010-03-25 10:34 ` Christoffer Dall
[not found] ` <7d08b87d1003241236n2b45e6f4ife36da841351df9d-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-03-25 1:11 ` Matt Helsley
[not found] ` <4BAA3586.1020604-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2010-03-24 19:36 ` Christoffer Dall
[not found] ` <20100324140252.GC5704-52DBMbEzqgQ/wnmkkaCWp/UQ3DHhIser@public.gmane.org>
2010-03-24 15:53 ` Oren Laadan
[not found] ` <Pine.LNX.4.64.1003240055050.5867-CXF6herHY6ykSYb+qCZC/1i27PF6R63G9nwVQlTi/Pw@public.gmane.org>
2010-03-24 14:02 ` Matt Helsley
[not found] ` <20100323205342.GA19572-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2010-03-24 2:03 ` Matt Helsley
2010-03-22 1:06 ` [C/R ARM][PATCH 2/3] ARM: Add the eclone system call Christoffer Dall
2010-03-22 1:06 ` Christoffer Dall
2010-03-23 21:06 ` Russell King - ARM Linux
2010-03-23 21:06 ` Russell King - ARM Linux
2010-03-24 18:19 ` Sukadev Bhattiprolu [this message]
2010-03-24 18:19 ` Sukadev Bhattiprolu
[not found] ` <20100323210616.GB19572-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2010-03-24 18:19 ` Sukadev Bhattiprolu
2010-03-24 19:42 ` Christoffer Dall
2010-03-24 19:42 ` Christoffer Dall
2010-03-24 19:42 ` Christoffer Dall
[not found] ` <1269219965-23923-3-git-send-email-christofferdall-77OGu6e99YhyO3AAkE1OcX9LOBIZ5rWg@public.gmane.org>
2010-03-23 21:06 ` Russell King - ARM Linux
[not found] ` <1269219965-23923-1-git-send-email-christofferdall-77OGu6e99YhyO3AAkE1OcX9LOBIZ5rWg@public.gmane.org>
2010-03-22 1:06 ` [C/R ARM][PATCH 1/3] ARM: Rudimentary syscall interfaces Christoffer Dall
2010-03-22 1:06 ` [C/R ARM][PATCH 2/3] ARM: Add the eclone system call Christoffer Dall
2010-03-22 1:06 ` [C/R ARM][PATCH 3/3] c/r: ARM implementation of checkpoint/restart Christoffer Dall
2010-03-22 1:06 ` Christoffer Dall
2010-03-22 1:06 ` Christoffer Dall
2010-03-23 16:09 ` Serge E. Hallyn
2010-03-23 16:09 ` Serge E. Hallyn
2010-03-24 19:46 ` Christoffer Dall
2010-03-24 19:46 ` Christoffer Dall
[not found] ` <20100323160933.GA4465-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-24 19:46 ` Christoffer Dall
[not found] ` <1269219965-23923-4-git-send-email-christofferdall-77OGu6e99YhyO3AAkE1OcX9LOBIZ5rWg@public.gmane.org>
2010-03-23 16:09 ` Serge E. Hallyn
2010-03-23 21:18 ` Russell King - ARM Linux
2010-03-23 21:18 ` Russell King - ARM Linux
2010-03-23 21:18 ` Russell King - ARM Linux
2010-03-24 1:53 ` Matt Helsley
2010-03-24 1:53 ` Matt Helsley
2010-03-24 20:48 ` Christoffer Dall
2010-03-24 20:48 ` Christoffer Dall
2010-03-26 2:47 ` Jamie Lokier
2010-03-26 2:47 ` Jamie Lokier
[not found] ` <20100326024759.GN19308-yetKDKU6eevNLxjTenLetw@public.gmane.org>
2010-03-26 3:02 ` Paul Mundt
2010-03-26 3:02 ` Paul Mundt
2010-03-26 3:02 ` Paul Mundt
2010-03-26 3:55 ` Jamie Lokier
2010-03-26 3:55 ` Jamie Lokier
2010-03-28 22:55 ` Christoffer Dall
2010-03-28 22:55 ` Christoffer Dall
[not found] ` <20100326030208.GA5815-M7jkjyW5wf5g9hUCZPvPmw@public.gmane.org>
2010-03-26 3:55 ` Jamie Lokier
2010-03-28 22:55 ` Christoffer Dall
[not found] ` <7d08b87d1003241348g347f092k1142318490e0bdcc-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-03-26 2:47 ` Jamie Lokier
[not found] ` <20100323211843.GC19572-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2010-03-24 1:53 ` Matt Helsley
2010-03-24 20:48 ` Christoffer Dall
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=20100324181907.GA28161@us.ibm.com \
--to=sukadev@linux.vnet.ibm.com \
--cc=linux-arm-kernel@lists.infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.