[CRIU] [PATCH v2 04/15] unix: Link all sockets in unix_sockets list

Kirill Tkhai ktkhai at virtuozzo.com
Mon May 30 05:21:02 PDT 2016



On 30.05.2016 14:38, Pavel Emelyanov wrote:
> On 05/27/2016 04:06 PM, Kirill Tkhai wrote:
>> List "unix_sockets" is used to link external sockets.
> 
> Dump-time. On restore time this list already contains all the sockets.
> 
>> Change this, to link all unix sockets there. To differ
>> really external sockets in fix_external_unix_sockets(),
>> we may check for socket's already_dumped value.
>>
>> This may be useful to traverse over all unix sockets
>> in a namespace.
> 
> Dump-time.
> Please, explain why do you need to traverse all unix sockets dump time.

We need to dump a sender inode for every DGRAM packet, and it's used on restore.
Received skb does not contain this information: it contains the sender's name
as string.

Dumping of (int) requires less space than dumping a string.

>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>> ---
>>  criu/sk-unix.c |   13 +++++--------
>>  1 file changed, 5 insertions(+), 8 deletions(-)
>>
>> diff --git a/criu/sk-unix.c b/criu/sk-unix.c
>> index 3363cea..40cb9db 100644
>> --- a/criu/sk-unix.c
>> +++ b/criu/sk-unix.c
>> @@ -364,11 +364,7 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
>>  		 * until all sockets the program owns are processed.
>>  		 */
>>  		if (!peer->sd.already_dumped) {
>> -			if (list_empty(&peer->list)) {
>> -				show_one_unix("Add a peer", peer);
>> -				list_add_tail(&peer->list, &unix_sockets);
>> -			}
>> -
>> +			show_one_unix("Add a peer", peer);
>>  			list_add(&sk->peer_node, &peer->peer_list);
>>  			sk->fd = dup(lfd);
>>  			if (sk->fd < 0) {
>> @@ -464,7 +460,6 @@ static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
>>  	if (list_empty(&sk->peer_node) && write_unix_entry(sk))
>>  		return -1;
>>  
>> -	list_del_init(&sk->list);
>>  	sk->sd.already_dumped = 1;
>>  
>>  	while (!list_empty(&sk->peer_list)) {
>> @@ -677,6 +672,7 @@ static int unix_collect_one(const struct unix_diag_msg *m,
>>  	}
>>  
>>  	sk_collect_one(m->udiag_ino, AF_UNIX, &d->sd);
>> +	list_add_tail(&d->list, &unix_sockets);
>>  	show_one_unix("Collected", d);
>>  
>>  	return 0;
>> @@ -757,9 +753,10 @@ int fix_external_unix_sockets(void)
>>  		FownEntry fown = FOWN_ENTRY__INIT;
>>  		SkOptsEntry skopts = SK_OPTS_ENTRY__INIT;
>>  
>> -		show_one_unix("Dumping extern", sk);
>> +		if (sk->sd.already_dumped)
>> +			continue;
>>  
>> -		BUG_ON(sk->sd.already_dumped);
>> +		show_one_unix("Dumping extern", sk);
>>  
>>  		fd_id_generate_special(NULL, &e.id);
>>  		e.ino		= sk->sd.ino;
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
>> .
>>
> 


More information about the CRIU mailing list