[PATCH] make checkpoint a ptregs syscall as well

Serge E. Hallyn serue at us.ibm.com
Mon Jan 18 12:33:18 PST 2010


This is on top of the 64-bit patches which Oren posted on Dec 6, so
it does not work with my cr-next branch or Oren's ckpt-v19-rc2, and
s390 and powerpc will need corresponding patches.

Without this, restart of self-checkpoint fails (understandably) on the
amd64 test system I'm borrowing.

I have not yet tested restart of checkpointed 32-bit program on 64-bit
machine.  Or for that matter a 32bit kernel.

Thanks, Nathan, for finding the problem!  I should have guessed, based
on my symptoms.

Signed-off-by: Serge Hallyn <serue at us.ibm.com>
---
 arch/x86/include/asm/syscalls.h    |    3 +++
 arch/x86/include/asm/unistd_64.h   |    2 +-
 arch/x86/kernel/checkpoint_64.c    |   10 ++++++++++
 arch/x86/kernel/entry_32.S         |    1 +
 arch/x86/kernel/entry_64.S         |    2 ++
 arch/x86/kernel/syscall_table_32.S |    2 +-
 checkpoint/sys.c                   |    5 ++---
 include/linux/checkpoint.h         |    2 ++
 include/linux/syscalls.h           |    2 --
 9 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h
index 063cdd0..35b2060 100644
--- a/arch/x86/include/asm/syscalls.h
+++ b/arch/x86/include/asm/syscalls.h
@@ -45,6 +45,7 @@ int sys_execve(struct pt_regs *);
 
 /* kernel/checkpoint_32.c */
 #ifdef CONFIG_CHECKPOINT
+long sys_checkpoint(struct pt_regs *);
 long sys_restart(struct pt_regs *);
 #endif
 
@@ -90,6 +91,8 @@ long sys_arch_prctl(int, unsigned long);
 
 /* kernel/checkpoint_64.c */
 #ifdef CONFIG_CHECKPOINT
+asmlinkage long sys_checkpoint(pid_t pid, int fd, unsigned long flags,
+				int logfd, struct pt_regs *regs);
 asmlinkage long sys_restart(pid_t pid, int fd, unsigned long flags, int logfd,
 			    struct pt_regs *regs);
 #endif
diff --git a/arch/x86/include/asm/unistd_64.h b/arch/x86/include/asm/unistd_64.h
index c360707..e443304 100644
--- a/arch/x86/include/asm/unistd_64.h
+++ b/arch/x86/include/asm/unistd_64.h
@@ -664,7 +664,7 @@ __SYSCALL(__NR_perf_event_open, sys_perf_event_open)
 #define __NR_eclone                   		299
 __SYSCALL(__NR_eclone, stub_eclone)
 #define __NR_checkpoint                   	300
-__SYSCALL(__NR_checkpoint, sys_checkpoint)
+__SYSCALL(__NR_checkpoint, stub_checkpoint)
 #define __NR_restart                   		301
 __SYSCALL(__NR_restart, stub_restart)
 
diff --git a/arch/x86/kernel/checkpoint_64.c b/arch/x86/kernel/checkpoint_64.c
index 87c1606..a63e88d 100644
--- a/arch/x86/kernel/checkpoint_64.c
+++ b/arch/x86/kernel/checkpoint_64.c
@@ -22,6 +22,16 @@
  * sys_restart needs to access and modify the pt_regs structure to
  * restore the original state from the time of the checkpoint.
  */
