[CRIU] [PATCH 6/6] restore: restore signals from core->tc->signals, othrewise -- from signal_p/s*.img
Ruslan Kuprieiev
kupruser at gmail.com
Wed Aug 6 01:19:38 PDT 2014
Oops, looks like I should have switched 5th and 6th.
Will fix in the new set of patches.
Thanks=).
06.08.2014 10:07, Pavel Emelyanov пишет:
> On 08/05/2014 12:36 PM, Ruslan Kuprieiev wrote:
>
> This is not bisect-safe. Once I apply the 5th patch, but not the 6th criu
> would stop working.
>
>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>> ---
>> cr-restore.c | 79 ++++++++++++++++++++++++++++++++++++++++++++----------------
>> 1 file changed, 58 insertions(+), 21 deletions(-)
>>
>> diff --git a/cr-restore.c b/cr-restore.c
>> index c2515bf..b47e4c0 100644
>> --- a/cr-restore.c
>> +++ b/cr-restore.c
>> @@ -89,7 +89,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core);
>> static int prepare_restorer_blob(void);
>> static int prepare_rlimits(int pid, CoreEntry *core);
>> static int prepare_posix_timers(int pid, CoreEntry *core);
>> -static int prepare_signals(int pid);
>> +static int prepare_signals(int pid, SignalsEntry *signals);
>>
>> static int shmem_remap(void *old_addr, void *new_addr, unsigned long size)
>> {
>> @@ -721,7 +721,7 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
>> if (open_vmas(pid))
>> return -1;
>>
>> - if (prepare_signals(pid))
>> + if (prepare_signals(pid, core->tc->signals))
>> return -1;
>>
>> if (prepare_posix_timers(pid, core))
>> @@ -2264,22 +2264,44 @@ static int prepare_rlimits(int pid, CoreEntry *core)
>> return 0;
>> }
>>
>> -static int open_signal_image(int type, pid_t pid, unsigned int *nr)
>> +static int signals_to_mem(SignalQueueEntry *sqe)
>> +{
>> + int i;
>> + siginfo_t *info, *t;
>> +
>> + for (i = 0; i < sqe->n_signals; i++) {
>> + info = (siginfo_t *) sqe->signals[i]->siginfo.data;
>> + t = rst_mem_alloc(sizeof(siginfo_t), RM_PRIVATE);
>> + if (!t)
>> + return -1;
>> +
>> + memcpy(t, info, sizeof(*info));
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static SignalQueueEntry *open_signal_image(int type, pid_t pid)
>> {
>> int fd, ret;
>> + SignalQueueEntry *sqe = NULL;
>> +
>> + sqe = xmalloc(sizeof(*sqe));
>> + if (!sqe)
>> + return NULL;
>> +
>> + signal_queue_entry__init(sqe);
>>
>> fd = open_image(type, O_RSTR | O_OPT, pid);
>> if (fd < 0) {
>> if (fd == -ENOENT) /* backward compatibility */
>> - return 0;
>> + return sqe;
>> else
>> - return -1;
>> + return NULL;
>> }
>>
>> - *nr = 0;
>> while (1) {
>> SiginfoEntry *sie;
>> - siginfo_t *info, *t;
>>
>> ret = pb_read_one_eof(fd, &sie, PB_SIGINFO);
>> if (ret <= 0)
>> @@ -2289,43 +2311,58 @@ static int open_signal_image(int type, pid_t pid, unsigned int *nr)
>> ret = -1;
>> break;
>> }
>> - info = (siginfo_t *) sie->siginfo.data;
>> - t = rst_mem_alloc(sizeof(siginfo_t), RM_PRIVATE);
>> - if (!t) {
>> +
>> + sqe->n_signals++;
>> + sqe->signals = xrealloc(sqe->signals, sizeof(*sqe->signals) * sqe->n_signals);
>> + if (!sqe->signals) {
>> ret = -1;
>> break;
>> }
>>
>> - memcpy(t, info, sizeof(*info));
>> - (*nr)++;
>> -
>> - siginfo_entry__free_unpacked(sie, NULL);
>> + sqe->signals[sqe->n_signals - 1] = sie;
>> }
>>
>> close(fd);
>> -
>> - return ret ? : 0;
>> + return ret ? NULL : sqe;
>> }
>>
>> static unsigned long siginfo_cpos;
>> static unsigned int siginfo_nr, *siginfo_priv_nr;
>>
>> -static int prepare_signals(int pid)
>> +static int prepare_signals(int pid, SignalsEntry *signals)
>> {
>> int ret = -1, i;
>> + SignalQueueEntry *queue = NULL;
>>
>> siginfo_cpos = rst_mem_cpos(RM_PRIVATE);
>> siginfo_priv_nr = xmalloc(sizeof(int) * current->nr_threads);
>> if (siginfo_priv_nr == NULL)
>> goto out;
>>
>> - ret = open_signal_image(CR_FD_SIGNAL, pid, &siginfo_nr);
>> - if (ret < 0)
>> + if (!signals) { /* backward compatibility */
>> + queue = open_signal_image(CR_FD_SIGNAL, pid);
>> + if (!queue)
>> + goto out;
>> + } else
>> + queue = signals->shared;
>> +
>> + siginfo_nr = queue->n_signals;
>> + ret = signals_to_mem(queue);
>> + if (ret)
>> goto out;
>>
>> for (i = 0; i < current->nr_threads; i++) {
>> - ret = open_signal_image(CR_FD_PSIGNAL,
>> - current->threads[i].virt, &siginfo_priv_nr[i]);
>> + if (!signals) { /* backward compatibility */
>> + queue = open_signal_image(CR_FD_PSIGNAL, current->threads[i].virt);
>> + if (!queue)
>> + goto out;
>> + } else {
>> + queue = signals->private_[i];
>> + BUG_ON(signals->n_private_ != current->nr_threads);
>> + }
>> +
>> + siginfo_priv_nr[i] = queue->n_signals;
>> + ret = signals_to_mem(queue);
>> if (ret < 0)
>> goto out;
>> }
>>
More information about the CRIU
mailing list