Commit ee2e8e5b authored by Pavel Emelyanov's avatar Pavel Emelyanov

parasite: Cleanup args size fetching

Right now we push all the auxiliary arguments to parasite_infect_seized
while 2 of them are only required to calculate the size of args area.

Let's better keep track of required args size and get rid of excessive
arguments to parasite_infect_seized().
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent ca3b8ca0
...@@ -1424,7 +1424,7 @@ static int pre_dump_one_task(struct pstree_item *item, struct list_head *ctls) ...@@ -1424,7 +1424,7 @@ static int pre_dump_one_task(struct pstree_item *item, struct list_head *ctls)
} }
ret = -1; ret = -1;
parasite_ctl = parasite_infect_seized(pid, item, &vmas, NULL, 0); parasite_ctl = parasite_infect_seized(pid, item, &vmas);
if (!parasite_ctl) { if (!parasite_ctl) {
pr_err("Can't infect (pid: %d) with parasite\n", pid); pr_err("Can't infect (pid: %d) with parasite\n", pid);
goto err_free; goto err_free;
...@@ -1513,6 +1513,8 @@ static int dump_one_task(struct pstree_item *item) ...@@ -1513,6 +1513,8 @@ static int dump_one_task(struct pstree_item *item)
pr_err("Collect fds (pid: %d) failed with %d\n", pid, ret); pr_err("Collect fds (pid: %d) failed with %d\n", pid, ret);
goto err; goto err;
} }
parasite_ensure_args_size(drain_fds_size(dfds));
} }
ret = parse_posix_timers(pid, &proc_args); ret = parse_posix_timers(pid, &proc_args);
...@@ -1521,13 +1523,15 @@ static int dump_one_task(struct pstree_item *item) ...@@ -1521,13 +1523,15 @@ static int dump_one_task(struct pstree_item *item)
goto err; goto err;
} }
parasite_ensure_args_size(posix_timers_dump_size(proc_args.timer_n));
ret = dump_task_signals(pid, item); ret = dump_task_signals(pid, item);
if (ret) { if (ret) {
pr_err("Dump %d signals failed %d\n", pid, ret); pr_err("Dump %d signals failed %d\n", pid, ret);
goto err; goto err;
} }
parasite_ctl = parasite_infect_seized(pid, item, &vmas, dfds, proc_args.timer_n); parasite_ctl = parasite_infect_seized(pid, item, &vmas);
if (!parasite_ctl) { if (!parasite_ctl) {
pr_err("Can't infect (pid: %d) with parasite\n", pid); pr_err("Can't infect (pid: %d) with parasite\n", pid);
goto err; goto err;
......
...@@ -98,9 +98,8 @@ extern int parasite_cure_local(struct parasite_ctl *ctl); ...@@ -98,9 +98,8 @@ extern int parasite_cure_local(struct parasite_ctl *ctl);
extern int parasite_cure_seized(struct parasite_ctl *ctl); extern int parasite_cure_seized(struct parasite_ctl *ctl);
extern struct parasite_ctl *parasite_infect_seized(pid_t pid, extern struct parasite_ctl *parasite_infect_seized(pid_t pid,
struct pstree_item *item, struct pstree_item *item,
struct vm_area_list *vma_area_list, struct vm_area_list *vma_area_list);
struct parasite_drain_fd *dfds, extern void parasite_ensure_args_size(unsigned long sz);
int timer_n);
extern struct parasite_ctl *parasite_prep_ctl(pid_t pid, extern struct parasite_ctl *parasite_prep_ctl(pid_t pid,
struct vm_area_list *vma_area_list); struct vm_area_list *vma_area_list);
extern int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size); extern int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size);
......
...@@ -1148,17 +1148,11 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size) ...@@ -1148,17 +1148,11 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size)
return 0; return 0;
} }
static unsigned long parasite_args_size(struct vm_area_list *vmas, struct parasite_drain_fd *dfds, int timer_n) static unsigned long parasite_args_size = PARASITE_ARG_SIZE_MIN;
void parasite_ensure_args_size(unsigned long sz)
{ {
unsigned long size = PARASITE_ARG_SIZE_MIN; if (parasite_args_size < sz)
parasite_args_size = sz;
if (dfds)
size = max(size, (unsigned long)drain_fds_size(dfds));
if (timer_n)
size = max(size, (unsigned long)posix_timers_dump_size(timer_n));
size = max(size, (unsigned long)dump_pages_args_size(vmas));
return round_up(size, PAGE_SIZE);
} }
static int parasite_start_daemon(struct parasite_ctl *ctl, struct pstree_item *item) static int parasite_start_daemon(struct parasite_ctl *ctl, struct pstree_item *item)
...@@ -1186,8 +1180,7 @@ static int parasite_start_daemon(struct parasite_ctl *ctl, struct pstree_item *i ...@@ -1186,8 +1180,7 @@ static int parasite_start_daemon(struct parasite_ctl *ctl, struct pstree_item *i
} }
struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
struct vm_area_list *vma_area_list, struct parasite_drain_fd *dfds, struct vm_area_list *vma_area_list)
int timer_n)
{ {
int ret; int ret;
struct parasite_ctl *ctl; struct parasite_ctl *ctl;
...@@ -1199,6 +1192,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, ...@@ -1199,6 +1192,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
if (!ctl) if (!ctl)
return NULL; return NULL;
parasite_ensure_args_size(dump_pages_args_size(vma_area_list));
/* /*
* Inject a parasite engine. Ie allocate memory inside alien * Inject a parasite engine. Ie allocate memory inside alien
* space and copy engine code there. Then re-map the engine * space and copy engine code there. Then re-map the engine
...@@ -1206,7 +1201,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, ...@@ -1206,7 +1201,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
* without using ptrace at all. * without using ptrace at all.
*/ */
ctl->args_size = parasite_args_size(vma_area_list, dfds, timer_n); ctl->args_size = round_up(parasite_args_size, PAGE_SIZE);
parasite_args_size = PARASITE_ARG_SIZE_MIN; /* reset for next task */
map_exchange_size = parasite_size + ctl->args_size; map_exchange_size = parasite_size + ctl->args_size;
map_exchange_size += RESTORE_STACK_SIGFRAME + PARASITE_STACK_SIZE; map_exchange_size += RESTORE_STACK_SIGFRAME + PARASITE_STACK_SIZE;
if (item->nr_threads > 1) if (item->nr_threads > 1)
......
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