Commit d4b415eb authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

infect: Move parasite_args* into infect.c

This is the code that lets caller place arguments into memory
shared between parasite and compel (or caller).
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 3a53b589
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "parasite.h" #include "parasite.h"
#include "parasite-syscall.h" #include "parasite-syscall.h"
#include "images/mm.pb-c.h" #include "images/mm.pb-c.h"
#include "infect.h"
#define NR_IOEVENTS_IN_NPAGES(npages) ((PAGE_SIZE * npages - sizeof(struct aio_ring)) / sizeof(struct io_event)) #define NR_IOEVENTS_IN_NPAGES(npages) ((PAGE_SIZE * npages - sizeof(struct aio_ring)) / sizeof(struct io_event))
...@@ -104,7 +105,7 @@ int parasite_collect_aios(struct parasite_ctl *ctl, struct vm_area_list *vmas) ...@@ -104,7 +105,7 @@ int parasite_collect_aios(struct parasite_ctl *ctl, struct vm_area_list *vmas)
* creation. * creation.
*/ */
aa = parasite_args_s(ctl, aio_rings_args_size(vmas)); aa = compel_parasite_args_s(ctl, aio_rings_args_size(vmas));
pa = &aa->ring[0]; pa = &aa->ring[0];
list_for_each_entry(vma, &vmas->h, list) { list_for_each_entry(vma, &vmas->h, list) {
if (!vma_area_is(vma, VMA_AREA_AIORING)) if (!vma_area_is(vma, VMA_AREA_AIORING))
......
...@@ -720,6 +720,8 @@ static int dump_task_core_all(struct parasite_ctl *ctl, ...@@ -720,6 +720,8 @@ static int dump_task_core_all(struct parasite_ctl *ctl,
struct proc_status_creds *creds; struct proc_status_creds *creds;
struct parasite_dump_cgroup_args cgroup_args, *info = NULL; struct parasite_dump_cgroup_args cgroup_args, *info = NULL;
BUILD_BUG_ON(sizeof(cgroup_args) < PARASITE_ARG_SIZE_MIN);
pr_info("\n"); pr_info("\n");
pr_info("Dumping core (pid: %d)\n", pid); pr_info("Dumping core (pid: %d)\n", pid);
pr_info("----------------------------------------\n"); pr_info("----------------------------------------\n");
......
...@@ -34,4 +34,17 @@ extern int compel_stop_daemon(struct parasite_ctl *ctl); ...@@ -34,4 +34,17 @@ extern int compel_stop_daemon(struct parasite_ctl *ctl);
extern int compel_cure_remote(struct parasite_ctl *ctl); extern int compel_cure_remote(struct parasite_ctl *ctl);
extern int compel_cure_local(struct parasite_ctl *ctl); extern int compel_cure_local(struct parasite_ctl *ctl);
extern int compel_cure(struct parasite_ctl *ctl); extern int compel_cure(struct parasite_ctl *ctl);
#define PARASITE_ARG_SIZE_MIN ( 1 << 12)
#define compel_parasite_args(ctl, type) \
({ \
void *___ret; \
BUILD_BUG_ON(sizeof(type) > PARASITE_ARG_SIZE_MIN); \
___ret = compel_parasite_args_p(ctl); \
___ret; \
})
extern void *compel_parasite_args_p(struct parasite_ctl *ctl);
extern void *compel_parasite_args_s(struct parasite_ctl *ctl, int args_size);
#endif #endif
...@@ -55,16 +55,6 @@ struct proc_posix_timers_stat; ...@@ -55,16 +55,6 @@ struct proc_posix_timers_stat;
extern int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args, extern int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args,
struct parasite_ctl *ctl, struct pstree_item *); struct parasite_ctl *ctl, struct pstree_item *);
#define parasite_args(ctl, type) \
({ \
void *___ret; \
BUILD_BUG_ON(sizeof(type) > PARASITE_ARG_SIZE_MIN); \
___ret = parasite_args_p(ctl); \
___ret; \
})
extern void *parasite_args_p(struct parasite_ctl *ctl);
extern void *parasite_args_s(struct parasite_ctl *ctl, int args_size);
extern int parasite_send_fd(struct parasite_ctl *ctl, int fd); extern int parasite_send_fd(struct parasite_ctl *ctl, int fd);
/* /*
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#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 << 12)
#define PARASITE_START_AREA_MIN (4096) #define PARASITE_START_AREA_MIN (4096)
#define PARASITE_MAX_SIZE (64 << 10) #define PARASITE_MAX_SIZE (64 << 10)
...@@ -272,7 +271,7 @@ struct parasite_dump_cgroup_args { ...@@ -272,7 +271,7 @@ struct parasite_dump_cgroup_args {
* *
* The string is null terminated. * The string is null terminated.
*/ */
char contents[PARASITE_ARG_SIZE_MIN]; char contents[1 << 12];
}; };
/* the parasite prefix is added by gen_offsets.sh */ /* the parasite prefix is added by gen_offsets.sh */
......
...@@ -394,7 +394,7 @@ static int parasite_init_daemon(struct parasite_ctl *ctl) ...@@ -394,7 +394,7 @@ static int parasite_init_daemon(struct parasite_ctl *ctl)
*ctl->addr_cmd = PARASITE_CMD_INIT_DAEMON; *ctl->addr_cmd = PARASITE_CMD_INIT_DAEMON;
args = parasite_args(ctl, struct parasite_init_args); args = compel_parasite_args(ctl, struct parasite_init_args);
args->sigframe = (uintptr_t)ctl->rsigframe; args->sigframe = (uintptr_t)ctl->rsigframe;
args->log_level = log_get_loglevel(); args->log_level = log_get_loglevel();
...@@ -699,7 +699,7 @@ int compel_cure_remote(struct parasite_ctl *ctl) ...@@ -699,7 +699,7 @@ int compel_cure_remote(struct parasite_ctl *ctl)
*ctl->addr_cmd = PARASITE_CMD_UNMAP; *ctl->addr_cmd = PARASITE_CMD_UNMAP;
args = parasite_args(ctl, struct parasite_unmap_args); args = compel_parasite_args(ctl, struct parasite_unmap_args);
args->parasite_start = ctl->remote_map; args->parasite_start = ctl->remote_map;
args->parasite_len = ctl->map_length; args->parasite_len = ctl->map_length;
if (parasite_unmap(ctl, ctl->parasite_ip)) if (parasite_unmap(ctl, ctl->parasite_ip))
...@@ -746,3 +746,14 @@ int compel_cure(struct parasite_ctl *ctl) ...@@ -746,3 +746,14 @@ int compel_cure(struct parasite_ctl *ctl)
return ret; return ret;
} }
void *compel_parasite_args_p(struct parasite_ctl *ctl)
{
return ctl->addr_args;
}
void *compel_parasite_args_s(struct parasite_ctl *ctl, int args_size)
{
BUG_ON(args_size > ctl->args_size);
return compel_parasite_args_p(ctl);
}
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "files-reg.h" #include "files-reg.h"
#include "pagemap-cache.h" #include "pagemap-cache.h"
#include "fault-injection.h" #include "fault-injection.h"
#include "infect.h"
#include "protobuf.h" #include "protobuf.h"
#include "images/pagemap.pb-c.h" #include "images/pagemap.pb-c.h"
...@@ -188,7 +189,7 @@ static struct parasite_dump_pages_args *prep_dump_pages_args(struct parasite_ctl ...@@ -188,7 +189,7 @@ static struct parasite_dump_pages_args *prep_dump_pages_args(struct parasite_ctl
struct parasite_vma_entry *p_vma; struct parasite_vma_entry *p_vma;
struct vma_area *vma; struct vma_area *vma;
args = parasite_args_s(ctl, dump_pages_args_size(vma_area_list)); args = compel_parasite_args_s(ctl, dump_pages_args_size(vma_area_list));
p_vma = pargs_vmas(args); p_vma = pargs_vmas(args);
args->nr_vmas = 0; args->nr_vmas = 0;
......
...@@ -197,17 +197,6 @@ int __parasite_execute_syscall(struct parasite_ctl *ctl, ...@@ -197,17 +197,6 @@ int __parasite_execute_syscall(struct parasite_ctl *ctl,
return err; return err;
} }
void *parasite_args_p(struct parasite_ctl *ctl)
{
return ctl->addr_args;
}
void *parasite_args_s(struct parasite_ctl *ctl, int args_size)
{
BUG_ON(args_size > ctl->args_size);
return parasite_args_p(ctl);
}
static int parasite_run_in_thread(pid_t pid, unsigned int cmd, static int parasite_run_in_thread(pid_t pid, unsigned int cmd,
struct parasite_ctl *ctl, struct parasite_ctl *ctl,
struct thread_ctx *octx) struct thread_ctx *octx)
...@@ -400,10 +389,10 @@ int parasite_dump_thread_leader_seized(struct parasite_ctl *ctl, int pid, CoreEn ...@@ -400,10 +389,10 @@ int parasite_dump_thread_leader_seized(struct parasite_ctl *ctl, int pid, CoreEn
int ret; int ret;
if (seized_native(ctl)) { if (seized_native(ctl)) {
args = parasite_args(ctl, struct parasite_dump_thread); args = compel_parasite_args(ctl, struct parasite_dump_thread);
pc = args->creds; pc = args->creds;
} else { } else {
args_c = parasite_args(ctl, struct parasite_dump_thread_compat); args_c = compel_parasite_args(ctl, struct parasite_dump_thread_compat);
pc = args_c->creds; pc = args_c->creds;
} }
...@@ -440,10 +429,10 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id, ...@@ -440,10 +429,10 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id,
BUG_ON(id == 0); /* Leader is dumped in dump_task_core_all */ BUG_ON(id == 0); /* Leader is dumped in dump_task_core_all */
if (seized_native(ctl)) { if (seized_native(ctl)) {
args = parasite_args(ctl, struct parasite_dump_thread); args = compel_parasite_args(ctl, struct parasite_dump_thread);
pc = args->creds; pc = args->creds;
} else { } else {
args_c = parasite_args(ctl, struct parasite_dump_thread_compat); args_c = compel_parasite_args(ctl, struct parasite_dump_thread_compat);
pc = args_c->creds; pc = args_c->creds;
} }
...@@ -503,9 +492,9 @@ int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_imgset *cr_ ...@@ -503,9 +492,9 @@ int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_imgset *cr_
bool native_task = seized_native(ctl); bool native_task = seized_native(ctl);
if (native_task) if (native_task)
args = parasite_args(ctl, struct parasite_dump_sa_args); args = compel_parasite_args(ctl, struct parasite_dump_sa_args);
else else
args_c = parasite_args(ctl, struct parasite_dump_sa_args_compat); args_c = compel_parasite_args(ctl, struct parasite_dump_sa_args_compat);
ret = parasite_execute_daemon(PARASITE_CMD_DUMP_SIGACTS, ctl); ret = parasite_execute_daemon(PARASITE_CMD_DUMP_SIGACTS, ctl);
if (ret < 0) if (ret < 0)
...@@ -555,9 +544,9 @@ int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct pstree_item *i ...@@ -555,9 +544,9 @@ int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct pstree_item *i
int ret; int ret;
if (seized_native(ctl)) if (seized_native(ctl))
args = parasite_args(ctl, struct parasite_dump_itimers_args); args = compel_parasite_args(ctl, struct parasite_dump_itimers_args);
else else
args_c = parasite_args(ctl, struct parasite_dump_itimers_args_compat); args_c = compel_parasite_args(ctl, struct parasite_dump_itimers_args_compat);
ret = parasite_execute_daemon(PARASITE_CMD_DUMP_ITIMERS, ctl); ret = parasite_execute_daemon(PARASITE_CMD_DUMP_ITIMERS, ctl);
if (ret < 0) if (ret < 0)
...@@ -646,7 +635,7 @@ int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args, ...@@ -646,7 +635,7 @@ int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args,
args_size = posix_timers_dump_size(proc_args->timer_n); args_size = posix_timers_dump_size(proc_args->timer_n);
else else
args_size = posix_timers_compat_dump_size(proc_args->timer_n); args_size = posix_timers_compat_dump_size(proc_args->timer_n);
args = parasite_args_s(ctl, args_size); args = compel_parasite_args_s(ctl, args_size);
set_posix_timer_arg(args, ctl, timer_n, proc_args->timer_n); set_posix_timer_arg(args, ctl, timer_n, proc_args->timer_n);
...@@ -677,7 +666,7 @@ int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_mis ...@@ -677,7 +666,7 @@ int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_mis
{ {
struct parasite_dump_misc *ma; struct parasite_dump_misc *ma;
ma = parasite_args(ctl, struct parasite_dump_misc); ma = compel_parasite_args(ctl, struct parasite_dump_misc);
if (parasite_execute_daemon(PARASITE_CMD_DUMP_MISC, ctl) < 0) if (parasite_execute_daemon(PARASITE_CMD_DUMP_MISC, ctl) < 0)
return -1; return -1;
...@@ -689,7 +678,7 @@ struct parasite_tty_args *parasite_dump_tty(struct parasite_ctl *ctl, int fd, in ...@@ -689,7 +678,7 @@ struct parasite_tty_args *parasite_dump_tty(struct parasite_ctl *ctl, int fd, in
{ {
struct parasite_tty_args *p; struct parasite_tty_args *p;
p = parasite_args(ctl, struct parasite_tty_args); p = compel_parasite_args(ctl, struct parasite_tty_args);
p->fd = fd; p->fd = fd;
p->type = type; p->type = type;
...@@ -707,7 +696,7 @@ int parasite_drain_fds_seized(struct parasite_ctl *ctl, ...@@ -707,7 +696,7 @@ int parasite_drain_fds_seized(struct parasite_ctl *ctl,
struct parasite_drain_fd *args; struct parasite_drain_fd *args;
size = drain_fds_size(dfds); size = drain_fds_size(dfds);
args = parasite_args_s(ctl, size); args = compel_parasite_args_s(ctl, size);
args->nr_fds = nr_fds; args->nr_fds = nr_fds;
memcpy(&args->fds, dfds->fds + off, sizeof(int) * nr_fds); memcpy(&args->fds, dfds->fds + off, sizeof(int) * nr_fds);
...@@ -1012,7 +1001,7 @@ int parasite_dump_cgroup(struct parasite_ctl *ctl, struct parasite_dump_cgroup_a ...@@ -1012,7 +1001,7 @@ int parasite_dump_cgroup(struct parasite_ctl *ctl, struct parasite_dump_cgroup_a
int ret; int ret;
struct parasite_dump_cgroup_args *ca; struct parasite_dump_cgroup_args *ca;
ca = parasite_args(ctl, struct parasite_dump_cgroup_args); ca = compel_parasite_args(ctl, struct parasite_dump_cgroup_args);
ret = parasite_execute_daemon(PARASITE_CMD_DUMP_CGROUP, ctl); ret = parasite_execute_daemon(PARASITE_CMD_DUMP_CGROUP, ctl);
if (ret) { if (ret) {
pr_err("Parasite failed to dump /proc/self/cgroup\n"); pr_err("Parasite failed to dump /proc/self/cgroup\n");
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "log.h" #include "log.h"
#include "mem.h" #include "mem.h"
#include "vma.h" #include "vma.h"
#include "infect.h"
#ifdef LOG_PREFIX #ifdef LOG_PREFIX
# undef LOG_PREFIX # undef LOG_PREFIX
...@@ -46,7 +47,7 @@ int parasite_fixup_vdso(struct parasite_ctl *ctl, pid_t pid, ...@@ -46,7 +47,7 @@ int parasite_fixup_vdso(struct parasite_ctl *ctl, pid_t pid,
struct vma_area *vma; struct vma_area *vma;
off_t off; off_t off;
args = parasite_args(ctl, struct parasite_vdso_vma_entry); args = compel_parasite_args(ctl, struct parasite_vdso_vma_entry);
if (kdat.pmap == PM_FULL) { if (kdat.pmap == PM_FULL) {
BUG_ON(vdso_pfn == VDSO_BAD_PFN); BUG_ON(vdso_pfn == VDSO_BAD_PFN);
fd = open_proc(pid, "pagemap"); fd = open_proc(pid, "pagemap");
......
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