Linux Container Development
 help / color / mirror / Atom feed
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-rc3][PATCH 15/36] c/r of restart-blocks
Date: Wed, 15 Apr 2009 23:02:21 -0700	[thread overview]
Message-ID: <20090416060220.GB14934@us.ibm.com> (raw)
In-Reply-To: <1239107264-21775-16-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>

Oren Laadan [orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org] wrote:

| +/* dump the task_struct of a given task */
| +int cr_write_restart_block(struct cr_ctx *ctx, struct task_struct *t)
| +{
| +	struct cr_hdr h;
| +	struct cr_hdr_restart_block *hh;
| +	struct restart_block *restart_block;
| +	long (*fn)(struct restart_block *);
| +	s64 base, expire = 0;
| +	int ret;
| +
| +	h.type = CR_HDR_RESTART_BLOCK;
| +	h.len = sizeof(*hh);
| +
| +	hh = cr_hbuf_get(ctx, sizeof(*hh));
| +	if (!hh)
| +		return -ENOMEM;
| +	memset(hh, 0, sizeof(*hh));
| +
| +	base = ktime_to_ns(ctx->ktime_beg);
| +	restart_block = &task_thread_info(t)->restart_block;
| +	fn = restart_block->fn;

Can we define another operation in 'struct restart_block' and replace
the following 'fn == xyz' checks with:

	if (!restart_block->checkpoint)
		BUG(1);

	expires = restart_block->checkpoint(restart_block, &hh);

It would touch other files and require ifdef CONFIG_CHECKPOINT in them
though.

| +
| +	/* FIX: enumerate clockid_t so we're immune to changes */
| +
| +	if (fn == do_no_restart_syscall) {
| +
| +		hh->fn = CR_RESTART_BLOCK_NONE;
| +		cr_debug("restart_block: non\n");
| +
| +	} else if (fn == hrtimer_nanosleep_restart) {
| +
| +		hh->fn = CR_RESTART_BLOCK_HRTIMER_NANOSLEEP;
| +		hh->arg_0 = restart_block->nanosleep.index;
| +		hh->arg_1 = (unsigned long) restart_block->nanosleep.rmtp;
| +		expire = restart_block->nanosleep.expires;
| +		cr_debug("restart_block: hrtimer expire %lld now %lld\n",
| +			 expire, base);
| +
| +	} else if (fn == posix_cpu_nsleep_restart) {
| +		struct timespec ts;
| +
| +		hh->fn = CR_RESTART_BLOCK_POSIX_CPU_NANOSLEEP;
| +		hh->arg_0 = restart_block->arg0;
| +		hh->arg_1 = restart_block->arg1;
| +		ts.tv_sec = restart_block->arg2;
| +		ts.tv_nsec = restart_block->arg3;
| +		expire = timespec_to_ns(&ts);
| +		cr_debug("restart_block: posix_cpu expire %lld now %lld\n",
| +			 expire, base);
| +
| +#ifdef CONFIG_COMPAT
| +	} else if (fn == compat_nanosleep_restart) {
| +
| +		hh->fn = CR_RESTART_BLOCK_NANOSLEEP;
| +		hh->arg_0 = restart_block->nanosleep.index;
| +		hh->arg_1 = (unsigned long) restart_block->nanosleep.rmtp;
| +		hh->arg_2 = (unsigned long)
| +			restart_block->nanosleep.compat_rmtp;
| +		expire = restart_block->nanosleep.expires;
| +		cr_debug("restart_block: compat expire %lld now %lld\n",
| +			 expire, base);
| +
| +	} else if (fn == compat_clock_nanosleep_restart) {
| +
| +		hh->fn = CR_RESTART_BLOCK_COMPAT_CLOCK_NANOSLEEP;
| +		hh->arg_0 = restart_block->nanosleep.index;
| +		hh->arg_1 = (unsigned long) restart_block->nanosleep.rmtp;
| +		hh->arg_2 = (unsigned long)
| +			restart_block->nanosleep.compat_rmtp;
| +		expire = restart_block->nanosleep.expires;
| +		cr_debug("restart_block: compat_clock expire %lld now %lld\n",
| +			 expire, base);
| +
| +#endif
| +	} else if (fn == futex_wait_restart) {
| +
| +		hh->fn = CR_RESTART_BLOCK_FUTEX;
| +		hh->arg_0 = (unsigned long) restart_block->futex.uaddr;
| +		hh->arg_1 = restart_block->futex.val;
| +		hh->arg_2 = restart_block->futex.flags;
| +		hh->arg_3 = restart_block->futex.bitset;
| +		expire = restart_block->futex.time;
| +		cr_debug("restart_block: futex expire %lld now %lld\n",
| +			 expire, base);
| +
| +	} else if (fn == do_restart_poll) {
| +		struct timespec ts;
| +
| +		hh->fn = CR_RESTART_BLOCK_POLL;
| +		hh->arg_0 = (unsigned long) restart_block->poll.ufds;
| +		hh->arg_1 = restart_block->poll.nfds;
| +		hh->arg_2 = restart_block->poll.has_timeout;
| +		ts.tv_sec = restart_block->poll.tv_sec;
| +		ts.tv_nsec = restart_block->poll.tv_nsec;
| +		expire = timespec_to_ns(&ts);
| +		cr_debug("restart_block: poll expire %lld now %lld\n",
| +			 expire, base);
| +
| +	} else {
| +
| +		BUG();
| +
| +	}
| +
| +	/* common to all restart blocks: */
| +	if (base < expire)
| +		hh->arg_4 = (expire - base);
| +
| +	cr_debug("restart_block: args %#llx %#llx %#llx %#llx %#llx\n",
| +		 hh->arg_0, hh->arg_1, hh->arg_2, hh->arg_3, hh->arg_4);
| +
| +	ret = cr_write_obj(ctx, &h, hh);
| +	cr_hbuf_put(ctx, sizeof(*hh));
| +
| +	return ret;
| +}
| +
|  /* dump the entire state of a given task */
|  int cr_write_task(struct cr_ctx *ctx, struct task_struct *t)
|  {
| diff --git a/checkpoint/restart.c b/checkpoint/restart.c
| index 234cc92..daaaeec 100644
| --- a/checkpoint/restart.c
| +++ b/checkpoint/restart.c
| @@ -264,18 +264,16 @@ int do_restart(struct cr_ctx *ctx, pid_t pid)
| 
|  	ret = cr_ctx_restart(ctx, pid);
|  	if (ret < 0)
| -		goto out;
| +		return ret;
|  	ret = cr_read_head(ctx);
|  	if (ret < 0)
| -		goto out;
| +		return ret;
|  	ret = cr_read_task(ctx);
|  	if (ret < 0)
| -		goto out;
| +		return ret;
|  	ret = cr_read_tail(ctx);
|  	if (ret < 0)
| -		goto out;
| +		return ret;

Nit, would this patch be simpler if we left the 'goto out' lines above
and added the 'return cr_retval_restart(ctx);' here (i.e just before the
'out:' label) ?

| 
| -	/* on success, adjust the return value if needed [TODO] */
| - out:
| -	return ret;
| +	return cr_retval_restart(ctx);
|  }
| diff --git a/checkpoint/rstr_task.c b/checkpoint/rstr_task.c
| index 93c86ab..52206d8 100644
| --- a/checkpoint/rstr_task.c
| +++ b/checkpoint/rstr_task.c
| @@ -9,6 +9,9 @@
|   */
| 
|  #include <linux/sched.h>
| +#include <linux/posix-timers.h>
| +#include <linux/futex.h>
| +#include <linux/poll.h>
|  #include <linux/checkpoint.h>
|  #include <linux/checkpoint_hdr.h>
| 
| @@ -52,6 +55,115 @@ static int cr_read_task_struct(struct cr_ctx *ctx)
|  	return ret;
|  }
| 
| +int cr_read_restart_block(struct cr_ctx *ctx)
| +{
| +	struct cr_hdr_restart_block *hh;
| +	struct restart_block restart_block;
| +	struct timespec ts;
| +	clockid_t clockid;
| +	s64 expire;
| +	int ret;
| +
| +	hh = cr_hbuf_get(ctx, sizeof(*hh));
| +	if (!hh)
| +		return -ENOMEM;
| +
| +	ret = cr_read_obj_type(ctx, hh, sizeof(*hh), CR_HDR_RESTART_BLOCK);
| +	if (ret < 0)
| +		goto out;
| +
| +	expire = ktime_to_ns(ctx->ktime_beg) + hh->arg_4;
| +	restart_block.fn = NULL;
| +
| +	cr_debug("restart_block: expire %lld begin %lld\n",
| +		 expire, ktime_to_ns(ctx->ktime_beg));
| +	cr_debug("restart_block: args %#llx %#llx %#llx %#llx %#llx\n",
| +		 hh->arg_0, hh->arg_1, hh->arg_2, hh->arg_3, hh->arg_4);
| +
| +	switch (hh->fn) {
| +	case CR_RESTART_BLOCK_NONE:
| +		restart_block.fn = do_no_restart_syscall;
| +		break;
| +	case CR_RESTART_BLOCK_HRTIMER_NANOSLEEP:
| +		clockid = hh->arg_0;
| +		if (clockid < 0 || invalid_clockid(clockid))
| +			break;
| +		restart_block.fn = hrtimer_nanosleep_restart;
| +		restart_block.nanosleep.index = clockid;
| +		restart_block.nanosleep.rmtp =
| +			(struct timespec __user *) (unsigned long) hh->arg_1;
| +		restart_block.nanosleep.expires = expire;
| +		break;
| +	case CR_RESTART_BLOCK_POSIX_CPU_NANOSLEEP:
| +		clockid = hh->arg_0;
| +		if (clockid < 0 || invalid_clockid(clockid))
| +			break;
| +		restart_block.fn = posix_cpu_nsleep_restart;
| +		restart_block.arg0 = clockid;
| +		restart_block.arg1 = hh->arg_1;
| +		ts = ns_to_timespec(expire);
| +		restart_block.arg2 = ts.tv_sec;
| +		restart_block.arg3 = ts.tv_nsec;
| +		break;
| +#ifdef CONFIG_COMPAT
| +	case CR_RESTART_BLOCK_COMPAT_NANOSLEEP:
| +		clockid = hh->arg_0;
| +		if (clockid < 0 || invalid_clockid(clockid))
| +			break;
| +		restart_block.fn = compat_nanosleep_restart;
| +		restart_block.nanosleep.index = clockid;
| +		restart_block.nanosleep.rmtp =
| +			(struct timespec __user *) (unsigned long) hh->arg_1;
| +		restart_block.nanosleep.compat_rmtp =
| +			(struct compat_timespec __user *)
| +				(unsigned long) hh->arg_2;
| +		resatrt_block.nanosleep.expires = expire;
| +		break;
| +	case CR_RESTART_BLOCK_COMPAT_CLOCK_NANOSLEEP:
| +		clockid = hh->arg_0;
| +		if (clockid < 0 || invalid_clockid(clockid))
| +			break;
| +		restart_block.fn = compat_clock_nanosleep_restart;
| +		restart_block.nanosleep.index = clockid;
| +		restart_block.nanosleep.rmtp =
| +			(struct timespec __user *) (unsigned long) hh->arg_1;
| +		restart_block.nanosleep.compat_rmtp =
| +			(struct compat_timespec __user *)
| +				(unsigned long) hh->arg_2;
| +		resatrt_block.nanosleep.expires = expire;
| +		break;
| +#endif
| +	case CR_RESTART_BLOCK_FUTEX:
| +		restart_block.fn = futex_wait_restart;
| +		restart_block.futex.uaddr = (u32 *) (unsigned long) hh->arg_0;
| +		restart_block.futex.val = hh->arg_1;
| +		restart_block.futex.flags = hh->arg_2;
| +		restart_block.futex.bitset = hh->arg_3;
| +		restart_block.futex.time = expire;
| +		break;
| +	case CR_RESTART_BLOCK_POLL:
| +		restart_block.fn = do_restart_poll;
| +		restart_block.poll.ufds =
| +			(struct pollfd __user *) (unsigned long) hh->arg_0;
| +		restart_block.poll.nfds = hh->arg_1;
| +		restart_block.poll.has_timeout = hh->arg_2;
| +		ts = ns_to_timespec(expire);
| +		restart_block.poll.tv_sec = ts.tv_sec;
| +		restart_block.poll.tv_nsec = ts.tv_nsec;
| +		break;
| +	default:
| +		break;
| +	}
| +
| +	if (restart_block.fn)
| +		task_thread_info(current)->restart_block = restart_block;
| +	else
| +		ret = -EINVAL;
| + out:
| +	cr_hbuf_put(ctx, sizeof(*hh));
| +	return ret;
| +}
| +
|  /* read the entire state of the current task */
|  int cr_read_task(struct cr_ctx *ctx)
|  {
| @@ -76,6 +188,5 @@ int cr_read_task(struct cr_ctx *ctx)
|  	ret = cr_read_cpu(ctx);
|  	cr_debug("cpu: ret %d\n", ret);
|   out:
| -
|  	return ret;
|  }
| diff --git a/checkpoint/sys.c b/checkpoint/sys.c
| index 8652c5c..863cb63 100644
| --- a/checkpoint/sys.c
| +++ b/checkpoint/sys.c
| @@ -186,6 +186,7 @@ static struct cr_ctx *cr_ctx_alloc(int fd, unsigned long flags)
|  		return ERR_PTR(-ENOMEM);
| 
|  	ctx->flags = flags;
| +	ctx->ktime_beg = ktime_get();
| 
|  	INIT_LIST_HEAD(&ctx->pgarr_list);
|  	INIT_LIST_HEAD(&ctx->pgarr_pool);
| @@ -203,6 +204,7 @@ static struct cr_ctx *cr_ctx_alloc(int fd, unsigned long flags)
|  	if (cr_objhash_alloc(ctx) < 0)
|  		goto err;
| 
| +
|  	return ctx;
| 
|   err:
| diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
| index 3a514fc..a94ce98 100644
| --- a/include/linux/checkpoint.h
| +++ b/include/linux/checkpoint.h
| @@ -18,6 +18,8 @@
|  struct cr_ctx {
|  	int crid;		/* unique checkpoint id */
| 
| +	ktime_t ktime_beg;	/* checkpoint start time */

Nit: spell out 'begin' fully ? :-) 

