[CRIU] Re: [PATCH] restorer: close log file before detaching from crtools

Kinsbursky Stanislav skinsbursky at openvz.org
Mon Feb 20 10:12:14 EST 2012


20.02.2012 18:36, Andrew Vagin пишет:
> On Mon, Feb 20, 2012 at 05:12:13PM +0300, Kinsbursky Stanislav wrote:
>> There is a race between log close by process being restoring and opened file
>> desctriptors check in zdtm test suite - crtools can exit and compare file
>> descriptors before detached restored process will perform all the rest tasks
>> (including close of the log) and execute final system call:
>>
>> --- dump/sleeping00/8578/dump.fd        2012-02-20 14:31:31.246096000 +0300
>> +++ dump/sleeping00/8578/restore.fd     2012-02-20 14:31:31.418095999 +0300
>> @@ -1,4 +1,5 @@
>>
>>   0 ->  /dev/null
>>   1 ->  /dev/null
>> +1023 ->  /root/crtools/test/dump/sleeping00/8578/restore.log
>>   2 ->  /dev/null
>>
>> The solution is to close log in restorer before final command received. But
>> this leads to another problem: we have to inform somehow about possible errors
>> afterwards This is done by forced segmentation fault and looks like this
>> (dmesg):
>>
>> pipe00[17373]: segfault at 2ed ip 00000000000002ed sp ffffffffffffffff error
>> 14
>>
>> Where "ip" is restorer's line number and "sp" is the reason why we failed.
>>
>> Signed-off-by: Stanislav Kinsbursky<skinsbursky at openvz.org>
>>
>> ---
>>   restorer.c |   21 +++++++++++++++------
>>   1 files changed, 15 insertions(+), 6 deletions(-)
>>
>> diff --git a/restorer.c b/restorer.c
>> index ea4af04..d25a571 100644
>> --- a/restorer.c
>> +++ b/restorer.c
>> @@ -336,7 +336,7 @@ static u64 restore_mapping(const struct vma_entry *vma_entry)
>>    */
>>   long restore_task(struct task_restore_core_args *args)
>>   {
>> -	long ret = -1;
>> +	long ret = -1, line;
>>   	struct task_entry *task_entry;
>>   	struct core_entry *core_entry;
>>   	struct vma_entry *vma_entry;
>> @@ -722,6 +722,9 @@ long restore_task(struct task_restore_core_args *args)
>>   	sys_sigaction(SIGCHLD,&args->sigchld_act, NULL);
>>
>>   	cr_wait_dec(&args->task_entries->nr_in_progress);
>> +
>> +	sys_close(args->logfd);
>> +
>>   	cr_wait_while(&args->task_entries->start, CR_STATE_RESTORE_SIGCHLD);
>>
>>   	/*
>> @@ -742,13 +745,10 @@ long restore_task(struct task_restore_core_args *args)
>>
>>   	ret = sys_munmap(args->task_entries, TASK_ENTRIES_SIZE);
>>   	if (ret<  0) {
>> -		write_num_n(__LINE__);
>> -		write_num_n(ret);
>> -		goto core_restore_end;
>> +		line = __LINE__;
>> +		goto core_restore_failed;
>>   	}
>>
>> -	sys_close(args->logfd);
>> -
>>   	/*
>>   	 * Sigframe stack.
>>   	 */
>> @@ -773,4 +773,13 @@ core_restore_end:
>>   	write_num_n(sys_getpid());
>>   	sys_exit(-1);
>>   	return -1;
>> +
>> +core_restore_failed:
>> +	asm volatile(
>> +		"movq %0, %%rsp				\n"
>> +		"jmp *%1				\n"
>> +		:
>> +		: "r"(ret), "r"(line)
>> +		: );
>> +	return ret;
> We have a similar code in BUG_ON_HANDLER, but this code is better, so
> I think you can improve BUG_ON_HANDLER and use it.

Thanks for your valuable opinion. I'll keep that in mind.

-- 
Best regards,
Stanislav Kinsbursky




More information about the CRIU mailing list