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)
__export_parasite_cmd:
.long 0
__export_parasite_args:
.long 0
.space PARASITE_ARG_SIZE,0
.space PARASITE_STACK_SIZE,0
.space 228, 0
......
......@@ -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
......
......@@ -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 */
};
......
......@@ -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)
......
......@@ -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);\
ctl->addr_args; \
})
......@@ -794,6 +794,11 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size)
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)
{
int ret;
......@@ -810,7 +815,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
* 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)
goto err_restore;
......
......@@ -11,7 +11,7 @@ BLOB=${NAME}_blob
OBJNAME=${FILE}.built-in.bin.o
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
/* Autogenerated by $0, do not edit */
......
......@@ -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