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 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.