[CRIU] [PATCH 12/12] page-xfer: Sanitize xfer core routine

Pavel Emelyanov xemul at virtuozzo.com
Thu Jun 29 12:51:04 MSK 2017


On 06/28/2017 07:28 PM, Mike Rapoport wrote:
> On Wed, Jun 28, 2017 at 04:48:45PM +0300, Pavel Emelyanov wrote:
>> Make it call .write_pagemap once and decide whether or not to
>> call .write_pages based on the flags caluculated in one place
>> as well.
>>
>> Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
>> ---
>>  criu/page-xfer.c | 23 ++++++++++++-----------
>>  1 file changed, 12 insertions(+), 11 deletions(-)
>>
>> diff --git a/criu/page-xfer.c b/criu/page-xfer.c
>> index 10da75f..256cac6 100644
>> --- a/criu/page-xfer.c
>> +++ b/criu/page-xfer.c
>> @@ -405,6 +405,14 @@ static int dump_holes(struct page_xfer *xfer, struct page_pipe *pp,
>>  	return 0;
>>  }
>>
>> +static inline u32 ppb_xfer_flags(struct page_xfer *xfer, struct page_pipe_buf *ppb)
>> +{
>> +	if (ppb->flags & PPB_LAZY)
>> +		return PE_LAZY | (xfer->transfer_lazy ? PE_PRESENT : 0);
> 
> Huh. Then maybe even
> 
> return ppb->flags & PPB_LAZY ? PE_LAZY | (xfer->transfer_lazy ? PE_PRESENT : 0) : PE_PRESENT;
> 
> ;-)

:D

> I understand that if's and braces are not Spartan enough, but can we at
> least switch the order:
> 
> 	return (xfer->transfer_lazy ? PE_PRESENT : 0) | PE_LAZY;
> 
> and add a comment, e.g.:
> 
> 	/*
> 	 * Pages that can be lazily restored are always marked as such. In
> 	 * the case we actually transfer them into image make them as
> 	 * present as well.
> 	 */

OK, will add.

>> +	else
>> +		return PE_PRESENT;
>> +}
>> +
>>  int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
>>  {
>>  	struct page_pipe_buf *ppb;
>> @@ -420,7 +428,7 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
>>
>>  		for (i = 0; i < ppb->nr_segs; i++) {
>>  			struct iovec iov = ppb->iov[i];
>> -			u32 flags = PE_PRESENT;
>> +			u32 flags;
>>
>>  			ret = dump_holes(xfer, pp, &cur_hole, iov.iov_base);
>>  			if (ret)
>> @@ -431,19 +439,12 @@ int page_xfer_dump_pages(struct page_xfer *xfer, struct page_pipe *pp)
>>  			pr_debug("\tp %p [%u]\n", iov.iov_base,
>>  					(unsigned int)(iov.iov_len / PAGE_SIZE));
>>
>> -			if (ppb->flags & PPB_LAZY) {
>> -				if (!xfer->transfer_lazy) {
>> -					if (xfer->write_pagemap(xfer, &iov, PE_LAZY))
>> -						return -1;
>> -					continue;
>> -				} else {
>> -					flags |= PE_LAZY;
>> -				}
>> -			}
>> +			flags = ppb_xfer_flags(xfer, ppb);
>>
>>  			if (xfer->write_pagemap(xfer, &iov, flags))
>>  				return -1;
>> -			if (xfer->write_pages(xfer, ppb->p[0], iov.iov_len))
>> +			if ((flags & PE_PRESENT) && xfer->write_pages(xfer,
>> +						ppb->p[0], iov.iov_len))
> 
> Huh again. A newline after && ?

Yup, I'll resend.

>>  				return -1;
>>  		}
>>  	}
>> -- 
>> 2.1.4
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
>>
> 
> .
> 



More information about the CRIU mailing list