[CRIU] [PATCH v2 14/28] files: Kill fd_open_state::receive_fd stage

Kirill Tkhai ktkhai at virtuozzo.com
Mon Dec 5 04:12:45 PST 2016


On 05.12.2016 13:02, Pavel Emelyanov wrote:
> On 11/30/2016 07:31 PM, Kirill Tkhai wrote:
>> Since "receive" stage is used only for slave fds
>> and nobody depends on slave fds receiving is finished,
>> we may move it functionality in "post_open" stage.
>> This just makes slave fds to be received a little bit later.
> 
> This requires clarification.
> 
> Consider we have files A and B in current.
> 
> Before the patch the opening of them looked like
> 
> A->open
> B->open
> A->recv
> B->recv
> A->post_open
> B->post_open
> 
> now it is like
> 
> A->open
> B->open
> A->recv
> A->post_open
> B->recv
> B->post_open
> 
> Where did we remove the dependency between A->post_open and B->recv ?

"receive" is used for slave fles only, and masters do not depend
on any slave stages. I just analyzed all file types.
The only exception is ctl_tty, but it is on separate rst_info::tty_ctty list.

I'll add a comment to v3.
 
> -- Pavel
> 
>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>> ---
>>  criu/files.c |   22 +++++++++-------------
>>  1 file changed, 9 insertions(+), 13 deletions(-)
>>
>> diff --git a/criu/files.c b/criu/files.c
>> index 8a07da6..23ff3f9 100644
>> --- a/criu/files.c
>> +++ b/criu/files.c
>> @@ -865,7 +865,6 @@ static int post_open_fd(int pid, struct fdinfo_list_entry *fle);
>>  
>>  static struct fd_open_state states[] = {
>>  	{ "create",		open_fd,	},
>> -	{ "receive",		receive_fd,	},
>>  	{ "post_create",	post_open_fd,	},
>>  };
>>  
>> @@ -971,15 +970,17 @@ static int post_open_fd(int pid, struct fdinfo_list_entry *fle)
>>  {
>>  	struct file_desc *d = fle->desc;
>>  
>> -	if (!d->ops->post_open)
>> -		return 0;
>> -
>> -	if (is_service_fd(fle->fe->fd, CTL_TTY_OFF))
>> -		return d->ops->post_open(d, fle->fe->fd);
>> +	if (fle != file_master(d)) {
>> +		if (receive_fd(pid, fle) < 0) {
>> +			pr_err("Can't receive\n");
>> +			return -1;
>> +		}
>> +		if (!is_service_fd(fle->fe->fd, CTL_TTY_OFF))
>> +			return 0;
>> +	}
>>  
>> -	if (fle != file_master(d))
>> +	if (!d->ops->post_open)
>>  		return 0;
>> -
>>  	return d->ops->post_open(d, fle->fe->fd);
>>  }
>>  
>> @@ -1034,11 +1035,6 @@ static int open_fd(int pid, struct fdinfo_list_entry *fle)
>>  static int receive_fd(int pid, struct fdinfo_list_entry *fle)
>>  {
>>  	int fd;
>> -	struct fdinfo_list_entry *flem;
>> -
>> -	flem = file_master(fle->desc);
>> -	if (flem->pid == pid)
>> -		return 0;
>>  
>>  	pr_info("\tReceive fd for %d\n", fle->fe->fd);
>>  
>>
>> .
>>
> 


More information about the CRIU mailing list