From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
To: Oren Laadan <orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
Cc: containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
Dave Hansen
<dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Subject: Re: [RFC v14-rc2][PATCH 15/29] Restart multiple processes
Date: Mon, 6 Apr 2009 20:33:15 -0700 [thread overview]
Message-ID: <20090407033315.GJ12316@us.ibm.com> (raw)
In-Reply-To: <1238477349-11029-16-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
Couple of nits and couple of not-so minor comments
Oren Laadan [orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org] wrote:
| From 7162fef93ee3d9fd30a457dd7b0c7ad0200d5bcb Mon Sep 17 00:00:00 2001
| From: Oren Laadan <orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
| Date: Mon, 30 Mar 2009 15:06:13 -0400
| Subject: [PATCH 15/29] Restart multiple processes
|
| Restarting of multiple processes expects all restarting tasks to call
| sys_restart(). Once inside the system call, each task will restart
| itself at the same order that they were saved. The internals of the
| syscall will take care of in-kernel synchronization bewteen tasks.
|
| This patch does _not_ create the task tree in the kernel. Instead it
| assumes that all tasks are created in some way and then invoke the
| restart syscall. You can use the userspace mktree.c program to do
| that.
|
| The init task (*) has a special role: it allocates the restart context
| (ctx), and coordinates the operation. In particular, it first waits
| until all participating tasks enter the kernel, and provides them the
| common restart context. Once everyone in ready, it begins to restart
| itself.
|
| In contrast, the other tasks enter the kernel, locate the init task (*)
| and grab its restart context, and then wait for their turn to restore.
|
| When a task (init or not) completes its restart, it hands the control
| over to the next in line, by waking that task.
|
| An array of pids (the one saved during the checkpoint) is used to
| synchronize the operation. The first task in the array is the init
| task (*). The restart context (ctx) maintain a "current position" in
| the array, which indicates which task is currently active. Once the
| currently active task completes its own restart, it increments that
| position and wakes up the next task.
|
| Restart assumes that userspace provides meaningful data, otherwise
| it's garbage-in-garbage-out. In this case, the syscall may block
| indefinitely, but in TASK_INTERRUPTIBLE, so the user can ctrl-c or
| otherwise kill the stray restarting tasks.
|
| In terms of security, restart runs as the user the invokes it, so it
| will not allow a user to do more than is otherwise permitted by the
| usual system semantics and policy.
|
| Currently we ignore threads and zombies, as well as session ids.
| Add support for multiple processes
|
| (*) For containers, restart should be called inside a fresh container
| by the init task of that container. However, it is also possible to
| restart applications not necessarily inside a container, and without
| restoring the original pids of the processes (that is, provided that
| the application can tolerate such behavior). This is useful to allow
| multi-process restart of tasks not isolated inside a container, and
| also for debugging.
|
| Changelog[v14]:
| - Revert change to pr_debug(), back to cr_debug()
| - Discard field 'h.parent'
| - Check whether calls to cr_hbuf_get() fail
|
| Changelog[v13]:
| - Clear root_task->checkpoint_ctx regardless of error condition
| - Remove unused argument 'ctx' from do_restart_task() prototype
| - Remove unused member 'pids_err' from 'struct cr_ctx'
|
| Changelog[v12]:
| - Replace obsolete cr_debug() with pr_debug()
|
| Signed-off-by: Oren Laadan <orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
| Acked-by: Serge Hallyn <serue-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
| ---
| checkpoint/restart.c | 224 +++++++++++++++++++++++++++++++++++++++++++-
| checkpoint/sys.c | 34 ++++++--
| include/linux/checkpoint.h | 24 ++++-
| include/linux/sched.h | 4 +
| 4 files changed, 272 insertions(+), 14 deletions(-)
|
| diff --git a/checkpoint/restart.c b/checkpoint/restart.c
| index 96d4d45..adebc1c 100644
| --- a/checkpoint/restart.c
| +++ b/checkpoint/restart.c
| @@ -10,6 +10,7 @@
|
| #include <linux/version.h>
| #include <linux/sched.h>
| +#include <linux/wait.h>
| #include <linux/file.h>
| #include <linux/magic.h>
| #include <linux/checkpoint.h>
| @@ -301,30 +302,245 @@ static int cr_read_task(struct cr_ctx *ctx)
| return ret;
| }
|
| +/* cr_read_tree - read the tasks tree into the checkpoint context */
| +static int cr_read_tree(struct cr_ctx *ctx)
| +{
| + struct cr_hdr_tree *hh;
| + int size, ret;
| +
| + hh = cr_hbuf_get(ctx, sizeof(*hh));
| + if (!hh)
| + return -ENOMEM;
| +
| + ret = cr_read_obj_type(ctx, hh, sizeof(*hh), CR_HDR_TREE);
| + if (ret < 0)
| + goto out;
| +
| + ret = -EINVAL;
| + if (hh->tasks_nr < 0)
| + goto out;
| +
| + ctx->pids_nr = hh->tasks_nr;
| + size = sizeof(*ctx->pids_arr) * ctx->pids_nr;
| + if (size < 0) /* overflow ? */
| + goto out;
| +
| + ctx->pids_arr = kmalloc(size, GFP_KERNEL);
| + if (!ctx->pids_arr) {
| + ret = -ENOMEM;
| + goto out;
| + }
| + ret = cr_kread(ctx, ctx->pids_arr, size);
| + out:
| + cr_hbuf_put(ctx, sizeof(*hh));
| + return ret;
| +}
| +
| +static int cr_wait_task(struct cr_ctx *ctx)
| +{
| + pid_t pid = task_pid_vnr(current);
| +
| + cr_debug("pid %d waiting\n", pid);
| + return wait_event_interruptible(ctx->waitq, ctx->pids_active == pid);
| +}
| +
| +static int cr_next_task(struct cr_ctx *ctx)
| +{
| + struct task_struct *tsk;
| +
| + ctx->pids_pos++;
| +
| + cr_debug("pids_pos %d %d\n", ctx->pids_pos, ctx->pids_nr);
| + if (ctx->pids_pos == ctx->pids_nr) {
| + complete(&ctx->complete);
| + return 0;
| + }
| +
| + ctx->pids_active = ctx->pids_arr[ctx->pids_pos].vpid;
| +
| + cr_debug("pids_next %d\n", ctx->pids_active);
| +
| + rcu_read_lock();
| + tsk = find_task_by_pid_ns(ctx->pids_active, ctx->root_nsproxy->pid_ns);
| + if (tsk)
| + wake_up_process(tsk);
| + rcu_read_unlock();
| +
| + if (!tsk) {
| + complete(&ctx->complete);
| + return -ESRCH;
| + }
| +
| + return 0;
| +}
| +
| +/* FIXME: this should be per container */
| +DECLARE_WAIT_QUEUE_HEAD(cr_restart_waitq);
| +
| +static int do_restart_task(pid_t pid)
| +{
| + struct task_struct *root_task;
| + struct cr_ctx *ctx = NULL;
| + int ret;
| +
| + rcu_read_lock();
| + root_task = find_task_by_pid_ns(pid, current->nsproxy->pid_ns);
| + if (root_task)
| + get_task_struct(root_task);
| + rcu_read_unlock();
| +
| + if (!root_task)
| + return -EINVAL;
| +
| + /*
| + * wait for container init to initialize the restart context, then
| + * grab a reference to that context, and if we're the last task to
| + * do it, notify the container init.
| + */
| + ret = wait_event_interruptible(cr_restart_waitq,
| + root_task->checkpoint_ctx);
| + if (ret < 0)
| + goto out;
| +
| + task_lock(root_task);
| + ctx = root_task->checkpoint_ctx;
| + if (ctx)
| + cr_ctx_get(ctx);
| + task_unlock(root_task);
| +
| + if (!ctx) {
| + ret = -EAGAIN;
| + goto out;
| + }
| +
| + if (atomic_dec_and_test(&ctx->tasks_count))
| + complete(&ctx->complete);
| +
| + /* wait for our turn, do the restore, and tell next task in line */
| + ret = cr_wait_task(ctx);
| + if (ret < 0)
| + goto out;
| + ret = cr_read_task(ctx);
| + if (ret < 0)
| + goto out;
| + ret = cr_next_task(ctx);
| +
| + out:
| + cr_ctx_put(ctx);
| + put_task_struct(root_task);
| + return ret;
| +}
| +
| +/**
| + * cr_wait_all_tasks_start - wait for all tasks to enter sys_restart()
| + * @ctx: checkpoint context
| + *
| + * Called by the container root to wait until all restarting tasks
| + * are ready to restore their state. Temporarily advertises the 'ctx'
| + * on 'current->checkpoint_ctx' so that others can grab a reference
| + * to it, and clears it once synchronization completes. See also the
| + * related code in do_restart_task().
| + */
| +static int cr_wait_all_tasks_start(struct cr_ctx *ctx)
| +{
| + int ret;
| +
| + if (ctx->pids_nr == 1)
| + return 0;
| +
| + init_completion(&ctx->complete);
| + current->checkpoint_ctx = ctx;
| +
| + wake_up_all(&cr_restart_waitq);
| +
| + ret = wait_for_completion_interruptible(&ctx->complete);
| +
| + task_lock(current);
| + current->checkpoint_ctx = NULL;
| + task_unlock(current);
| +
| + return ret;
| +}
| +
| +static int cr_wait_all_tasks_finish(struct cr_ctx *ctx)
| +{
| + int ret;
| +
| + if (ctx->pids_nr == 1)
| + return 0;
| +
| + init_completion(&ctx->complete);
| +
| + ret = cr_next_task(ctx);
| + if (ret < 0)
| + return ret;
| +
| + ret = wait_for_completion_interruptible(&ctx->complete);
| + if (ret < 0)
| + return ret;
| +
| + return 0;
| +}
| +
| /* setup restart-specific parts of ctx */
| static int cr_ctx_restart(struct cr_ctx *ctx, pid_t pid)
| {
| + ctx->root_pid = pid;
| + ctx->root_task = current;
| + ctx->root_nsproxy = current->nsproxy;
| +
| + get_task_struct(ctx->root_task);
| + get_nsproxy(ctx->root_nsproxy);
| +
| + atomic_set(&ctx->tasks_count, ctx->pids_nr - 1);
| +
| return 0;
| }
|
| -int do_restart(struct cr_ctx *ctx, pid_t pid)
| +static int do_restart_root(struct cr_ctx *ctx, pid_t pid)
| {
| int ret;
|
| + ret = cr_read_head(ctx);
| + if (ret < 0)
| + goto out;
| + ret = cr_read_tree(ctx);
| + if (ret < 0)
| + goto out;
| +
| ret = cr_ctx_restart(ctx, pid);
| if (ret < 0)
| goto out;
| - ret = cr_read_head(ctx);
| +
| + /* wait for all other tasks to enter do_restart_task() */
| + ret = cr_wait_all_tasks_start(ctx);
| if (ret < 0)
| goto out;
| +
| ret = cr_read_task(ctx);
| if (ret < 0)
| goto out;
| - ret = cr_read_tail(ctx);
| +
| + /* wait for all other tasks to complete do_restart_task() */
| + ret = cr_wait_all_tasks_finish(ctx);
| if (ret < 0)
| goto out;
|
| - /* on success, adjust the return value if needed [TODO] */
| + ret = cr_read_tail(ctx);
| +
| out:
| return ret;
| }
| +
| +int do_restart(struct cr_ctx *ctx, pid_t pid)
| +{
| + int ret;
| +
| + if (ctx)
| + ret = do_restart_root(ctx, pid);
| + else
| + ret = do_restart_task(pid);
| +
| + /* on success, adjust the return value if needed [TODO] */
| + return ret;
| +}
| diff --git a/checkpoint/sys.c b/checkpoint/sys.c
| index 8630144..3a925ae 100644
| --- a/checkpoint/sys.c
| +++ b/checkpoint/sys.c
| @@ -167,6 +167,8 @@ static void cr_task_arr_free(struct cr_ctx *ctx)
|
| static void cr_ctx_free(struct cr_ctx *ctx)
| {
| + BUG_ON(atomic_read(&ctx->refcount));
| +
| if (ctx->file)
| fput(ctx->file);
|
| @@ -185,6 +187,8 @@ static void cr_ctx_free(struct cr_ctx *ctx)
| if (ctx->root_task)
| put_task_struct(ctx->root_task);
|
| + kfree(ctx->pids_arr);
| +
| kfree(ctx);
| }
|
| @@ -199,8 +203,10 @@ static struct cr_ctx *cr_ctx_alloc(int fd, unsigned long flags)
|
| ctx->flags = flags;
|
| + atomic_set(&ctx->refcount, 0);
| INIT_LIST_HEAD(&ctx->pgarr_list);
| INIT_LIST_HEAD(&ctx->pgarr_pool);
| + init_waitqueue_head(&ctx->waitq);
|
| err = -EBADF;
| ctx->file = fget(fd);
| @@ -215,6 +221,7 @@ static struct cr_ctx *cr_ctx_alloc(int fd, unsigned long flags)
| if (cr_objhash_alloc(ctx) < 0)
| goto err;
|
| + atomic_inc(&ctx->refcount);
| return ctx;
|
| err:
| @@ -222,6 +229,17 @@ static struct cr_ctx *cr_ctx_alloc(int fd, unsigned long flags)
| return ERR_PTR(err);
| }
|
| +void cr_ctx_get(struct cr_ctx *ctx)
| +{
| + atomic_inc(&ctx->refcount);
| +}
| +
| +void cr_ctx_put(struct cr_ctx *ctx)
| +{
| + if (ctx && atomic_dec_and_test(&ctx->refcount))
| + cr_ctx_free(ctx);
| +}
| +
| /**
| * sys_checkpoint - checkpoint a container
| * @pid: pid of the container init(1) process
| @@ -251,7 +269,7 @@ asmlinkage long sys_checkpoint(pid_t pid, int fd, unsigned long flags)
| if (!ret)
| ret = ctx->crid;
|
| - cr_ctx_free(ctx);
| + cr_ctx_put(ctx);
| return ret;
| }
|
| @@ -266,7 +284,7 @@ asmlinkage long sys_checkpoint(pid_t pid, int fd, unsigned long flags)
| */
| asmlinkage long sys_restart(int crid, int fd, unsigned long flags)
| {
| - struct cr_ctx *ctx;
| + struct cr_ctx *ctx = NULL;
| pid_t pid;
| int ret;
|
| @@ -274,15 +292,17 @@ asmlinkage long sys_restart(int crid, int fd, unsigned long flags)
| if (flags)
| return -EINVAL;
|
| - ctx = cr_ctx_alloc(fd, flags | CR_CTX_RSTR);
| - if (IS_ERR(ctx))
| - return PTR_ERR(ctx);
| -
| /* FIXME: for now, we use 'crid' as a pid */
| pid = (pid_t) crid;
|
| + if (pid == task_pid_vnr(current))
| + ctx = cr_ctx_alloc(fd, flags | CR_CTX_RSTR);
| +
| + if (IS_ERR(ctx))
| + return PTR_ERR(ctx);
| +
| ret = do_restart(ctx, pid);
|
| - cr_ctx_free(ctx);
| + cr_ctx_put(ctx);
| return ret;
| }
| diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
| index c946320..cede30e 100644
| --- a/include/linux/checkpoint.h
| +++ b/include/linux/checkpoint.h
| @@ -12,8 +12,11 @@
|
| #include <linux/path.h>
| #include <linux/fs.h>
| +#include <linux/path.h>
| +#include <linux/sched.h>
| +#include <asm/atomic.h>
|
| -#define CR_VERSION 2
| +#define CR_VERSION 3
|
| struct cr_ctx {
| int crid; /* unique checkpoint id */
| @@ -31,8 +34,7 @@ struct cr_ctx {
| void *hbuf; /* temporary buffer for headers */
| int hpos; /* position in headers buffer */
|
| - struct task_struct **tasks_arr; /* array of all tasks in container */
| - int tasks_nr; /* size of tasks array */
| + atomic_t refcount;
|
| struct cr_objhash *objhash; /* hash for shared objects */
|
| @@ -40,6 +42,19 @@ struct cr_ctx {
| struct list_head pgarr_pool; /* pool of empty page arrays chain */
|
| struct path fs_mnt; /* container root (FIXME) */
| +
| + /* [multi-process checkpoint] */
| + struct task_struct **tasks_arr; /* array of all tasks [checkpoint] */
| + int tasks_nr; /* size of tasks array */
| +
| + /* [multi-process restart] */
| + struct cr_hdr_pids *pids_arr; /* array of all pids [restart] */
| + int pids_nr; /* size of pids array */
Nit: Since we already have a pid_nr() that refers to something different,
can we call this 'nr_pids' (and nr_tasks above) like mm_context->nr_threads ?
Of course, there is no convention, so its easy to argue the other way.
Secondly, isn't pids_nr same as tasks_nr ? If so do we need both ?
Or is this intended to address the issue of multiple pid_nr values that a
task in a nested container can have ? If so, pids_nr is > tasks_nr and that
brings up two comments :-)
First, mktree.c and cr_next_task() are using 'ctx->pids_nr' to determine how
many tasks to start. If we are talking about nested containers, pids_nr
will be greater than tasks_nr so, mktree and cr_next_task() should be
use 'ctx->tasks_nr' to determine how many tasks to create. Also if
checkpointing a nested container we should view the multiple nested pid
values a process as an attribute of the task and maybe save them in
cr_write_task() rather than in cr_write_tree().
My second comment is more an orthogonal question. Suppose init_pid_ns = level
0 and we have a container that is nested at level 3. If we checkpoint just
this container, we would want to be able to restore this container at any level
> 0 right ?
| + int pids_pos; /* position pids array */
| + pid_t pids_active; /* pid of (next) active task */
Do we need both pids_pos and pids_active in the ctx ? Can pids_active
just be a local variable in cr_next_task() and cr_wait_task() ?
IOW, isn't this always true
pids_arr[pids_pos] == pids_active
| + atomic_t tasks_count; /* sync of tasks: used to coordinate */
Name is a bit confusing with 'tasks_nr', but the comment helps and I can't
think of a better name.
| + struct completion complete; /* container root and other tasks on */
| + wait_queue_head_t waitq; /* start, end, and restart ordering */
| };
Sukadev
next prev parent reply other threads:[~2009-04-07 3:33 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-31 5:28 [RFC v14-rc2][PATCH 00/29] Kernel based checkpoint/restart Oren Laadan
[not found] ` <1238477349-11029-1-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 01/29] Create syscalls: sys_checkpoint, sys_restart Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 02/29] Checkpoint/restart: initial documentation Oren Laadan
[not found] ` <1238477349-11029-3-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:22 ` Sukadev Bhattiprolu
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 03/29] Make file_pos_read/write() public Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 04/29] General infrastructure for checkpoint restart Oren Laadan
[not found] ` <1238477349-11029-5-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:24 ` Sukadev Bhattiprolu
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 05/29] x86 support for checkpoint/restart Oren Laadan
[not found] ` <1238477349-11029-6-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:25 ` Sukadev Bhattiprolu
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 06/29] Dump memory address space Oren Laadan
[not found] ` <1238477349-11029-7-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:26 ` Sukadev Bhattiprolu
[not found] ` <20090407032636.GD12316-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-07 4:57 ` Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 07/29] Restore " Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 08/29] Infrastructure for shared objects Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 09/29] Dump open file descriptors Oren Laadan
[not found] ` <1238477349-11029-10-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:28 ` Sukadev Bhattiprolu
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 10/29] actually use f_op in checkpoint code Oren Laadan
[not found] ` <1238477349-11029-11-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-03-31 18:31 ` Oren Laadan
2009-04-01 18:54 ` Serge E. Hallyn
2009-04-07 3:29 ` Sukadev Bhattiprolu
[not found] ` <20090407032912.GF12316-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-07 5:36 ` Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 11/29] add generic checkpoint f_op to ext fses Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 12/29] Restore open file descriptors Oren Laadan
[not found] ` <1238477349-11029-13-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:29 ` Sukadev Bhattiprolu
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 13/29] External checkpoint of a task other than ourself Oren Laadan
[not found] ` <1238477349-11029-14-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:30 ` Sukadev Bhattiprolu
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 14/29] Checkpoint multiple processes Oren Laadan
[not found] ` <1238477349-11029-15-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:31 ` Sukadev Bhattiprolu
[not found] ` <20090407033111.GI12316-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-07 5:12 ` Oren Laadan
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 15/29] Restart " Oren Laadan
[not found] ` <1238477349-11029-16-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 3:33 ` Sukadev Bhattiprolu [this message]
[not found] ` <20090407033315.GJ12316-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-07 5:31 ` Oren Laadan
[not found] ` <49DAE526.6010900-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 16:29 ` Sukadev Bhattiprolu
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 16/29] A new file type (CR_FD_OBJREF) for a file descriptor already setup Oren Laadan
[not found] ` <1238477349-11029-17-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-01 13:59 ` Serge E. Hallyn
[not found] ` <20090401135952.GA16973-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-01 14:13 ` Oren Laadan
2009-04-01 18:36 ` Serge E. Hallyn
2009-04-03 15:46 ` Dan Smith
[not found] ` <87y6uhyc3j.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-04-03 16:25 ` Oren Laadan
[not found] ` <49D63865.1030807-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-03 16:30 ` Dan Smith
2009-04-03 16:54 ` Dave Hansen
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 17/29] Checkpoint open pipes Oren Laadan
[not found] ` <1238477349-11029-18-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-01 19:47 ` Serge E. Hallyn
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 18/29] Restore " Oren Laadan
[not found] ` <1238477349-11029-19-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-01 20:34 ` Serge E. Hallyn
2009-03-31 5:28 ` [RFC v14-rc2][PATCH 19/29] Record 'struct file' object instead of the file name for VMAs Oren Laadan
[not found] ` <1238477349-11029-20-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-01 21:45 ` Serge E. Hallyn
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 20/29] Prepare to support shared memory Oren Laadan
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 21/29] Dump anonymous- and file-mapped- " Oren Laadan
[not found] ` <1238477349-11029-22-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-01 23:06 ` Serge E. Hallyn
[not found] ` <20090401230657.GB27725-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-01 23:18 ` Oren Laadan
[not found] ` <49D3F636.1070303-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-01 23:32 ` Serge E. Hallyn
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 22/29] Restore " Oren Laadan
[not found] ` <1238477349-11029-23-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-02 16:59 ` Serge E. Hallyn
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 23/29] s390: Expose a constant for the number of words representing the CRs Oren Laadan
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 24/29] c/r: Add CR_COPY() macro (v4) Oren Laadan
[not found] ` <1238477349-11029-25-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-01 23:20 ` Serge E. Hallyn
[not found] ` <20090401232013.GA31361-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-02 19:00 ` Dan Smith
[not found] ` <87vdpmnan2.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-04-02 19:06 ` Serge E. Hallyn
[not found] ` <20090402190612.GA24390-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-02 20:22 ` Dan Smith
[not found] ` <87r60an6us.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-04-05 20:25 ` Oren Laadan
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 25/29] s390: define s390-specific checkpoint-restart code (v7) Oren Laadan
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 26/29] powerpc: provide APIs for validating and updating DABR Oren Laadan
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 27/29] powerpc: checkpoint/restart implementation Oren Laadan
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 28/29] powerpc: wire up checkpoint and restart syscalls Oren Laadan
2009-03-31 5:29 ` [RFC v14-rc2][PATCH 29/29] powerpc: enable checkpoint support in Kconfig Oren Laadan
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=20090407033315.GJ12316@us.ibm.com \
--to=sukadev-23vcf4htsmix0ybbhkvfkdbpr1lh4cv8@public.gmane.org \
--cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox