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@xxxxxxxxxx> --- 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 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers