Commit 7a7506f6 authored by Pavel Emelyanov's avatar Pavel Emelyanov

fd: Dynamically allocate args for the array of fds to drain

Just make use of previous patch. The creds dumping args are tuned to
fit one page (minimal static args size).
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent b8d0d5e7
...@@ -1281,7 +1281,7 @@ static int dump_one_task(struct pstree_item *item) ...@@ -1281,7 +1281,7 @@ static int dump_one_task(struct pstree_item *item)
} }
ret = -1; ret = -1;
parasite_ctl = parasite_infect_seized(pid, item, &vma_area_list); parasite_ctl = parasite_infect_seized(pid, item, &vma_area_list, dfds);
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;
......
...@@ -53,7 +53,8 @@ struct pstree_item; ...@@ -53,7 +53,8 @@ struct pstree_item;
extern int parasite_cure_seized(struct parasite_ctl *ctl, struct pstree_item *item); extern int parasite_cure_seized(struct parasite_ctl *ctl, struct pstree_item *item);
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 list_head *vma_area_list); struct list_head *vma_area_list,
struct parasite_drain_fd *dfds);
extern struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct list_head *vma_area_list); extern struct parasite_ctl *parasite_prep_ctl(pid_t pid, struct list_head *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);
......
...@@ -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_MIN ( 1 << 13) #define PARASITE_ARG_SIZE_MIN ( 1 << 12)
#define PARASITE_MAX_SIZE (64 << 10) #define PARASITE_MAX_SIZE (64 << 10)
...@@ -87,7 +87,7 @@ struct parasite_dump_misc { ...@@ -87,7 +87,7 @@ struct parasite_dump_misc {
u32 umask; u32 umask;
}; };
#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int)) #define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int) - 2 * sizeof(unsigned))
struct parasite_dump_creds { struct parasite_dump_creds {
unsigned int secbits; unsigned int secbits;
......
...@@ -794,12 +794,17 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size) ...@@ -794,12 +794,17 @@ int parasite_map_exchange(struct parasite_ctl *ctl, unsigned long size)
return 0; return 0;
} }
static unsigned long parasite_args_size(void) static unsigned long parasite_args_size(struct parasite_drain_fd *dfds)
{ {
return PARASITE_ARG_SIZE_MIN; unsigned long size = PARASITE_ARG_SIZE_MIN;
size = max(size, (unsigned long)drain_fds_size(dfds));
return size;
} }
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, struct parasite_drain_fd *dfds)
{ {
int ret; int ret;
struct parasite_ctl *ctl; struct parasite_ctl *ctl;
...@@ -815,7 +820,7 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item, ...@@ -815,7 +820,7 @@ 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(); ctl->args_size = parasite_args_size(dfds);
ret = parasite_map_exchange(ctl, parasite_size + ctl->args_size); ret = parasite_map_exchange(ctl, parasite_size + ctl->args_size);
if (ret) if (ret)
goto err_restore; goto err_restore;
......
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