From: Dave Hansen <dave-gkUM19QKKo4@public.gmane.org>
To: Oren Laadan <orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
Cc: containers <containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org>,
Cedric Le Goater <clg-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
Subject: External checkpoint patch
Date: Tue, 21 Oct 2008 11:16:10 -0700 [thread overview]
Message-ID: <1224612971.1848.193.camel@nimitz> (raw)
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-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
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-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
---
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
next reply other threads:[~2008-10-21 18:16 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-21 18:16 Dave Hansen [this message]
2008-10-21 22:49 ` External checkpoint patch Oren Laadan
2008-10-21 23:07 ` Oren Laadan
[not found] ` <Pine.LNX.4.64.0810211857140.22085-CXF6herHY6ykSYb+qCZC/1i27PF6R63G9nwVQlTi/Pw@public.gmane.org>
2008-10-23 7:51 ` Cedric Le Goater
2008-10-23 13:48 ` Cedric Le Goater
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1224612971.1848.193.camel@nimitz \
--to=dave-gkum19qkko4@public.gmane.org \
--cc=clg-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org \
--cc=containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org \
--cc=orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.