[CRIU] [PATCH 08/12] crtools: restore pending signals
Pavel Emelyanov
xemul at parallels.com
Tue Dec 18 14:02:14 EST 2012
> @@ -1596,6 +1645,9 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
>
> struct task_restore_core_args *task_args;
> struct thread_restore_args *thread_args;
> + siginfo_t *siginfo_chunk;
> + int siginfo_nr = 0;
> + unsigned long siginfo_size = PAGE_SIZE;
A question. Why do we restore pending signals in restorer, not in generic code?
> LIST_HEAD(self_vma_list);
> int i;
> @@ -1644,12 +1696,55 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
> task_args = mem;
> thread_args = mem + restore_task_vma_len;
>
> + siginfo_chunk = mmap(NULL, siginfo_size, PROT_READ | PROT_WRITE,
> + MAP_PRIVATE | MAP_ANON, 0, 0);
> + if (mem == MAP_FAILED) {
> + pr_err("Can't allocate memory for siginfo-s\n");
> + goto err;
> + }
This first mmap looks ugly. Re-mplement remapping in open_signal_image to
hide one.
> +
> + ret = open_signal_image(CR_FD_SIGNAL, pid, &siginfo_chunk,
> + &siginfo_size, &siginfo_nr);
> + if (ret < 0) {
> + if (errno != ENOENT) /* backward compatiblity */
> + goto err;
> + ret = 0;
> + }
> + task_args->siginfo_nr = ret;
> +
> + ret = open_signal_image(CR_FD_PSIGNAL, pid, &siginfo_chunk,
> + &siginfo_size, &siginfo_nr);
> + if (ret < 0) {
> + if (errno != ENOENT) /* backward compatiblity */
> + goto err;
> + ret = 0;
> + }
> + task_args->t.siginfo_nr = ret;
> +
> + for (i = 0; i < current->nr_threads; i++) {
We have already a loop that initialized thread restore data. This siginfos
read-in should be there.
> + thread_args[i].pid = current->threads[i].virt;
> + /* skip self */
> + if (thread_args[i].pid == pid)
> + continue;
> +
> + ret = open_signal_image(CR_FD_PSIGNAL,
> + thread_args[i].pid, &siginfo_chunk,
> + &siginfo_size, &siginfo_nr);
> + if (ret < 0) {
> + if (errno != ENOENT) /* backward compatiblity */
> + goto err;
> + ret = 0;
> + }
> + thread_args[i].siginfo_nr = ret;
> + }
> +
> restore_bootstrap_len = restorer_len +
> restore_task_vma_len +
> restore_thread_vma_len +
> SHMEMS_SIZE + TASK_ENTRIES_SIZE +
> self_vmas_len + vmas_len +
> - rst_tcp_socks_size;
> + rst_tcp_socks_size +
> + siginfo_size;
>
> /*
> * Restorer is a blob (code + args) that will get mapped in some
> diff --git a/include/restorer.h b/include/restorer.h
> index 2309a3d..f7a762d 100644
> --- a/include/restorer.h
> +++ b/include/restorer.h
> @@ -79,6 +79,9 @@ struct thread_restore_args {
> struct rst_sched_param sp;
>
> struct task_restore_core_args *ta;
> +
> + siginfo_t *siginfo;
> + unsigned int siginfo_nr;
> } __aligned(sizeof(long));
>
> struct task_restore_core_args {
> @@ -98,6 +101,9 @@ struct task_restore_core_args {
> struct task_entries *task_entries;
> VmaEntry *self_vmas;
> VmaEntry *tgt_vmas;
> + siginfo_t *siginfo;
> + unsigned int siginfo_nr;
> + unsigned long siginfo_size;
What for? Master thread's siginfos are in respective thread-info.
> unsigned int nr_vmas;
> unsigned long premmapped_addr;
> unsigned long premmapped_len;
More information about the CRIU
mailing list