Commit b8d0d5e7 authored by Pavel Emelyanov's avatar Pavel Emelyanov

parasite: Make parasite arguments variable size

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: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 8133ab41
...@@ -13,8 +13,6 @@ ENTRY(__export_parasite_head_start) ...@@ -13,8 +13,6 @@ ENTRY(__export_parasite_head_start)
__export_parasite_cmd: __export_parasite_cmd:
.long 0 .long 0
__export_parasite_args: __export_parasite_args:
.long 0
.space PARASITE_ARG_SIZE,0
.space PARASITE_STACK_SIZE,0 .space PARASITE_STACK_SIZE,0
.space 228, 0 .space 228, 0
......
...@@ -15,9 +15,6 @@ ENTRY(__export_parasite_head_start) ...@@ -15,9 +15,6 @@ ENTRY(__export_parasite_head_start)
.align 8 .align 8
__export_parasite_cmd: __export_parasite_cmd:
.long 0 .long 0
__export_parasite_args:
.long 0
.space PARASITE_ARG_SIZE,0
.space PARASITE_STACK_SIZE,0 .space PARASITE_STACK_SIZE,0
__export_parasite_stack: __export_parasite_stack:
.long 0 .long 0
......
...@@ -19,6 +19,7 @@ struct parasite_ctl { ...@@ -19,6 +19,7 @@ struct parasite_ctl {
unsigned int *addr_cmd; /* addr for command */ unsigned int *addr_cmd; /* addr for command */
void *addr_args; /* address for arguments */ void *addr_args; /* address for arguments */
unsigned long args_size;
int tsock; /* transport socket for transfering fds */ int tsock; /* transport socket for transfering fds */
}; };
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define __CR_PARASITE_H__ #define __CR_PARASITE_H__
#define PARASITE_STACK_SIZE (16 << 10) #define PARASITE_STACK_SIZE (16 << 10)
#define PARASITE_ARG_SIZE 8196 #define PARASITE_ARG_SIZE_MIN ( 1 << 13)
#define PARASITE_MAX_SIZE (64 << 10) #define PARASITE_MAX_SIZE (64 << 10)
......
...@@ -184,12 +184,12 @@ err: ...@@ -184,12 +184,12 @@ err:
static void *parasite_args_s(struct parasite_ctl *ctl, int args_size) 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; return ctl->addr_args;
} }
#define parasite_args(ctl, type) ({ \ #define parasite_args(ctl, type) ({ \
BUILD_BUG_ON(sizeof(type) > PARASITE_ARG_SIZE); \ BUILD_BUG_ON(sizeof(type) > PARASITE_ARG_SIZE_MIN);\
ctl->addr_args; \ ctl->addr_args; \
}) })
...@@ -794,6 +794,11 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size) ...@@ -794,6 +794,11 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size)
return 0; return 0;
} }
static unsigned long parasite_args_size(void)
{
return PARASITE_ARG_SIZE_MIN;
}
struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, struct list_head *vma_area_list) struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, struct list_head *vma_area_list)
{ {
int ret; int ret;
...@@ -810,7 +815,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, ...@@ -810,7 +815,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
* without using ptrace at all. * without using ptrace at all.
*/ */
ret = parasite_map_exchange(ctl, parasite_size); ctl->args_size = parasite_args_size();
ret = parasite_map_exchange(ctl, parasite_size + ctl->args_size);
if (ret) if (ret)
goto err_restore; goto err_restore;
......
...@@ -11,7 +11,7 @@ BLOB=${NAME}_blob ...@@ -11,7 +11,7 @@ BLOB=${NAME}_blob
OBJNAME=${FILE}.built-in.bin.o OBJNAME=${FILE}.built-in.bin.o
BINARY=${FILE}.built-in.bin BINARY=${FILE}.built-in.bin
AWK_CMD='$2 ~ /^[tT]$/ { print "#define '$PREFIX'" $3 " 0x" $1; }' AWK_CMD='$2 ~ /^[tTA]$/ { print "#define '$PREFIX'" $3 " 0x" $1; }'
cat << EOF cat << EOF
/* Autogenerated by $0, do not edit */ /* Autogenerated by $0, do not edit */
......
...@@ -21,3 +21,5 @@ SECTIONS ...@@ -21,3 +21,5 @@ SECTIONS
*(*) *(*)
} }
} }
__export_parasite_args = .;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment