Commit f8142ba3 authored by Pavel Emelyanov's avatar Pavel Emelyanov

rst: Make thread_restore_args be part of task_restore_args

The former is actually the parameters of thread group leader, so
it's natural to have them on-task.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 0a77f4f1
...@@ -1408,7 +1408,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v ...@@ -1408,7 +1408,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
/* /*
* Adjust stack. * Adjust stack.
*/ */
new_sp = RESTORE_ALIGN_STACK((long)task_args->mem_zone.stack, sizeof(task_args->mem_zone.stack)); new_sp = RESTORE_ALIGN_STACK((long)task_args->t.mem_zone.stack,
sizeof(task_args->t.mem_zone.stack));
/* /*
* Get a reference to shared memory area which is * Get a reference to shared memory area which is
...@@ -1455,7 +1456,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v ...@@ -1455,7 +1456,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
BUG_ON(core->mtype != CORE_ENTRY__MARCH__X86_64); BUG_ON(core->mtype != CORE_ENTRY__MARCH__X86_64);
task_args->pid = pid; task_args->t.pid = pid;
task_args->logfd = log_get_fd(); task_args->logfd = log_get_fd();
task_args->loglevel = log_get_loglevel(); task_args->loglevel = log_get_loglevel();
task_args->sigchld_act = sigchld_act; task_args->sigchld_act = sigchld_act;
...@@ -1463,17 +1464,17 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v ...@@ -1463,17 +1464,17 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
strncpy(task_args->comm, core->tc->comm, sizeof(task_args->comm)); strncpy(task_args->comm, core->tc->comm, sizeof(task_args->comm));
task_args->clear_tid_addr = core->thread_info->clear_tid_addr; task_args->t.clear_tid_addr = core->thread_info->clear_tid_addr;
task_args->ids = *core->ids; task_args->ids = *core->ids;
task_args->gpregs = *core->thread_info->gpregs; task_args->t.gpregs = *core->thread_info->gpregs;
task_args->blk_sigset = core->tc->blk_sigset; task_args->blk_sigset = core->tc->blk_sigset;
if (core->thread_core) { if (core->thread_core) {
task_args->has_futex = true; task_args->t.has_futex = true;
task_args->futex_rla = core->thread_core->futex_rla; task_args->t.futex_rla = core->thread_core->futex_rla;
task_args->futex_rla_len = core->thread_core->futex_rla_len; task_args->t.futex_rla_len = core->thread_core->futex_rla_len;
ret = prep_sched_info(&task_args->sp, core->thread_core); ret = prep_sched_info(&task_args->t.sp, core->thread_core);
if (ret) if (ret)
goto err; goto err;
} }
...@@ -1493,7 +1494,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v ...@@ -1493,7 +1494,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
if (ret < 0) if (ret < 0)
goto err; goto err;
mutex_init(&task_args->rst_lock); mutex_init(&task_args->t._rst_lock);
/* /*
* Now prepare run-time data for threads restore. * Now prepare run-time data for threads restore.
...@@ -1535,7 +1536,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v ...@@ -1535,7 +1536,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
goto err; goto err;
} }
thread_args[i].rst_lock = &task_args->rst_lock; thread_args[i].rst_lock = &task_args->t._rst_lock;
thread_args[i].gpregs = *core->thread_info->gpregs; thread_args[i].gpregs = *core->thread_info->gpregs;
thread_args[i].clear_tid_addr = core->thread_info->clear_tid_addr; thread_args[i].clear_tid_addr = core->thread_info->clear_tid_addr;
...@@ -1565,7 +1566,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v ...@@ -1565,7 +1566,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
"task_args->nr_threads: %d\n" "task_args->nr_threads: %d\n"
"task_args->clone_restore_fn: %p\n" "task_args->clone_restore_fn: %p\n"
"task_args->thread_args: %p\n", "task_args->thread_args: %p\n",
task_args, task_args->pid, task_args, task_args->t.pid,
task_args->nr_threads, task_args->nr_threads,
task_args->clone_restore_fn, task_args->clone_restore_fn,
task_args->thread_args); task_args->thread_args);
......
...@@ -67,7 +67,6 @@ struct thread_restore_args { ...@@ -67,7 +67,6 @@ struct thread_restore_args {
struct restore_mem_zone mem_zone; struct restore_mem_zone mem_zone;
int pid; int pid;
mutex_t *rst_lock;
UserX86RegsEntry gpregs; UserX86RegsEntry gpregs;
u64 clear_tid_addr; u64 clear_tid_addr;
...@@ -76,18 +75,21 @@ struct thread_restore_args { ...@@ -76,18 +75,21 @@ struct thread_restore_args {
u32 futex_rla_len; u32 futex_rla_len;
struct rst_sched_param sp; struct rst_sched_param sp;
union {
mutex_t _rst_lock;
mutex_t *rst_lock;
};
} __aligned(sizeof(long)); } __aligned(sizeof(long));
struct task_restore_core_args { struct task_restore_core_args {
struct restore_mem_zone mem_zone; struct thread_restore_args t; /* thread group leader */
int pid; /* task pid */
int fd_exe_link; /* opened self->exe file */ int fd_exe_link; /* opened self->exe file */
int fd_pages; /* opened pages dump file */ int fd_pages; /* opened pages dump file */
int logfd; int logfd;
unsigned int loglevel; unsigned int loglevel;
bool restore_threads; /* if to restore threads */ bool restore_threads; /* if to restore threads */
mutex_t rst_lock;
/* threads restoration */ /* threads restoration */
int nr_threads; /* number of threads */ int nr_threads; /* number of threads */
...@@ -109,20 +111,12 @@ struct task_restore_core_args { ...@@ -109,20 +111,12 @@ struct task_restore_core_args {
MmEntry mm; MmEntry mm;
u64 mm_saved_auxv[AT_VECTOR_SIZE]; u64 mm_saved_auxv[AT_VECTOR_SIZE];
u64 clear_tid_addr;
u64 blk_sigset; u64 blk_sigset;
char comm[TASK_COMM_LEN]; char comm[TASK_COMM_LEN];
TaskKobjIdsEntry ids; TaskKobjIdsEntry ids;
UserX86RegsEntry gpregs;
bool has_futex;
u64 futex_rla;
u32 futex_rla_len;
int *rst_tcp_socks; int *rst_tcp_socks;
int rst_tcp_socks_size; int rst_tcp_socks_size;
struct rst_sched_param sp;
} __aligned(sizeof(long)); } __aligned(sizeof(long));
struct pt_regs { struct pt_regs {
......
...@@ -445,7 +445,7 @@ long __export_restore_task(struct task_restore_core_args *args) ...@@ -445,7 +445,7 @@ long __export_restore_task(struct task_restore_core_args *args)
goto core_restore_end; goto core_restore_end;
} }
sys_set_tid_address((int *)args->clear_tid_addr); sys_set_tid_address((int *)args->t.clear_tid_addr);
/* /*
* Tune up the task fields. * Tune up the task fields.
...@@ -478,14 +478,14 @@ long __export_restore_task(struct task_restore_core_args *args) ...@@ -478,14 +478,14 @@ long __export_restore_task(struct task_restore_core_args *args)
if (ret) if (ret)
goto core_restore_end; goto core_restore_end;
if (args->has_futex) { if (args->t.has_futex) {
if (sys_set_robust_list((void *)args->futex_rla, args->futex_rla_len)) { if (sys_set_robust_list((void *)args->t.futex_rla, args->t.futex_rla_len)) {
pr_err("Robust list set fail %d\n", my_pid); pr_err("Robust list set fail %d\n", my_pid);
goto core_restore_end; goto core_restore_end;
} }
} }
restore_sched_info(&args->sp); restore_sched_info(&args->t.sp);
/* /*
* We need to prepare a valid sigframe here, so * We need to prepare a valid sigframe here, so
...@@ -493,10 +493,10 @@ long __export_restore_task(struct task_restore_core_args *args) ...@@ -493,10 +493,10 @@ long __export_restore_task(struct task_restore_core_args *args)
* registers from the frame, set them up and * registers from the frame, set them up and
* finally pass execution to the new IP. * finally pass execution to the new IP.
*/ */
rt_sigframe = (void *)args->mem_zone.rt_sigframe + 8; rt_sigframe = (void *)args->t.mem_zone.rt_sigframe + 8;
#define CPREG1(d) rt_sigframe->uc.uc_mcontext.d = args->gpregs.d #define CPREG1(d) rt_sigframe->uc.uc_mcontext.d = args->t.gpregs.d
#define CPREG2(d, s) rt_sigframe->uc.uc_mcontext.d = args->gpregs.s #define CPREG2(d, s) rt_sigframe->uc.uc_mcontext.d = args->t.gpregs.s
CPREG1(r8); CPREG1(r8);
CPREG1(r9); CPREG1(r9);
...@@ -520,14 +520,14 @@ long __export_restore_task(struct task_restore_core_args *args) ...@@ -520,14 +520,14 @@ long __export_restore_task(struct task_restore_core_args *args)
CPREG1(gs); CPREG1(gs);
CPREG1(fs); CPREG1(fs);
fsgs_base = args->gpregs.fs_base; fsgs_base = args->t.gpregs.fs_base;
ret = sys_arch_prctl(ARCH_SET_FS, fsgs_base); ret = sys_arch_prctl(ARCH_SET_FS, fsgs_base);
if (ret) { if (ret) {
pr_info("SET_FS fail %ld\n", ret); pr_info("SET_FS fail %ld\n", ret);
goto core_restore_end; goto core_restore_end;
} }
fsgs_base = args->gpregs.gs_base; fsgs_base = args->t.gpregs.gs_base;
ret = sys_arch_prctl(ARCH_SET_GS, fsgs_base); ret = sys_arch_prctl(ARCH_SET_GS, fsgs_base);
if (ret) { if (ret) {
pr_info("SET_GS fail %ld\n", ret); pr_info("SET_GS fail %ld\n", ret);
...@@ -581,10 +581,10 @@ long __export_restore_task(struct task_restore_core_args *args) ...@@ -581,10 +581,10 @@ long __export_restore_task(struct task_restore_core_args *args)
char last_pid_buf[16], *s; char last_pid_buf[16], *s;
/* skip self */ /* skip self */
if (thread_args[i].pid == args->pid) if (thread_args[i].pid == args->t.pid)
continue; continue;
mutex_lock(&args->rst_lock); mutex_lock(&args->t._rst_lock);
new_sp = new_sp =
RESTORE_ALIGN_STACK((long)thread_args[i].mem_zone.stack, RESTORE_ALIGN_STACK((long)thread_args[i].mem_zone.stack,
......
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