[CRIU] [PATCH v2] compel/ppc64le: make task size detection more robust

Mike Rapoport rppt at linux.vnet.ibm.com
Sun Sep 3 10:27:52 MSK 2017


The recent changes to user address space limits in the Linux kernel break
the assumption that TASK_SIZE is 128TB. For now, the maximal task size on
ppc64le is 512TB and we need to detect it in runtime for compatibility with
older kernels.

Signed-off-by: Mike Rapoport <rppt at linux.vnet.ibm.com>
---
v2: fix off-by-one

 compel/arch/ppc64/src/lib/infect.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/compel/arch/ppc64/src/lib/infect.c b/compel/arch/ppc64/src/lib/infect.c
index 8112588..1f1195e 100644
--- a/compel/arch/ppc64/src/lib/infect.c
+++ b/compel/arch/ppc64/src/lib/infect.c
@@ -2,6 +2,7 @@
 #include <sys/types.h>
 #include <sys/uio.h>
 #include <sys/user.h>
+#include <sys/mman.h>
 #include <stdint.h>
 #include <errno.h>
 #include <compel/plugins/std/syscall-codes.h>
@@ -9,6 +10,7 @@
 #include "errno.h"
 #include "log.h"
 #include "common/bug.h"
+#include "common/page.h"
 #include "infect.h"
 #include "infect-priv.h"
 
@@ -458,7 +460,19 @@ int arch_fetch_sas(struct parasite_ctl *ctl, struct rt_sigframe *s)
  *
  * NOTE: 32bit tasks are not supported.
  */
-#define TASK_SIZE_USER64	(0x0000400000000000UL)
-#define TASK_SIZE		TASK_SIZE_USER64
+#define TASK_SIZE_64TB  (0x0000400000000000UL)
+#define TASK_SIZE_128TB (0x0000800000000000UL)
+#define TASK_SIZE_512TB (0x0002000000000000UL)
 
-unsigned long compel_task_size(void) { return TASK_SIZE; }
+#define TASK_SIZE_MIN TASK_SIZE_64TB
+#define TASK_SIZE_MAX TASK_SIZE_512TB
+
+unsigned long compel_task_size(void)
+{
+	unsigned long task_size;
+
+	for (task_size = TASK_SIZE_MIN; task_size < TASK_SIZE_MAX; task_size <<= 1)
+		if (munmap((void *)task_size, page_size()))
+			break;
+	return task_size;
+}
-- 
2.7.4



More information about the CRIU mailing list