| +
|  	pid_t root_pid;		/* container identifier */
|  	struct task_struct *root_task;	/* container root task */
|  	struct nsproxy *root_nsproxy;	/* container root nsproxy */
| @@ -87,10 +89,12 @@ extern struct file *cr_read_open_fname(struct cr_ctx *ctx,
|  				       int flags, int mode);
| 
|  extern int cr_write_task(struct cr_ctx *ctx, struct task_struct *t);
| +extern int cr_write_restart_block(struct cr_ctx *ctx, struct task_struct *t);
|  extern int cr_write_mm(struct cr_ctx *ctx, struct task_struct *t);
|  extern int cr_write_fd_table(struct cr_ctx *ctx, struct task_struct *t);
| 
|  extern int cr_read_task(struct cr_ctx *ctx);
| +extern int cr_read_restart_block(struct cr_ctx *ctx);
|  extern int cr_read_mm(struct cr_ctx *ctx);
|  extern int cr_read_fd_table(struct cr_ctx *ctx);
| 
| diff --git a/include/linux/checkpoint_hdr.h b/include/linux/checkpoint_hdr.h
| index 30e649b..8821a30 100644
| --- a/include/linux/checkpoint_hdr.h
| +++ b/include/linux/checkpoint_hdr.h
| @@ -45,6 +45,7 @@ enum {
|  	CR_HDR_FNAME,
| 
|  	CR_HDR_TASK = 101,
| +	CR_HDR_RESTART_BLOCK,
|  	CR_HDR_THREAD,
|  	CR_HDR_CPU,
| 
| @@ -97,6 +98,25 @@ struct cr_hdr_task {
|  	__u32 task_comm_len;
|  } __attribute__((aligned(8)));
| 
| +struct cr_hdr_restart_block {
| +	__u64 fn;

Nit: This a function-type rather than the function itself ? A bit misleading
considering restart_block->fn refers to a function.

| +	__u64 arg_0;
| +	__u64 arg_1;
| +	__u64 arg_2;
| +	__u64 arg_3;
| +	__u64 arg_4;
| +} __attribute__((aligned(8)));
| +
| +enum restart_block_type {
| +	CR_RESTART_BLOCK_NONE = 1,
| +	CR_RESTART_BLOCK_HRTIMER_NANOSLEEP,
| +	CR_RESTART_BLOCK_POSIX_CPU_NANOSLEEP,
| +	CR_RESTART_BLOCK_COMPAT_NANOSLEEP,
| +	CR_RESTART_BLOCK_COMPAT_CLOCK_NANOSLEEP,
| +	CR_RESTART_BLOCK_POLL,
| +	CR_RESTART_BLOCK_FUTEX
| +};
| +
|  struct cr_hdr_mm {
|  	__s32 objref;		/* identifier for shared objects */
|  	__u32 map_count;
| -- 
| 1.5.4.3
| 
| _______________________________________________
| Containers mailing list
| Containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
| https://lists.linux-foundation.org/mailman/listinfo/containers

  parent reply	other threads:[~2009-04-16  6:02 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-07 12:27 [RFC v14-rc3][PATCH 00/36] Kernel based checkpoint/restart Oren Laadan
     [not found] ` <1239107264-21775-1-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 01/36] Create syscalls: sys_checkpoint, sys_restart Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 02/36] Checkpoint/restart: initial documentation Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 03/36] Make file_pos_read/write() public Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 04/36] General infrastructure for checkpoint restart Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 05/36] x86 support for checkpoint/restart Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 06/36] Dump memory address space Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 07/36] Restore " Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 08/36] Infrastructure for shared objects Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 09/36] Dump open file descriptors Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 10/36] actually use f_op in checkpoint code Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 11/36] add generic checkpoint f_op to ext fses Oren Laadan
     [not found]     ` <1239107264-21775-12-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-09  1:59       ` Serge E. Hallyn
     [not found]         ` <20090409015926.GA20112-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-09  2:29           ` Serge E. Hallyn
     [not found]             ` <20090409022940.GA22284-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-12  3:42               ` Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 12/36] Restore open file descriptors Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 13/36] External checkpoint of a task other than ourself Oren Laadan
     [not found]     ` <1239107264-21775-14-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-16  4:45       ` Sukadev Bhattiprolu
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 14/36] c/r of restart-blocks: export functionality used in next patch Oren Laadan
     [not found]     ` <1239107264-21775-15-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-09 21:07       ` Serge E. Hallyn
2009-04-16  5:00       ` Sukadev Bhattiprolu
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 15/36] c/r of restart-blocks Oren Laadan
     [not found]     ` <1239107264-21775-16-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 18:14       ` Dan Smith
     [not found]         ` <87r6042uwm.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-04-07 18:44           ` Oren Laadan
     [not found]             ` <49DB9F01.4050605-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-07 19:05               ` Dan Smith
     [not found]                 ` <87myas2sjr.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-04-08  2:24                   ` Oren Laadan
2009-04-16  6:02       ` Sukadev Bhattiprolu [this message]
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 16/36] Checkpoint multiple processes Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 17/36] Restart " Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 18/36] A new file type (CR_FD_OBJREF) for a file descriptor already setup Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 19/36] Checkpoint open pipes Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 20/36] Restore " Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 21/36] Record 'struct file' object instead of the file name for VMAs Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 22/36] Prepare to support shared memory Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 23/36] Dump anonymous- and file-mapped- " Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 24/36] Restore " Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 25/36] s390: Expose a constant for the number of words representing the CRs Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 26/36] c/r: Add CR_COPY() macro (v4) Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 27/36] s390: define s390-specific checkpoint-restart code (v7) Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 28/36] powerpc: provide APIs for validating and updating DABR Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 29/36] powerpc: checkpoint/restart implementation Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 30/36] powerpc: wire up checkpoint and restart syscalls Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 31/36] powerpc: enable checkpoint support in Kconfig Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 32/36] Export fs/exec.c:exec_mmap() Oren Laadan
     [not found]     ` <1239107264-21775-33-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-09 21:06       ` Serge E. Hallyn
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 33/36] Support for share memory address spaces Oren Laadan
     [not found]     ` <1239107264-21775-34-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-09 21:03       ` Serge E. Hallyn
     [not found]         ` <20090409210302.GA5115-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-09 22:13           ` Oren Laadan
     [not found]             ` <49DE72F7.9040001-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-09 22:52               ` Serge E. Hallyn
     [not found]                 ` <20090409225212.GA8386-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-09 23:17                   ` Oren Laadan
     [not found]                     ` <Pine.LNX.4.64.0904091912440.12600-CXF6herHY6ykSYb+qCZC/1i27PF6R63G9nwVQlTi/Pw@public.gmane.org>
2009-04-10  0:09                       ` Serge E. Hallyn
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 34/36] Make cr_may_checkpoint_task() check each namespace individually Oren Laadan
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 35/36] c/r: Add UTS support (v6) Oren Laadan
     [not found]     ` <1239107264-21775-36-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-09 21:17       ` Serge E. Hallyn
2009-04-07 12:27   ` [RFC v14-rc3][PATCH 36/36] Stub implementation of IPC namespace c/r Oren Laadan
     [not found]     ` <1239107264-21775-37-git-send-email-orenl-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-09 21:29       ` Serge E. Hallyn
     [not found]         ` <20090409212939.GD5115-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-12  3:46           ` Oren Laadan
     [not found]             ` <49E163FC.4080306-eQaUEPhvms7ENvBUuze7eA@public.gmane.org>
2009-04-13 14:10               ` Serge E. Hallyn
     [not found]                 ` <20090413141022.GA13007-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-04-13 14:23                   ` Dan Smith

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=20090416060220.GB14934@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