[Devel] Re: External checkpoint patch

Oren Laadan orenl at cs.columbia.edu
Tue Oct 21 15:49:28 PDT 2008


Dave Hansen wrote:
> 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);

This is not needed (only needed in self checkpoint).

>  
>  		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);

missing put_task_struct() ?
missing security check ?

> +
> +	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;
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers




More information about the Devel mailing list