[CRIU] [PATCH 1/9] parasite: Make parasite arguments variable size
Douglas, William
william.douglas at intel.com
Fri Mar 1 13:10:50 EST 2013
On Fri, Mar 1, 2013 at 10:05 AM, Pavel Emelyanov <xemul at parallels.com> wrote:
> On 03/01/2013 09:31 PM, Douglas, William wrote:
>> On Fri, Mar 1, 2013 at 8:02 AM, Pavel Emelyanov <xemul at parallels.com> wrote:
>>> Sometimes we don't know the exact amount of data we would want
>>> to send to parasite via args area (e.g. -- while draining fds).
>>>
>>> Fix this, by moving the args area behind the parasite blob and
>>> mmap-ing it with the run-time calculated size.
>>>
>>> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
>>>
>>> ---
>>> arch/arm/parasite-head.S | 2 --
>>> arch/x86/parasite-head.S | 3 ---
>>> include/parasite-syscall.h | 1 +
>>> include/parasite.h | 2 +-
>>> parasite-syscall.c | 12 +++++++++---
>>> pie/gen-offsets.sh | 2 +-
>>> pie/pie.lds.S.in | 2 ++
>>> 7 files changed, 14 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/arch/arm/parasite-head.S b/arch/arm/parasite-head.S
>>> index b4bffe6..74fd4cb 100644
>>> --- a/arch/arm/parasite-head.S
>>> +++ b/arch/arm/parasite-head.S
>>> @@ -13,8 +13,6 @@ ENTRY(__export_parasite_head_start)
>>> __export_parasite_cmd:
>>> .long 0
>>> __export_parasite_args:
>>> - .long 0
>>> - .space PARASITE_ARG_SIZE,0
>>> .space PARASITE_STACK_SIZE,0
>>>
>>> .space 228, 0
>>> diff --git a/arch/x86/parasite-head.S b/arch/x86/parasite-head.S
>>> index 289672c..0b62750 100644
>>> --- a/arch/x86/parasite-head.S
>>> +++ b/arch/x86/parasite-head.S
>>> @@ -15,9 +15,6 @@ ENTRY(__export_parasite_head_start)
>>> .align 8
>>> __export_parasite_cmd:
>>> .long 0
>>> -__export_parasite_args:
>>> - .long 0
>>> - .space PARASITE_ARG_SIZE,0
>>> .space PARASITE_STACK_SIZE,0
>>> __export_parasite_stack:
>>> .long 0
>>> diff --git a/include/parasite-syscall.h b/include/parasite-syscall.h
>>> index 2f32d03..ee5743e 100644
>>> --- a/include/parasite-syscall.h
>>> +++ b/include/parasite-syscall.h
>>> @@ -19,6 +19,7 @@ struct parasite_ctl {
>>>
>>> unsigned int *addr_cmd; /* addr for command */
>>> void *addr_args; /* address for arguments */
>>> + unsigned long args_size;
>>> int tsock; /* transport socket for transfering fds */
>>> };
>>>
>>> diff --git a/include/parasite.h b/include/parasite.h
>>> index 5d5b8df..66a559e 100644
>>> --- a/include/parasite.h
>>> +++ b/include/parasite.h
>>> @@ -2,7 +2,7 @@
>>> #define __CR_PARASITE_H__
>>>
>>> #define PARASITE_STACK_SIZE (16 << 10)
>>> -#define PARASITE_ARG_SIZE 8196
>>> +#define PARASITE_ARG_SIZE_MIN ( 1 << 13)
>>>
>>> #define PARASITE_MAX_SIZE (64 << 10)
>>>
>>> diff --git a/parasite-syscall.c b/parasite-syscall.c
>>> index 6cc6283..03b5546 100644
>>> --- a/parasite-syscall.c
>>> +++ b/parasite-syscall.c
>>> @@ -184,12 +184,12 @@ err:
>>>
>>> static void *parasite_args_s(struct parasite_ctl *ctl, int args_size)
>>> {
>>> - BUG_ON(args_size > PARASITE_ARG_SIZE);
>>> + BUG_ON(args_size > ctl->args_size);
>>> return ctl->addr_args;
>>> }
>>>
>>> #define parasite_args(ctl, type) ({ \
>>> - BUILD_BUG_ON(sizeof(type) > PARASITE_ARG_SIZE); \
>>> + BUILD_BUG_ON(sizeof(type) > PARASITE_ARG_SIZE_MIN);\
>>
>> This check makes me wonder if MIN is the correct description here.
>> Isn't this a MAX check instead?
>
> What I mean here is -- the size of the args area should be _not_ _less_
> than the size of an object we're about to put there. And since the area
> is _at_ _least_ ARG_SIZE_MIN butes, presumably this BUG_ON is correct.
>
Ah yes, thanks for the explanation.
More information about the CRIU
mailing list