[CRIU] [PATCH] aio: Restore aio ring content

Kirill Tkhai ktkhai at virtuozzo.com
Thu Mar 10 06:39:34 PST 2016



On 10.03.2016 16:46, Pavel Emelyanov wrote:
> 
>> @@ -1038,8 +1039,10 @@ long __export_restore_task(struct task_restore_args *args)
>>  			goto core_restore_end;
>>  		}
>>  
>> -		if (ctx == raio->addr) /* Lucky bastards we are! */
>> -			continue;
>> +		count = raio->len/sizeof(unsigned long);
>> +		for (i = 0; i < count; i++)
>> +			((unsigned long *)ctx)[i] = ring[i];
>> +		sys_munmap(ring, raio->len);
> 
> Ring pages are connected to in-kernel structures, where's the guarantee, that
> unmap + mmap of new stuff keeps this linkage?

Ring pages contain header and array of statuses. The header is

struct aio_ring {
        unsigned        id;     /* kernel internal index number */
        unsigned        nr;     /* number of io_events */
        unsigned        head;   /* Written to by userland or under ring_lock
                                 * mutex by aio_read_events_ring(). */
        unsigned        tail;

        unsigned        magic;
        unsigned        compat_features;
        unsigned        incompat_features;
        unsigned        header_length;  /* size of aio_ring */


        struct io_event         io_events[0];
};

It does not contain any linkage information. All pointers are relative, id is
user address of ring buffer. nr and last 4 members is not used by kernel.
The array of statuses, which goes after the header in ring buffer, does not
contain linkage information too.

The patch just reinitializes the ring buffer. A task may do this in its usual life:
write anything to ring buffer, and kernel is OK with this. Kernel uses ->head only.

> Other than this, why can't we write directly into created by io_setup region?

We should restore ring buffer content from somewhere. Patch makes ring buffer memory
is saved like anonymous memory, and restores the same way. So we don't need restore
ring buffer from a file on the disk.

>>  
>>  		/*
>>  		 * If we failed to get the proper nr_req right and
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
>> .
>>
> 


More information about the CRIU mailing list