[CRIU] [PATCH] compel: compel_emergency_sigframe() helper introduced

Stanislav Kinsburskiy skinsbursky at virtuozzo.com
Mon Mar 27 06:26:30 PDT 2017



27.03.2017 15:15, Dmitry Safonov пишет:
> 2017-03-27 15:57 GMT+03:00 Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>:
>>
>> 24.03.2017 11:14, Dmitry Safonov пишет:
>>
>>> 2017-03-24 12:32 GMT+03:00 Stanislav Kinsburskiy
>>> <skinsbursky at virtuozzo.com>:
>>>>
>>>> 24.03.2017 00:13, Andrei Vagin пишет:
>>>>
>>>>> On Fri, Mar 17, 2017 at 01:17:58PM +0300, Stanislav Kinsburskiy wrote:
>>>>>> This helper constructs sigframe, which can be used to resume process
>>>>>> from
>>>>>> the
>>>>>> point where it was stopped.
>>>>>> Result has to be copied to the process manually and then used with
>>>>>> rt_sigreturn.
>>>>>>
>>>>>> Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
>>> [...]
>>>>>> --- a/compel/src/lib/infect.c
>>>>>> +++ b/compel/src/lib/infect.c
>>>>>> @@ -1162,6 +1162,20 @@ static int make_sigframe_plain(void *from,
>>>>>> struct
>>>>>> rt_sigframe *f, struct rt_sigf
>>>>>>           return 0;
>>>>>>     }
>>>>>>     +int compel_emergency_sigframe(struct parasite_ctl *ctl, struct
>>>>>> rt_sigframe *f,
>>>>>> +                             struct rt_sigframe *rtf)
>>>>>> +{
>>>>>> +       pid_t pid = ctl->rpid;
>>>>>> +       struct thread_ctx *thread = &ctl->orig;
>>>>>> +       struct plain_regs_struct regs;
>>>>>> +
>>>>>> +       if (get_task_regs(pid, &thread->regs, save_regs_plain, &regs))
>>>>>> {
>>>>>> +               pr_err("Can't obtain regs for thread %d\n", pid);
>>>>>> +               return -1;
>>>>>> +       }
>>>>>> +       return make_sigframe_plain(&regs, f, rtf, &thread->sigmask);
>>>>> make_sigframe_plain is called from parasite_start_daemon(), why it
>>>>> doesn't work for you. Could you describe your usecase for these changes?
>>>>>
>>>> Because I don't have parasite plugin, on which parasite_start_daemon
>>>> relies.
>>>> But it makes sense to use this new helper in parasite_start_daemon to
>>>> make
>>>> sure it's tested.
>>> Maybe it worth not providing additional interfaces, but splitting the
>>> existing.
>>> If we can make non-parasite version of compel_infect() and reuse its code
>>> in parasite's one, so it'll suit criu's needs and needs of projects
>>> without parasite.
>>> Does it make sense?
>>
>> Definitely.
>>
>>> Also, this looks incomplete without curing part. How do you use
>>> prepared sigframe
>>> afterward? Calling rt_sigreturn() with the help of compel_syscall() or
>>> somehow alike?
>>
>> Yes. Somehow alike.
>>
>>> I guess, there should be also a patch to complement API.
>>> And (by @avagin's rules) - adding new API/features means adding tests for
>>> it,
>>> looks like it wouldn't take much time to write a test for this.
>>
>> If this peace of code will be used by CRIU itself, then it looks like
>> sufficient testing. No?
>>
> Ok for me, but the test also plays as an example how-to-use such API.
> I don't insist, anyway.
>

Calling sigreturn makes sense when called from within of the process 
context.
BTW, it's done already if libcompel plugins in case of fatal error on 
CRIU side.
Thus, calling this from plugin explicitly doesn't make mush sense.
And I don't see other ways to show it's usability, supported by libcompel.



More information about the CRIU mailing list