[CRIU] [PATCH 4/6] dump: dump signals before infecting with parasite

Ruslan Kuprieiev kupruser at gmail.com
Tue Aug 5 08:42:39 PDT 2014


05.08.2014 18:08, Andrew Vagin пишет:
> On Tue, Aug 05, 2014 at 05:13:46PM +0300, Ruslan Kuprieiev wrote:
>> We need this In order to fit signals into core.img. core.img is being
>> written
>> in dump_core_task_all,which is called right in the middle of dump_one_task,
>> when parasite code is already injected. We can't dump signals while
>> under parasite, because parasite has its own signals.
> No, it has not.

What do you mean?

> Here is another problem.
> Signals can be dumped only for stopped tasks.
>
> Look at the folling code:
> if (SI_EVENT(si.si_code) != PTRACE_EVENT_STOP) {
> 	/*
> 	 * Kernel notifies us about the task being seized
> 	 * received some
> 	 * event other than the STOP, i.e. -- a signal. Let the
> 	 * task
> 	 * handle one and repeat.
> 	 */
>
> 	if (ptrace(PTRACE_CONT, pid, NULL,
> 				(void *)(unsigned long)si.si_signo)) {
> 		pr_perror("Can't continue signal handling, aborting");
> 		goto err;
> 	}
>
> 	goto try_again;
> }
>
> The comments says that we exepect siganls here.

Yes, but seize_task is called in collect_pstree, which is called far 
before dumping.
cr-dump.c : cr_dump_tasks()
     /*
      * The collect_pstree will also stop (PTRACE_SEIZE) the tasks
      * thus ensuring that they don't modify anything we collect
      * afterwards.
      */

     if (collect_pstree(pid))
         goto err;

  ...........................................................

     for_each_pstree_item(item) {
         if (dump_one_task(item))
             goto err;
     }

The comment says that the whole tree is stopped after collect_pstree, so 
it's safe to dump signals.

>> This patch doesn't change anything about dumping singnals, because
>> in both cases task is seized and doesn't have parasite injected.
>>
>> I've tested it by running sigpending from zdtm and it seems to work well.
> It doesn't test a race condition. Let's imagine that we have two tasks.
>
> 1. criu freezes the task 1
> 2. task 2 sends signal to the task 1
> 3. criu infects the task 1
>
> Could you create this test?

Well, race conditions are hard to test =).

>> 05.08.2014 16:56, Andrew Vagin пишет:
>>> Why do we need this?
>>>
>>> If a tack has a few pending signals, will it be safe?
>>>
>>> On Tue, Aug 05, 2014 at 10:35:59AM +0200, Ruslan Kuprieiev wrote:
>>>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>>>> ---
>>>>   cr-dump.c | 12 ++++++------
>>>>   1 file changed, 6 insertions(+), 6 deletions(-)
>>>>
>>>> diff --git a/cr-dump.c b/cr-dump.c
>>>> index d8ad0fc..c8be0bd 100644
>>>> --- a/cr-dump.c
>>>> +++ b/cr-dump.c
>>>> @@ -1498,6 +1498,12 @@ static int dump_one_task(struct pstree_item *item)
>>>>   		goto err;
>>>>   	}
>>>> +	ret = dump_task_signals(pid, item, cr_fdset);
>>>> +	if (ret) {
>>>> +		pr_err("Dump %d signals failed %d\n", pid, ret);
>>>> +		goto err;
>>>> +	}
>>>> +
>>>>   	ret = -1;
>>>>   	parasite_ctl = parasite_infect_seized(pid, item, &vmas, dfds, proc_args.timer_n);
>>>>   	if (!parasite_ctl) {
>>>> @@ -1632,12 +1638,6 @@ static int dump_one_task(struct pstree_item *item)
>>>>   		goto err;
>>>>   	}
>>>> -	ret = dump_task_signals(pid, item, cr_fdset);
>>>> -	if (ret) {
>>>> -		pr_err("Dump %d signals failed %d\n", pid, ret);
>>>> -		goto err;
>>>> -	}
>>>> -
>>>>   	close_cr_fdset(&cr_fdset);
>>>>   err:
>>>>   	close_pid_proc();
>>>> -- 
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> CRIU mailing list
>>>> CRIU at openvz.org
>>>> https://lists.openvz.org/mailman/listinfo/criu

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvz.org/pipermail/criu/attachments/20140805/d0d648be/attachment.html>


More information about the CRIU mailing list