From: sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org
To: Oleg Nesterov <oleg-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
Cc: Linux Containers
<containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org>,
Pavel Emelyanov <xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
Subject: Re: [PATCH 14/15] Destroy pid namespace on init's death
Date: Mon, 30 Jul 2007 23:19:17 -0700 [thread overview]
Message-ID: <20070731061917.GB17013@us.ibm.com> (raw)
In-Reply-To: <20070730154639.GA127-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
Oleg Nesterov [oleg-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org] wrote:
| On 07/30, Pavel Emelyanov wrote:
| >
| > Oleg Nesterov wrote:
| > >>+
| > >>+ nfree = 0;
| > >>+ for (i = 0; i < PIDMAP_ENTRIES; i++)
| > >>+ nfree += atomic_read(&pid_ns->pidmap[i].nr_free);
| > >>+
| > >>+ /*
| > >>+ * If pidmap has entries for processes other than 0 and 1, retry.
| > >>+ */
| > >>+ if (nfree < (BITS_PER_PAGE * PIDMAP_ENTRIES - 2))
| > >>+ goto repeat;
| > >
| > >This doesn't look right.
| > >
| > >Suppose that some "struct pid" was pinned from the parent namespace.
| > >In that case zap_pid_ns_processes() will burn CPU until put_pid(), bad.
| >
| > Nope. struct pid can be pinned, but the pidmap "fingerprint" cannot.
|
| Heh. It was specially designed this way, but I managed to forget.
|
| You are right, thanks for correcting me.
|
| > So as soon as the release_task() is called the pidmap becomes free and
| > we can proceed.
|
| Well, it doesn't matter, but strictly speaking this is not true.
| release_task()->detach_pid(PIDTYPE_PID) doesn't necessary free pidmap,
| it could be "used" by other tasks as PGID/SID.
|
| > However I agree with the "burn CPU" issue - wait must sleep if needed.
| >
| > >I think we can rely on forget_original_child() and do something like
| > >this:
| > >
| > > zap_active_ns_processes(void)
| > > {
| > > // kill all tasks in our ns and below
| > > kill(-1, SIGKILL);
| >
| > That would be too slow to walk through all the tasks in a node searching
| > for a couple of them we need. fing_ge_pid() looks better to me.
|
| OK. I personally dislike the "retry" logic (and it is not safe if we want
| wait() to actually sleep waiting for the child), but we can do the "kill"
| loop under tasklist_lock.
|
| In any case, I don't think we should use next_pid() for wait(), or check
| pidmap[].nr_free,
|
| > > do {
| > > clear_thread_flag(TIF_SIGPENDING);
| > > } while (wait(NULL) != -ECHLD);
| > > }
|
| just wait for any child until -ECHLD. After that we can return safely.
Agree. Here is the modified patch. Hope this is better.
From: Pavel Emelyanov <xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
Subject: [PATCH 14/15] Destroy pid namespace on init's death
From: Sukadev Bhattiprolu <sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Terminate all processes in a namespace when the reaper of the namespace
is exiting. We do this by walking the pidmap of the namespace and sending
SIGKILL to all processes.
Changelog:
[Oleg Nesterov]: In zap_pid_ns_processes() wait for any child
rather than iterating over all pid_ts in the pidmap.
[Oleg Nesterov]: Must clear the TIF_SIGPENDING flag for
successive wait() calls.
Signed-off-by: Sukadev Bhattiprolu <sukadev-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Acked-by: Pavel Emelyanov <xemul-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
---
include/linux/pid.h | 1 +
include/linux/wait.h | 4 ++++
kernel/exit.c | 10 ++++++----
kernel/pid.c | 26 ++++++++++++++++++++++++++
4 files changed, 37 insertions(+), 4 deletions(-)
Index: lx26-23-rc1-mm1/include/linux/pid.h
===================================================================
--- lx26-23-rc1-mm1.orig/include/linux/pid.h 2007-07-26 20:08:16.000000000 -0700
+++ lx26-23-rc1-mm1/include/linux/pid.h 2007-07-26 20:08:16.000000000 -0700
@@ -118,6 +118,7 @@ extern struct pid *find_ge_pid(int nr, s
extern struct pid *alloc_pid(struct pid_namespace *ns);
extern void FASTCALL(free_pid(struct pid *pid));
+extern void zap_pid_ns_processes(struct pid_namespace *pid_ns);
/*
* the helpers to get the pid's id seen from different namespaces
Index: lx26-23-rc1-mm1/include/linux/wait.h
===================================================================
--- lx26-23-rc1-mm1.orig/include/linux/wait.h 2007-07-22 13:41:00.000000000 -0700
+++ lx26-23-rc1-mm1/include/linux/wait.h 2007-07-26 20:08:16.000000000 -0700
@@ -22,9 +22,13 @@
#include <linux/list.h>
#include <linux/stddef.h>
#include <linux/spinlock.h>
+#include <linux/resource.h>
+#include <asm/siginfo.h>
#include <asm/system.h>
#include <asm/current.h>
+long do_wait(pid_t pid, int options, struct siginfo __user *infop,
+ int __user *stat_addr, struct rusage __user *ru);
typedef struct __wait_queue wait_queue_t;
typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync, void *key);
int default_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
Index: lx26-23-rc1-mm1/kernel/exit.c
===================================================================
--- lx26-23-rc1-mm1.orig/kernel/exit.c 2007-07-26 20:08:16.000000000 -0700
+++ lx26-23-rc1-mm1/kernel/exit.c 2007-07-30 23:10:30.000000000 -0700
@@ -915,6 +915,7 @@ fastcall NORET_TYPE void do_exit(long co
{
struct task_struct *tsk = current;
int group_dead;
+ struct pid_namespace *pid_ns = tsk->nsproxy->pid_ns;
profile_task_exit(tsk);
@@ -925,9 +926,10 @@ fastcall NORET_TYPE void do_exit(long co
if (unlikely(!tsk->pid))
panic("Attempted to kill the idle task!");
if (unlikely(tsk == task_child_reaper(tsk))) {
- if (task_active_pid_ns(tsk) != &init_pid_ns)
- task_active_pid_ns(tsk)->child_reaper =
- init_pid_ns.child_reaper;
+ if (pid_ns != &init_pid_ns) {
+ zap_pid_ns_processes(pid_ns);
+ pid_ns->child_reaper = init_pid_ns.child_reaper;
+ }
else
panic("Attempted to kill init!");
}
@@ -1537,7 +1539,7 @@ static inline int my_ptrace_child(struct
return (p->parent != p->real_parent);
}
-static long do_wait(pid_t pid, int options, struct siginfo __user *infop,
+long do_wait(pid_t pid, int options, struct siginfo __user *infop,
int __user *stat_addr, struct rusage __user *ru)
{
DECLARE_WAITQUEUE(wait, current);
Index: lx26-23-rc1-mm1/kernel/pid.c
===================================================================
--- lx26-23-rc1-mm1.orig/kernel/pid.c 2007-07-26 20:08:16.000000000 -0700
+++ lx26-23-rc1-mm1/kernel/pid.c 2007-07-30 23:12:33.000000000 -0700
@@ -593,6 +593,32 @@ out:
return new_ns;
}
+void zap_pid_ns_processes(struct pid_namespace *pid_ns)
+{
+ int nr;
+ int rc;
+ int options = WEXITED|__WALL;
+
+ /*
+ * We know pid == 1 is terminating. Find remaining pid_ts
+ * in the namespace, signal them and then wait for them
+ * exit.
+ */
+ nr = next_pidmap(pid_ns, 1);
+ while (nr > 0) {
+ kill_proc_info(SIGKILL, SEND_SIG_PRIV, nr);
+ nr = next_pidmap(pid_ns, nr);
+ }
+
+ do {
+ clear_thread_flag(TIF_SIGPENDING);
+ rc = do_wait(-1, options, NULL, NULL, NULL);
+ } while (rc != -ECHILD);
+
+
+ return;
+}
+
static void do_free_pid_ns(struct work_struct *w)
{
struct pid_namespace *ns, *parent;
next prev parent reply other threads:[~2007-07-31 6:19 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-26 14:45 [RFC][PATCH 0/15] Pid namespaces Pavel Emelyanov
[not found] ` <46A8B37B.6050108-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-26 14:46 ` [PATCH 1/15] Move exit_task_namespaces() Pavel Emelyanov
[not found] ` <46A8B3C4.5080601-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-26 16:10 ` Dave Hansen
2007-07-27 6:38 ` Pavel Emelyanov
2007-07-26 16:47 ` Oleg Nesterov
[not found] ` <20070726164724.GA81-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-26 16:59 ` Kirill Korotaev
2007-07-27 8:07 ` Oleg Nesterov
[not found] ` <20070727080758.GA509-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-27 8:24 ` Pavel Emelyanov
[not found] ` <46A9ABC1.1000800-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-27 8:35 ` Oleg Nesterov
[not found] ` <20070727083541.GA528-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-27 8:37 ` Pavel Emelyanov
2007-08-02 16:20 ` Oleg Nesterov
[not found] ` <20070802162023.GB137-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-06 8:00 ` Pavel Emelyanov
[not found] ` <46B6D52C.3010405-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-08-06 9:54 ` Oleg Nesterov
[not found] ` <20070806095421.GA85-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-06 9:58 ` Pavel Emelyanov
[not found] ` <46B6F0DA.4080904-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-08-06 10:38 ` Oleg Nesterov
[not found] ` <20070806103838.GA129-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-06 11:21 ` Pavel Emelyanov
[not found] ` <46B7044A.4030508-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-08-06 12:54 ` Oleg Nesterov
[not found] ` <20070806125419.GB91-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-06 13:38 ` Pavel Emelyanov
2007-08-06 11:29 ` Pavel Emelyanov
[not found] ` <46B7060E.3020609-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-08-06 12:50 ` Oleg Nesterov
[not found] ` <20070806125032.GA91-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-06 13:36 ` Pavel Emelyanov
[not found] ` <46B723F3.8020905-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-08-06 13:57 ` Oleg Nesterov
2007-07-26 14:47 ` [PATCH 2/15] Introduce MS_KERNMOUNT flag Pavel Emelyanov
2007-07-26 14:48 ` [PATCH 3/15] kern_siginfo helper Pavel Emelyanov
[not found] ` <46A8B42F.5070605-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-29 11:41 ` Oleg Nesterov
[not found] ` <20070729114154.GE120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 6:07 ` Pavel Emelyanov
[not found] ` <46AD8032.90005-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-31 0:21 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2007-07-26 14:48 ` [PATCH 4/15] Make proc_flust_task() flush entries from multiple proc trees Pavel Emelyanov
2007-07-26 14:49 ` [PATCH 5/15] Introduce struct upid Pavel Emelyanov
[not found] ` <46A8B486.3030006-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-29 9:52 ` Oleg Nesterov
[not found] ` <20070729095210.GA120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 5:58 ` Pavel Emelyanov
2007-07-26 14:50 ` [PATCH 6/15] Make alloc_pid(), free_pid() and put_pid() work with " Pavel Emelyanov
[not found] ` <46A8B4AE.6040903-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-29 10:16 ` Oleg Nesterov
[not found] ` <20070729101651.GB120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 6:03 ` Pavel Emelyanov
2007-07-26 14:51 ` [PATCH 7/15] Helpers to obtain pid numbers Pavel Emelyanov
[not found] ` <46A8B4D6.1080301-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-26 19:03 ` Dave Hansen
2007-07-27 6:40 ` Pavel Emelyanov
2007-07-29 12:10 ` Oleg Nesterov
[not found] ` <20070729121051.GF120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 6:11 ` Pavel Emelyanov
2007-07-26 14:51 ` [PATCH 8/15] Helpers to find the task by its numerical ids Pavel Emelyanov
[not found] ` <46A8B502.8070606-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-26 19:05 ` Dave Hansen
2007-07-27 6:43 ` Pavel Emelyanov
2007-07-29 12:40 ` Oleg Nesterov
[not found] ` <20070729124045.GG120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 6:15 ` Pavel Emelyanov
2007-07-26 14:52 ` [PATCH 9/15] Move alloc_pid() after the namespace is cloned Pavel Emelyanov
[not found] ` <46A8B531.3050602-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-27 15:12 ` Oleg Nesterov
[not found] ` <20070727151238.GA336-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 6:17 ` Pavel Emelyanov
[not found] ` <46AD8266.8050802-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-30 23:43 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2007-07-31 5:49 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2007-07-26 14:54 ` [PATCH 10/15] Make each namespace has its own proc tree Pavel Emelyanov
[not found] ` <46A8B59E.7050009-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-26 17:38 ` Dave Hansen
2007-07-29 15:58 ` Oleg Nesterov
[not found] ` <20070729155841.GI120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-29 17:04 ` Oleg Nesterov
[not found] ` <20070729170436.GA941-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 6:45 ` Pavel Emelyanov
2007-07-30 6:43 ` Pavel Emelyanov
2007-07-26 14:55 ` [PATCH 11/15] Signal semantics Pavel Emelyanov
[not found] ` <46A8B5C7.9040407-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-27 12:31 ` Oleg Nesterov
[not found] ` <20070727123153.GA92-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-27 13:38 ` Pavel Emelyanov
[not found] ` <46A9F54B.5050000-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-27 18:46 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070727184604.GB1072-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-07-27 19:59 ` Serge E. Hallyn
[not found] ` <20070727195943.GA25878-6s5zFf/epYLPQpwDFJZrxKsjOiXwFzmk@public.gmane.org>
2007-07-27 20:23 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070727202337.GC1072-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-07-30 9:34 ` Pavel Emelyanov
2007-07-30 9:31 ` Pavel Emelyanov
[not found] ` <46ADB000.1000705-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-08-01 16:13 ` Serge E. Hallyn
[not found] ` <20070801161335.GA10747-6s5zFf/epYLPQpwDFJZrxKsjOiXwFzmk@public.gmane.org>
2007-08-02 8:35 ` Kirill Korotaev
[not found] ` <46B19754.4050908-3ImXcnM4P+0@public.gmane.org>
2007-08-02 20:09 ` Serge E. Hallyn
2007-07-29 11:25 ` Oleg Nesterov
2007-07-26 14:56 ` [PATCH 12/15] Miscelaneous stuff for pid namespaces Pavel Emelyanov
[not found] ` <46A8B601.4020108-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-27 6:22 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070727062213.GE23584-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-07-27 6:53 ` Pavel Emelyanov
2007-07-26 14:56 ` [PATCH 13/15] Clone the pid namespace Pavel Emelyanov
2007-07-26 14:57 ` [PATCH 14/15] Destroy pid namespace on init's death Pavel Emelyanov
[not found] ` <46A8B663.9040206-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-29 10:41 ` Oleg Nesterov
[not found] ` <20070729104145.GC120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 11:56 ` Pavel Emelyanov
[not found] ` <46ADD202.9030502-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-30 15:46 ` Oleg Nesterov
[not found] ` <20070730154639.GA127-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-31 6:19 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA [this message]
[not found] ` <20070731061917.GB17013-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-07-31 9:07 ` Oleg Nesterov
[not found] ` <20070731090721.GA110-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-01 6:16 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070801061616.GA5405-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-08-01 16:00 ` Dave Hansen
2007-08-01 19:51 ` Oleg Nesterov
[not found] ` <20070801195123.GB196-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-02 8:37 ` Kirill Korotaev
[not found] ` <46B197E3.3040309-3ImXcnM4P+0@public.gmane.org>
2007-08-02 16:08 ` Oleg Nesterov
[not found] ` <20070802160851.GA137-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-02 17:08 ` Oleg Nesterov
[not found] ` <20070802170820.GA2566-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-03 6:22 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070803062227.GA16833-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-08-03 10:55 ` Oleg Nesterov
[not found] ` <20070803105557.GA91-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-03 21:36 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2007-08-02 7:37 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
2007-08-01 19:48 ` Oleg Nesterov
[not found] ` <20070801194811.GA196-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-02 7:29 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070802072958.GA729-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-08-02 15:40 ` Oleg Nesterov
[not found] ` <20070802154018.GA93-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-02 17:20 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070802172033.GA8011-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-08-02 17:31 ` Oleg Nesterov
[not found] ` <20070802173128.GA2616-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-02 18:36 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070802183608.GB15332-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-08-02 18:49 ` Oleg Nesterov
[not found] ` <20070802184953.GA316-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-08-02 19:13 ` Serge E. Hallyn
2007-07-26 14:58 ` [PATCH 15/15] Hooks over the code to show correct values to user Pavel Emelyanov
[not found] ` <46A8B6AD.4000307-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-27 5:57 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070727055736.GC23584-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-07-27 6:44 ` Pavel Emelyanov
2007-07-29 14:31 ` Oleg Nesterov
[not found] ` <20070729143136.GH120-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org>
2007-07-30 6:49 ` Pavel Emelyanov
[not found] ` <46AD89E6.1030607-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2007-07-31 10:04 ` Oleg Nesterov
2007-07-27 4:22 ` [RFC][PATCH 0/15] Pid namespaces sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070727042213.GB23584-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-07-27 6:08 ` sukadev-r/Jw6+rmf7HQT0dZR+AlfA
[not found] ` <20070727060856.GD23584-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-07-27 6:47 ` Pavel Emelyanov
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=20070731061917.GB17013@us.ibm.com \
--to=sukadev-r/jw6+rmf7hqt0dzr+alfa@public.gmane.org \
--cc=containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org \
--cc=oleg-6lXkIZvqkOAvJsYlp49lxw@public.gmane.org \
--cc=xemul-GEFAQzZX7r8dnm+yROfE0A@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.