+asmlinkage long sys_checkpoint(pid_t pid, int fd, unsigned long flags, int logfd,
+			    struct pt_regs *regs)
+{
+	return do_sys_checkpoint(pid, fd, flags, logfd);
+}
+
+/*
+ * sys_restart needs to access and modify the pt_regs structure to
+ * restore the original state from the time of the checkpoint.
+ */
 asmlinkage long sys_restart(pid_t pid, int fd, unsigned long flags, int logfd,
 			    struct pt_regs *regs)
 {
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
index ecefd09..76ec9c4 100644
--- a/arch/x86/kernel/entry_32.S
+++ b/arch/x86/kernel/entry_32.S
@@ -727,6 +727,7 @@ PTREGSCALL(rt_sigreturn)
 PTREGSCALL(vm86)
 PTREGSCALL(vm86old)
 #ifdef CONFIG_CHECKPOINT
+PTREGSCALL(checkpoint)
 PTREGSCALL(restart)
 #endif
 
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index e692193..ec6f43f 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -700,8 +700,10 @@ END(\label)
 	PTREGSCALL stub_iopl, sys_iopl, %rsi
 	PTREGSCALL stub_eclone, sys_eclone, %r8
 #ifdef CONFIG_CHECKPOINT
+	PTREGSCALL stub_checkpoint, sys_checkpoint, %r8
 	PTREGSCALL stub_restart, sys_restart, %r8
 #else
+	PTREGSCALL stub_checkpoint, sys_ni_syscall, %r8
 	PTREGSCALL stub_restart, sys_ni_syscall, %r8
 #endif
 
diff --git a/arch/x86/kernel/syscall_table_32.S b/arch/x86/kernel/syscall_table_32.S
index 1ca053e..28fd000 100644
--- a/arch/x86/kernel/syscall_table_32.S
+++ b/arch/x86/kernel/syscall_table_32.S
@@ -337,5 +337,5 @@ ENTRY(sys_call_table)
 	.long sys_rt_tgsigqueueinfo	/* 335 */
 	.long sys_perf_event_open
 	.long ptregs_eclone
-	.long sys_checkpoint
+	.long ptregs_checkpoint
 	.long ptregs_restart
diff --git a/checkpoint/sys.c b/checkpoint/sys.c
index 303e16f..c26682c 100644
--- a/checkpoint/sys.c
+++ b/checkpoint/sys.c
@@ -605,7 +605,7 @@ int walk_task_subtree(struct task_struct *root,
 /* checkpoint/restart syscalls */
 
 /**
- * sys_checkpoint - checkpoint a container
+ * do_sys_checkpoint - checkpoint a container
  * @pid: pid of the container init(1) process
  * @fd: file to which dump the checkpoint image
  * @flags: checkpoint operation flags
@@ -614,8 +614,7 @@ int walk_task_subtree(struct task_struct *root,
  * Returns positive identifier on success, 0 when returning from restart
  * or negative value on error
  */
-SYSCALL_DEFINE4(checkpoint, pid_t, pid, int, fd,
-		unsigned long, flags, int, logfd)
+long do_sys_checkpoint(pid_t pid, int fd, unsigned long flags, int logfd)
 {
 	struct ckpt_ctx *ctx;
 	long ret;
diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
index fb0f5e8..f569fb0 100644
--- a/include/linux/checkpoint.h
+++ b/include/linux/checkpoint.h
@@ -60,6 +60,8 @@
 #define CKPT_LSM_INFO_LEN 200
 #define CKPT_LSM_STRING_MAX 1024
 
+extern long do_sys_checkpoint(pid_t pid, int fd, unsigned long flags,
+				int logfd);
 extern long do_sys_restart(pid_t pid, int fd, unsigned long flags, int logfd);
 
 extern int walk_task_subtree(struct task_struct *task,
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 264a02e..a990ace 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -872,8 +872,6 @@ asmlinkage long sys_pselect6(int, fd_set __user *, fd_set __user *,
 asmlinkage long sys_ppoll(struct pollfd __user *, unsigned int,
 			  struct timespec __user *, const sigset_t __user *,
 			  size_t);
-asmlinkage long sys_checkpoint(pid_t pid, int fd, unsigned long flags,
-			       int logfd);
 
 int kernel_execve(const char *filename, char *const argv[], char *const envp[]);
 
-- 
1.6.0.6



More information about the Containers mailing list