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
/*
* 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
......@@ -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);
task_args->pid = pid;
task_args->t.pid = pid;
task_args->logfd = log_get_fd();
task_args->loglevel = log_get_loglevel();
task_args->sigchld_act = sigchld_act;
......@@ -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));
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->gpregs = *core->thread_info->gpregs;
task_args->t.gpregs = *core->thread_info->gpregs;
task_args->blk_sigset = core->tc->blk_sigset;
if (core->thread_core) {
task_args->has_futex = true;
task_args->futex_rla = core->thread_core->futex_rla;
task_args->futex_rla_len = core->thread_core->futex_rla_len;
task_args->t.has_futex = true;
task_args->t.futex_rla = core->thread_core->futex_rla;
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)
goto err;
}
......@@ -1493,7 +1494,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
if (ret < 0)
goto err;
mutex_init(&task_args->rst_lock);
mutex_init(&task_args->t._rst_lock);
/*
* 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
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].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
"task_args->nr_threads: %d\n"
"task_args->clone_restore_fn: %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->clone_restore_fn,
task_args->thread_args);
......
......@@ -67,7 +67,6 @@ struct thread_restore_args {
struct restore_mem_zone mem_zone;
int pid;
mutex_t *rst_lock;
UserX86RegsEntry gpregs;
u64 clear_tid_addr;
......@@ -76,18 +75,21 @@ struct thread_restore_args {
u32 futex_rla_len;
struct rst_sched_param sp;
union {
mutex_t _rst_lock;
mutex_t *rst_lock;
};
} __aligned(sizeof(long));
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_pages; /* opened pages dump file */
int logfd;
unsigned int loglevel;
bool restore_threads; /* if to restore threads */
mutex_t rst_lock;
/* threads restoration */
int nr_threads; /* number of threads */
......@@ -109,20 +111,12 @@ struct task_restore_core_args {
MmEntry mm;
u64 mm_saved_auxv[AT_VECTOR_SIZE];
u64 clear_tid_addr;
u64 blk_sigset;
char comm[TASK_COMM_LEN];
TaskKobjIdsEntry ids;
UserX86RegsEntry gpregs;
bool has_futex;
u64 futex_rla;
u32 futex_rla_len;
int *rst_tcp_socks;
int rst_tcp_socks_size;
struct rst_sched_param sp;
} __aligned(sizeof(long));
struct pt_regs {
......
......@@ -445,7 +445,7 @@ long __export_restore_task(struct task_restore_core_args *args)
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.
......@@ -478,14 +478,14 @@ long __export_restore_task(struct task_restore_core_args *args)
if (ret)
goto core_restore_end;
if (args->has_futex) {
if (sys_set_robust_list((void *)args->futex_rla, args->futex_rla_len)) {
if (args->t.has_futex) {
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);
goto core_restore_end;
}
}
restore_sched_info(&args->sp);
restore_sched_info(&args->t.sp);
/*
* We need to prepare a valid sigframe here, so
......@@ -493,10 +493,10 @@ long __export_restore_task(struct task_restore_core_args *args)
* registers from the frame, set them up and
* 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 CPREG2(d, s) rt_sigframe->uc.uc_mcontext.d = args->gpregs.s
#define CPREG1(d) rt_sigframe->uc.uc_mcontext.d = args->t.gpregs.d
#define CPREG2(d, s) rt_sigframe->uc.uc_mcontext.d = args->t.gpregs.s
CPREG1(r8);
CPREG1(r9);
......@@ -520,14 +520,14 @@ long __export_restore_task(struct task_restore_core_args *args)
CPREG1(gs);
CPREG1(fs);
fsgs_base = args->gpregs.fs_base;
fsgs_base = args->t.gpregs.fs_base;
ret = sys_arch_prctl(ARCH_SET_FS, fsgs_base);
if (ret) {
pr_info("SET_FS fail %ld\n", ret);
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);
if (ret) {
pr_info("SET_GS fail %ld\n", ret);
......@@ -581,10 +581,10 @@ long __export_restore_task(struct task_restore_core_args *args)
char last_pid_buf[16], *s;
/* skip self */
if (thread_args[i].pid == args->pid)
if (thread_args[i].pid == args->t.pid)
continue;
mutex_lock(&args->rst_lock);
mutex_lock(&args->t._rst_lock);
new_sp =
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