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 <[EMAIL PROTECTED]>
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 <[EMAIL PROTECTED]>
---
 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 = &current->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
[EMAIL PROTECTED]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to