Commit 2ee5a42f authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

restore: Add restoration of the blocked threads signals from the image

To unify the code for both thread leader and regular threads
we move blocked signals for thread leader into threads argument
area and use restore_thread_common() helper.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 5da22b01
......@@ -1481,7 +1481,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
task_args->t.clear_tid_addr = core->thread_info->clear_tid_addr;
task_args->ids = *core->ids;
task_args->t.gpregs = *core->thread_info->gpregs;
task_args->blk_sigset = core->tc->blk_sigset;
task_args->t.blk_sigset = core->tc->blk_sigset;
task_args->t.has_blk_sigset = true;
if (core->thread_core) {
task_args->t.has_futex = true;
......@@ -1558,6 +1559,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
thread_args[i].has_futex = true;
thread_args[i].futex_rla = core->thread_core->futex_rla;
thread_args[i].futex_rla_len = core->thread_core->futex_rla_len;
thread_args[i].has_blk_sigset = core->thread_core->has_blk_sigset;
thread_args[i].blk_sigset = core->thread_core->blk_sigset;
ret = prep_sched_info(&thread_args[i].sp, core->thread_core);
if (ret)
......
......@@ -76,6 +76,9 @@ struct thread_restore_args {
u64 futex_rla;
u32 futex_rla_len;
bool has_blk_sigset;
u64 blk_sigset;
struct rst_sched_param sp;
struct task_restore_core_args *ta;
......@@ -112,7 +115,6 @@ struct task_restore_core_args {
MmEntry mm;
u64 mm_saved_auxv[AT_VECTOR_SIZE];
u32 mm_saved_auxv_size;
u64 blk_sigset;
char comm[TASK_COMM_LEN];
TaskKobjIdsEntry ids;
......
......@@ -199,6 +199,9 @@ static int restore_thread_common(struct rt_sigframe *sigframe,
}
}
if (args->has_blk_sigset)
sigframe->uc.uc_sigmask.sig[0] = args->blk_sigset;
restore_sched_info(&args->sp);
return restore_gpregs(sigframe, &args->gpregs);
......@@ -497,11 +500,6 @@ long __export_restore_task(struct task_restore_core_args *args)
if (restore_thread_common(rt_sigframe, &args->t))
goto core_restore_end;
/*
* Blocked signals.
*/
rt_sigframe->uc.uc_sigmask.sig[0] = args->blk_sigset;
/*
* Threads restoration. This requires some more comments. This
* restorer routine and thread restorer routine has the following
......
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