From a722258d59f52706a28aa542093f075bf166360a Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Mon, 14 Nov 2016 16:05:49 +0300 Subject: [PATCH] compel: Relax the thread mgmt API Signed-off-by: Pavel Emelyanov Signed-off-by: Andrei Vagin --- compel/include/infect-priv.h | 2 ++ compel/include/uapi/infect.h | 6 ++---- compel/src/lib/infect.c | 13 ++++++++----- criu/parasite-syscall.c | 4 ++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/compel/include/infect-priv.h b/compel/include/infect-priv.h index da56f0804..4eda1acdd 100644 --- a/compel/include/infect-priv.h +++ b/compel/include/infect-priv.h @@ -42,6 +42,8 @@ struct parasite_ctl { }; struct parasite_thread_ctl { + int tid; + struct parasite_ctl *ctl; struct thread_ctx th; }; diff --git a/compel/include/uapi/infect.h b/compel/include/uapi/infect.h index 28f0c469b..75fc4a7a9 100644 --- a/compel/include/uapi/infect.h +++ b/compel/include/uapi/infect.h @@ -64,9 +64,7 @@ extern void *compel_parasite_args_s(struct parasite_ctl *ctl, int args_size); extern int compel_execute_syscall(struct parasite_ctl *ctl, user_regs_struct_t *regs, const char *code_syscall); -extern int compel_run_in_thread(pid_t pid, unsigned int cmd, - struct parasite_ctl *ctl, - struct parasite_thread_ctl *tctl); +extern int compel_run_in_thread(struct parasite_thread_ctl *tctl, unsigned int cmd); /* * The PTRACE_SYSCALL will trap task twice -- on @@ -139,7 +137,7 @@ struct parasite_blob_desc { extern struct parasite_blob_desc *compel_parasite_blob_desc(struct parasite_ctl *); typedef int (*save_regs_t)(void *, user_regs_struct_t *, user_fpregs_struct_t *); -extern int compel_get_thread_regs(pid_t pid, struct parasite_thread_ctl *, save_regs_t, void *); +extern int compel_get_thread_regs(struct parasite_thread_ctl *, save_regs_t, void *); extern void compel_relocs_apply(void *mem, void *vbase, size_t size, compel_reloc_t *elf_relocs, size_t nr_relocs); diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c index b8e229302..78427591d 100644 --- a/compel/src/lib/infect.c +++ b/compel/src/lib/infect.c @@ -856,6 +856,9 @@ struct parasite_thread_ctl *compel_prepare_thread(struct parasite_ctl *ctl, int if (prepare_thread(pid, &tctl->th)) { xfree(tctl); tctl = NULL; + } else { + tctl->tid = pid; + tctl->ctl = ctl; } } @@ -1083,10 +1086,10 @@ void *compel_parasite_args_s(struct parasite_ctl *ctl, int args_size) return compel_parasite_args_p(ctl); } -int compel_run_in_thread(pid_t pid, unsigned int cmd, - struct parasite_ctl *ctl, - struct parasite_thread_ctl *tctl) +int compel_run_in_thread(struct parasite_thread_ctl *tctl, unsigned int cmd) { + int pid = tctl->tid; + struct parasite_ctl *ctl = tctl->ctl; struct thread_ctx *octx = &tctl->th; void *stack = ctl->r_thread_stack; user_regs_struct_t regs = octx->regs; @@ -1297,9 +1300,9 @@ k_rtsigset_t *compel_task_sigmask(struct parasite_ctl *ctl) return thread_ctx_sigmask(&ctl->orig); } -int compel_get_thread_regs(pid_t pid, struct parasite_thread_ctl *tctl, save_regs_t save, void * arg) +int compel_get_thread_regs(struct parasite_thread_ctl *tctl, save_regs_t save, void * arg) { - return get_task_regs(pid, tctl->th.regs, save, arg); + return get_task_regs(tctl->tid, tctl->th.regs, save, arg); } struct infect_ctx *compel_infect_ctx(struct parasite_ctl *ctl) diff --git a/criu/parasite-syscall.c b/criu/parasite-syscall.c index 1a052a098..be93b319e 100644 --- a/criu/parasite-syscall.c +++ b/criu/parasite-syscall.c @@ -203,7 +203,7 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id, tc->has_blk_sigset = true; memcpy(&tc->blk_sigset, compel_thread_sigmask(tctl), sizeof(k_rtsigset_t)); - ret = compel_run_in_thread(pid, PARASITE_CMD_DUMP_THREAD, ctl, tctl); + ret = compel_run_in_thread(tctl, PARASITE_CMD_DUMP_THREAD); if (ret) { pr_err("Can't init thread in parasite %d\n", pid); goto err_rth; @@ -215,7 +215,7 @@ int parasite_dump_thread_seized(struct parasite_ctl *ctl, int id, goto err_rth; } - ret = compel_get_thread_regs(pid, tctl, save_task_regs, core); + ret = compel_get_thread_regs(tctl, save_task_regs, core); if (ret) { pr_err("Can't obtain regs for thread %d\n", pid); goto err_rth;