Commit a5e2605e authored by Michael Holzheu's avatar Michael Holzheu Committed by Pavel Emelyanov

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: 's avatarAdrian Reber <areber@redhat.com>
Signed-off-by: 's avatarMichael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 61e6c01d
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment