[CRIU] [PATCH v5 22/33] eventpoll: Make post_open stage may fail

Kirill Tkhai ktkhai at virtuozzo.com
Wed Jan 18 02:54:00 PST 2017


On 18.01.2017 13:57, Pavel Emelyanov wrote:
> On 01/18/2017 01:16 PM, Kirill Tkhai wrote:
>>
>>
>> On 18.01.2017 13:11, Pavel Emelyanov wrote:
>>> On 12/26/2016 05:28 PM, Kirill Tkhai wrote:
>>>> Currently, it's just an additional check. But later this will be used.
>>>>
>>>> v5: Use "1" for return
>>>
>>> Why 1?
>>
>> 1 means "the fle is not ready for restore". Where should I add a comment
>> about that?
> 
> In patch comment :) And in the code near the callback that allows this
> behavior explaining which code means what.

OK

>> Starting from this set there's still a mix between explicit numbers
>>> (in code) and ORV_something (in comments).
>>
>> Ah, sure, there is ORV in comment to patch "files: Kill struct file_desc_ops::post_open",
>> which should sounds as
>>
>> "    files: Kill struct file_desc_ops::post_open
>>     
>>     This make open fds asynchronous. Now we restore them in a poll-style.
>>     Every ->open callback operates like a poll. It returns 1, i.e.
>>     "call me again", if some events have not received yet, OR 0,
>>     if restoring of a fle has finished.
>>     
>>     We iterate over list of file descriptors and look at its return value.
>>     If there were not progress in restoring of a fle, we sleep on task_st
>>     futex. As all events are sent together with changing task_st, we will
>>     be woken up, when there is a some new work for us.	"
>>
>> Should I resend it or series?
> 
> Would you pick up the rest of the patches, check/add/fix comments and
> re-send what's not yet merged?

OK

>>>> v2: Use generic FLE_OPEN and FLE_RESTORED to determ if a fle is ready
>>>>
>>>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>>>> ---
>>>>  criu/eventpoll.c |   27 +++++++++++++++++++++++++++
>>>>  1 file changed, 27 insertions(+)
>>>>
>>>> diff --git a/criu/eventpoll.c b/criu/eventpoll.c
>>>> index 88076db8a..42a656f31 100644
>>>> --- a/criu/eventpoll.c
>>>> +++ b/criu/eventpoll.c
>>>> @@ -21,6 +21,7 @@
>>>>  #include "image.h"
>>>>  #include "util.h"
>>>>  #include "log.h"
>>>> +#include "pstree.h"
>>>>  
>>>>  #include "protobuf.h"
>>>>  #include "images/eventpoll.pb-c.h"
>>>> @@ -140,6 +141,24 @@ static int eventpoll_open(struct file_desc *d)
>>>>  	close(tmp);
>>>>  	return -1;
>>>>  }
>>>> +
>>>> +static int epoll_not_ready_tfd(EventpollTfdEntry *tdefe)
>>>> +{
>>>> +	struct fdinfo_list_entry *fle;
>>>> +
>>>> +	list_for_each_entry(fle, &rsti(current)->used, used_list) {
>>>> +		if (tdefe->tfd != fle->fe->fd)
>>>> +			continue;
>>>> +
>>>> +		if (fle->desc->ops->type == FD_TYPES__EVENTPOLL)
>>>> +			return (fle->stage != FLE_OPEN);
>>>> +		else
>>>> +			return (fle->stage != FLE_RESTORED);
>>>> +	}
>>>> +	BUG();
>>>> +	return 0;
>>>> +}
>>>> +
>>>>  static int eventpoll_retore_tfd(int fd, int id, EventpollTfdEntry *tdefe)
>>>>  {
>>>>  	struct epoll_event event;
>>>> @@ -165,11 +184,19 @@ static int eventpoll_post_open(struct file_desc *d, int fd)
>>>>  	info = container_of(d, struct eventpoll_file_info, d);
>>>>  
>>>>  	for (i = 0; i < info->efe->n_tfd; i++) {
>>>> +		if (epoll_not_ready_tfd(info->efe->tfd[i]))
>>>> +			return 1;
>>>> +	}
>>>> +	for (i = 0; i < info->efe->n_tfd; i++) {
>>>>  		if (eventpoll_retore_tfd(fd, info->efe->id, info->efe->tfd[i]))
>>>>  			return -1;
>>>>  	}
>>>>  
>>>>  	list_for_each_entry(td_info, &eventpoll_tfds, list) {
>>>> +		if (epoll_not_ready_tfd(td_info->tdefe))
>>>> +			return 1;
>>>> +	}
>>>> +	list_for_each_entry(td_info, &eventpoll_tfds, list) {
>>>>  		if (td_info->tdefe->id != info->efe->id)
>>>>  			continue;
>>>>  
>>>>
>>>> .
>>>>
>>>
>> .
>>
> 


More information about the CRIU mailing list