mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-23 02:14:37 +00:00
s390: Fix off-by-one error for task size detection
The entries in /proc/<pid>/maps look like the following: 3fffffdf000-40000000000 rw-p 00000000 00:00 0 The upper address is the first address that is *not* included in the address range. Our function max_mapped_addr() should return the last valid address for a process, but currently returns the first invalid address. This can lead to the following error message on kernel that have kernel commit ee71d16d22bb: Error (criu/proc_parse.c:694): Can't dump high memory region 1ffffffffff000-20000000000000 of task 24 because kernel commit ee71d16d22bb is missing Fix this and make max_mapped_addr() the last valid address (first invalid address - 1). Reported-by: Adrian Reber <areber@redhat.com> Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
parent
61e6c01d09
commit
a5e2605e7a
1 changed files with 2 additions and 2 deletions
|
|
@ -393,7 +393,7 @@ static unsigned long max_mapped_addr(void)
|
|||
}
|
||||
fclose(fp);
|
||||
out:
|
||||
return addr_max;
|
||||
return addr_max - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -454,7 +454,7 @@ static enum kernel_ts_level get_kernel_ts_level(void)
|
|||
unsigned long criu_end_addr = max_mapped_addr();
|
||||
|
||||
/* Check for 5 levels */
|
||||
if (criu_end_addr > TASK_SIZE_LEVEL_4)
|
||||
if (criu_end_addr >= TASK_SIZE_LEVEL_4)
|
||||
return KERNEL_TS_LEVEL_5;
|
||||
else if (munmap((void *) TASK_SIZE_LEVEL_4, 0x1000) == 0)
|
||||
return KERNEL_TS_LEVEL_5;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue