From ee2e8e5bb9fe2504965b9b817299f48ef6b67c6e Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Fri, 7 Nov 2014 17:53:00 +0400 Subject: [PATCH] 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: Pavel Emelyanov --- cr-dump.c | 8 ++++++-- include/parasite-syscall.h | 5 ++--- parasite-syscall.c | 22 +++++++++------------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/cr-dump.c b/cr-dump.c index 324780d03..36a3fd5cf 100644 --- a/cr-dump.c +++ b/cr-dump.c @@ -1424,7 +1424,7 @@ static int pre_dump_one_task(struct pstree_item *item, struct list_head *ctls) } ret = -1; - parasite_ctl = parasite_infect_seized(pid, item, &vmas, NULL, 0); + parasite_ctl = parasite_infect_seized(pid, item, &vmas); if (!parasite_ctl) { pr_err("Can't infect (pid: %d) with parasite\n", pid); goto err_free; @@ -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); goto err; } + + parasite_ensure_args_size(drain_fds_size(dfds)); } ret = parse_posix_timers(pid, &proc_args); @@ -1521,13 +1523,15 @@ static int dump_one_task(struct pstree_item *item) goto err; } + parasite_ensure_args_size(posix_timers_dump_size(proc_args.timer_n)); + ret = dump_task_signals(pid, item); if (ret) { pr_err("Dump %d signals failed %d\n", pid, ret); 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) { pr_err("Can't infect (pid: %d) with parasite\n", pid); goto err; diff --git a/include/parasite-syscall.h b/include/parasite-syscall.h index 0a882e02e..4f89cddcb 100644 --- a/include/parasite-syscall.h +++ b/include/parasite-syscall.h @@ -98,9 +98,8 @@ extern int parasite_cure_local(struct parasite_ctl *ctl); extern int parasite_cure_seized(struct parasite_ctl *ctl); extern 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, - int timer_n); + struct vm_area_list *vma_area_list); +extern void parasite_ensure_args_size(unsigned long sz); extern struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct vm_area_list *vma_area_list); extern int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size); diff --git a/parasite-syscall.c b/parasite-syscall.c index d17db0b14..5b014bd20 100644 --- a/parasite-syscall.c +++ b/parasite-syscall.c @@ -1148,17 +1148,11 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size) 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 (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); + if (parasite_args_size < sz) + parasite_args_size = sz; } 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 } 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, - int timer_n) + struct vm_area_list *vma_area_list) { int ret; struct parasite_ctl *ctl; @@ -1199,6 +1192,8 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, if (!ctl) return NULL; + parasite_ensure_args_size(dump_pages_args_size(vma_area_list)); + /* * Inject a parasite engine. Ie allocate memory inside alien * 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, * 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 += RESTORE_STACK_SIGFRAME + PARASITE_STACK_SIZE; if (item->nr_threads > 1)