[Devel] [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
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list