[Devel] External checkpoint patch
Dave Hansen
dave at sr71.net
Tue Oct 21 11:16:10 PDT 2008
Oren,
Could you take a look over Cedric's external checkpoint patch?
http://git.kernel.org/?p=linux/kernel/git/daveh/linux-2.6-cr.git;a=commit;h=28ffabbc17d3641eee2a7eb66f714c266c400263
It seems pretty small to me.
--
>From a2f88cbc023e2e9be5eb554fe64078a3d7d2ade6 Mon Sep 17 00:00:00 2001
From: Cedric Le Goater <clg at fr.ibm.com>
Date: Tue, 30 Sep 2008 10:45:13 +0200
Subject: [PATCH] enable external checkpoint
Modify self checkpoint syscall to allow another process to initiate
checkpoint
Signed-off-by: Cedric Le Goater <clg at fr.ibm.com>
---
arch/x86/mm/checkpoint.c | 2 +-
checkpoint/checkpoint.c | 2 +-
checkpoint/sys.c | 28 +++++++++++++++++++++-------
include/linux/checkpoint.h | 1 +
4 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/arch/x86/mm/checkpoint.c b/arch/x86/mm/checkpoint.c
index d6c5263..202a579 100644
--- a/arch/x86/mm/checkpoint.c
+++ b/arch/x86/mm/checkpoint.c
@@ -164,7 +164,7 @@ void cr_write_cpu_fpu(struct cr_hdr_cpu *hh, struct task_struct *t)
* except if we are in process context, in which case we do
*/
if (thread_info->status & TS_USEDFPU)
- unlazy_fpu(current);
+ unlazy_fpu(t);
hh->has_fxsr = cpu_has_fxsr;
memcpy(&hh->xstate, &thread->xstate, sizeof(thread->xstate));
diff --git a/checkpoint/checkpoint.c b/checkpoint/checkpoint.c
index 87420dc..c4e8242 100644
--- a/checkpoint/checkpoint.c
+++ b/checkpoint/checkpoint.c
@@ -227,7 +227,7 @@ int do_checkpoint(struct cr_ctx *ctx)
ret = cr_write_head(ctx);
if (ret < 0)
goto out;
- ret = cr_write_task(ctx, current);
+ ret = cr_write_task(ctx, ctx->task);
if (ret < 0)
goto out;
ret = cr_write_tail(ctx);
diff --git a/checkpoint/sys.c b/checkpoint/sys.c
index 4fcd3e0..ec028c6 100644
--- a/checkpoint/sys.c
+++ b/checkpoint/sys.c
@@ -176,7 +176,8 @@ void cr_ctx_free(struct cr_ctx *ctx)
kfree(ctx);
}
-struct cr_ctx *cr_ctx_alloc(pid_t pid, int fd, unsigned long flags)
+struct cr_ctx *cr_ctx_alloc(struct task_struct *t, pid_t pid, int fd,
+ unsigned long flags)
{
struct cr_ctx *ctx;
@@ -184,6 +185,7 @@ struct cr_ctx *cr_ctx_alloc(pid_t pid, int fd, unsigned long flags)
if (!ctx)
return ERR_PTR(-ENOMEM);
+ ctx->task = t;
ctx->file = fget(fd);
if (!ctx->file) {
cr_ctx_free(ctx);
@@ -205,7 +207,7 @@ struct cr_ctx *cr_ctx_alloc(pid_t pid, int fd, unsigned long flags)
* assume checkpointer is in container's root vfs
* FIXME: this works for now, but will change with real containers
*/
- ctx->vfsroot = ¤t->fs->root;
+ ctx->vfsroot = &t->fs->root;
path_get(ctx->vfsroot);
INIT_LIST_HEAD(&ctx->pgarr_list);
@@ -231,20 +233,32 @@ asmlinkage long sys_checkpoint(pid_t pid, int fd, unsigned long flags)
{
struct cr_ctx *ctx;
int ret;
+ struct task_struct *t;
/* no flags for now */
if (flags)
return -EINVAL;
- ctx = cr_ctx_alloc(pid, fd, flags | CR_CTX_CKPT);
- if (IS_ERR(ctx))
- return PTR_ERR(ctx);
+ read_lock(&tasklist_lock);
+ t = find_task_by_vpid(pid);
+ if (t)
+ get_task_struct(t);
+ read_unlock(&tasklist_lock);
+
+ if (!t)
+ return -ESRCH;
+ ctx = cr_ctx_alloc(t, pid, fd, flags | CR_CTX_CKPT);
+ if (IS_ERR(ctx)) {
+ ret = PTR_ERR(ctx);
+ goto out;
+ }
+
ret = do_checkpoint(ctx);
if (!ret)
ret = ctx->crid;
-
+out:
cr_ctx_free(ctx);
return ret;
}
@@ -267,7 +281,7 @@ asmlinkage long sys_restart(int crid, int fd, unsigned long flags)
if (flags)
return -EINVAL;
- ctx = cr_ctx_alloc(crid, fd, flags | CR_CTX_RSTR);
+ ctx = cr_ctx_alloc(current, crid, fd, flags | CR_CTX_RSTR);
if (IS_ERR(ctx))
return PTR_ERR(ctx);
diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
index 6c1e87f..2983700 100644
--- a/include/linux/checkpoint.h
+++ b/include/linux/checkpoint.h
@@ -17,6 +17,7 @@
struct cr_ctx {
pid_t pid; /* container identifier */
+ struct task_struct *task;
int crid; /* unique checkpoint id */
unsigned long flags;
--
1.5.5.1
-- Dave
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list