Re: [PATCH] Introduce Vpid: in /proc/self/status

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 06/10/2011 11:46 AM, Greg Kurz wrote:
> Since pid namespaces were introduced, there's a recurring demand: how one
> can correlate a pid from a child pid ns with a pid from a parent pid ns ?
> The need arises in the LXC community when one wants to send a signal from
> the host (aka. init_pid_ns context) to a container process for which one
> only knows the pid inside the container.
> 
> In the future, this should be achievable thanks to Eric Biederman's setns()
> syscall but there's still some work to be done to support pid namespaces:
> 
> https://lkml.org/lkml/2011/5/21/162
> 
> As stated by Serge Hallyn in:
> 
> http://sourceforge.net/mailarchive/message.php?msg_id=27424447
> 
> "There is nothing that gives you a 100% guaranteed correct race-free
> correspondence right now.  You can look under /proc/<pid>/root/proc/ to
> see the pids valid in the container, and you can relate output of
> lxc-ps --forest to ps --forest output.  But nothing under /proc that I
> know of tells you "this task is the same as that task".  You can't
> even look at /proc/<pid> inode numbers since they are different
> filesystems for each proc mount."
> 
> This patch adds a single line to /proc/self/status. Provided one has kept
> track of its container tasks (with a cgroup like liblxc does for example),
> he may correlate global pids and container pids. This is still racy but
> definitely easier than what we have today.
> 
> Signed-off-by: Greg Kurz <gkurz@xxxxxxxxxx>

Acked-by: Cedric Le Goater <clg@xxxxxxxxxx>

Thanks,

C.

> ---
> 
>  fs/proc/array.c |    8 ++++++--
>  1 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/proc/array.c b/fs/proc/array.c
> index 5e4f776..f9db2a4 100644
> --- a/fs/proc/array.c
> +++ b/fs/proc/array.c
> @@ -165,7 +165,8 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
>  	int g;
>  	struct fdtable *fdt = NULL;
>  	const struct cred *cred;
> -	pid_t ppid, tpid;
> +	struct pid_namespace *pid_ns;
> +	pid_t ppid, tpid, vpid;
>  
>  	rcu_read_lock();
>  	ppid = pid_alive(p) ?
> @@ -176,6 +177,8 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
>  		if (tracer)
>  			tpid = task_pid_nr_ns(tracer, ns);
>  	}
> +	pid_ns = task_active_pid_ns(p);
> +	vpid = pid_ns ? task_pid_nr_ns(p, pid_ns) : 0;
>  	cred = get_task_cred(p);
>  	seq_printf(m,
>  		"State:\t%s\n"
> @@ -183,12 +186,13 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
>  		"Pid:\t%d\n"
>  		"PPid:\t%d\n"
>  		"TracerPid:\t%d\n"
> +		"VPid:\t%d\n"
>  		"Uid:\t%d\t%d\t%d\t%d\n"
>  		"Gid:\t%d\t%d\t%d\t%d\n",
>  		get_task_state(p),
>  		task_tgid_nr_ns(p, ns),
>  		pid_nr_ns(pid, ns),
> -		ppid, tpid,
> +		ppid, tpid, vpid,
>  		cred->uid, cred->euid, cred->suid, cred->fsuid,
>  		cred->gid, cred->egid, cred->sgid, cred->fsgid);
>  
> 

_______________________________________________
Containers mailing list
Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/containers


[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux