[CRIU] [PATCH 2/4] service: page-server: return port back to user

Ruslan Kuprieiev kupruser at gmail.com
Wed Sep 17 08:03:40 PDT 2014


On 17.09.2014 17:59, Pavel Emelyanov wrote:
> On 09/17/2014 06:53 PM, Ruslan Kuprieiev wrote:
>> On 17.09.2014 17:44, Pavel Emelyanov wrote:
>>> On 09/17/2014 11:25 AM, Ruslan Kuprieiev wrote:
>>>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>>>> ---
>>>>    cr-service.c | 44 ++++++++++++++++++++++++++++----------------
>>>>    1 file changed, 28 insertions(+), 16 deletions(-)
>>>>
>>>> diff --git a/cr-service.c b/cr-service.c
>>>> index d144f47..2af6e8f 100644
>>>> --- a/cr-service.c
>>>> +++ b/cr-service.c
>>>> @@ -505,7 +505,7 @@ static int pre_dump_loop(int sk, CriuReq *msg)
>>>>    
>>>>    static int start_page_server_req(int sk, CriuOpts *req)
>>>>    {
>>>> -	int ret, pid, start_pipe[2];
>>>> +	int ret = -1, pid, start_pipe[2];
>>>>    	ssize_t count;
>>>>    	bool success = false;
>>>>    	CriuResp resp = CRIU_RESP__INIT;
>>>> @@ -532,28 +532,40 @@ static int start_page_server_req(int sk, CriuOpts *req)
>>>>    
>>>>    		pr_debug("Starting page server\n");
>>>>    
>>>> -		ret = cr_page_server(true, start_pipe[1]);
>>>> +		pid = cr_page_server(true, start_pipe[1]);
>>>> +		if (pid <= 0)
>>>> +			goto out_ch;
>>>> +
>>>> +		count = write(start_pipe[1], &opts.ps_port, sizeof(opts.ps_port));
>>>> +		if (count != sizeof(opts.ps_port))
>>>> +			goto out_ch;
>>>> +
>>>> +		ret = pid;
>>>>    out_ch:
>>>> -		count = write(start_pipe[1], &ret, sizeof(ret));
>>>> +		if (ret < 0 && pid > 0)
>>>> +			kill(pid, SIGKILL);
>>>>    		close(start_pipe[1]);
>>>> -		if (count != sizeof(ret))
>>>> -			exit(1);
>>>> -		exit(0);
>>>> +		exit(ret);
>>>>    	}
>>>>    
>>>>    	close(start_pipe[1]);
>>>> -	wait(NULL);
>>>> -	ret = -1;
>>>> -	count = read(start_pipe[0], &ret, sizeof(ret));
>>>> -	if (count != sizeof(ret))
>>>> -		success = false;
>>>> -	else if (ret > 0) {
>>>> -		success = true;
>>>> -		ps.has_pid = true;
>>>> -		ps.pid = ret;
>>>> -		resp.ps = &ps;
>>>> +	wait(&ret);
>>>> +	if (ret <= 0)
>>>> +		goto out;
>>>> +
>>>> +	count = read(start_pipe[0], &opts.ps_port, sizeof(opts.ps_port));
>>>> +	if (count != sizeof(opts.ps_port)) {
>>>> +		kill(ret, SIGKILL);
>>>> +		goto out;
>>>>    	}
>>>>    
>>>> +	success = true;
>>>> +	ps.has_pid = true;
>>>> +	ps.pid = ret;
>>> The ret here would be ... what? Last time it was passed
>>> as pointer to wait() call, but its argument is a) not pointer
>>> to store pid and b) this task's child is not page server task.
>> Last time exit value of child wasn't used at all:
>>
>> -	wait(NULL);
>>
>> And ps pid was transfered through pipe.
> Sure, because it's a working way for a task to know the pid of
> his _grand_ child.

Oh!

>> And yes, sorry, i've used a bad way to transfer ps pid.
>> Will fix.
> When fixing this, don't use two subsequent writes of two int-s.
> Introduce a struct, pack pid and port there and push it into
> pipe with one call.

Ok.

> And, btw, write a test, that would catch the absence of proper
> page server pid. The existing one doesn't do it.

Ok.

Thanks!

>>>> +	ps.has_port = true;
>>>> +	ps.port = opts.ps_port;
>>>> +	resp.ps = &ps;
>>>> +
>>>>    	pr_debug("Page server started\n");
>>>>    out:
>>>>    	resp.type = CRIU_REQ_TYPE__PAGE_SERVER;
>>>>
>> .
>>



More information about the CRIU mailing list