pid namespaces: define and use task_active_pid_ns() wrapper
With multiple pid namespaces, a process is known by some pid_t in every ancestor pid namespace. Every time the process forks, the child process also gets a pid_t in every ancestor pid namespace. While a process is visible in >=1 pid namespaces, it can see pid_t's in only one pid namespace. We call this pid namespace it's "active pid namespace", and it is always the youngest pid namespace in which the process is known. This patch defines and uses a wrapper to find the active pid namespace of a process. The implementation of the wrapper will be changed in when support for multiple pid namespaces are added. Changelog: 2.6.22-rc4-mm2-pidns1: - [Pavel Emelianov, Alexey Dobriyan] Back out the change to use task_active_pid_ns() in child_reaper() since task->nsproxy can be NULL during task exit (so child_reaper() continues to use init_pid_ns). to implement child_reaper() since init_pid_ns.child_reaper to implement child_reaper() since tsk->nsproxy can be NULL during exit. 2.6.21-rc6-mm1: - Rename task_pid_ns() to task_active_pid_ns() to reflect that a process can have multiple pid namespaces. Signed-off-by: Sukadev Bhattiprolu <sukadev@us.ibm.com> Acked-by: Pavel Emelianov <xemul@openvz.org> Cc: Eric W. Biederman <ebiederm@xmission.com> Cc: Cedric Le Goater <clg@fr.ibm.com> Cc: Dave Hansen <haveblue@us.ibm.com> Cc: Serge Hallyn <serue@us.ibm.com> Cc: Herbert Poetzel <herbert@13thfloor.at> Cc: Kirill Korotaev <dev@sw.ru> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
baf8f0f82d
commit
2894d650cd
|
@ -776,7 +776,7 @@ static int de_thread(struct task_struct *tsk)
|
||||||
* so it is safe to do it under read_lock.
|
* so it is safe to do it under read_lock.
|
||||||
*/
|
*/
|
||||||
if (unlikely(tsk->group_leader == child_reaper(tsk)))
|
if (unlikely(tsk->group_leader == child_reaper(tsk)))
|
||||||
tsk->nsproxy->pid_ns->child_reaper = tsk;
|
task_active_pid_ns(tsk)->child_reaper = tsk;
|
||||||
|
|
||||||
zap_other_threads(tsk);
|
zap_other_threads(tsk);
|
||||||
read_unlock(&tasklist_lock);
|
read_unlock(&tasklist_lock);
|
||||||
|
|
|
@ -91,7 +91,8 @@ static int loadavg_read_proc(char *page, char **start, off_t off,
|
||||||
LOAD_INT(a), LOAD_FRAC(a),
|
LOAD_INT(a), LOAD_FRAC(a),
|
||||||
LOAD_INT(b), LOAD_FRAC(b),
|
LOAD_INT(b), LOAD_FRAC(b),
|
||||||
LOAD_INT(c), LOAD_FRAC(c),
|
LOAD_INT(c), LOAD_FRAC(c),
|
||||||
nr_running(), nr_threads, current->nsproxy->pid_ns->last_pid);
|
nr_running(), nr_threads,
|
||||||
|
task_active_pid_ns(current)->last_pid);
|
||||||
return proc_calc_metrics(page, start, off, count, eof, len);
|
return proc_calc_metrics(page, start, off, count, eof, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,11 @@ static inline void put_pid_ns(struct pid_namespace *ns)
|
||||||
kref_put(&ns->kref, free_pid_ns);
|
kref_put(&ns->kref, free_pid_ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct pid_namespace *task_active_pid_ns(struct task_struct *tsk)
|
||||||
|
{
|
||||||
|
return tsk->nsproxy->pid_ns;
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct task_struct *child_reaper(struct task_struct *tsk)
|
static inline struct task_struct *child_reaper(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
return init_pid_ns.child_reaper;
|
return init_pid_ns.child_reaper;
|
||||||
|
|
|
@ -87,7 +87,7 @@ static struct nsproxy *create_new_namespaces(unsigned long flags,
|
||||||
goto out_ipc;
|
goto out_ipc;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_nsp->pid_ns = copy_pid_ns(flags, tsk->nsproxy->pid_ns);
|
new_nsp->pid_ns = copy_pid_ns(flags, task_active_pid_ns(tsk));
|
||||||
if (IS_ERR(new_nsp->pid_ns)) {
|
if (IS_ERR(new_nsp->pid_ns)) {
|
||||||
err = PTR_ERR(new_nsp->pid_ns);
|
err = PTR_ERR(new_nsp->pid_ns);
|
||||||
goto out_pid;
|
goto out_pid;
|
||||||
|
|
|
@ -214,7 +214,7 @@ struct pid *alloc_pid(void)
|
||||||
int nr = -1;
|
int nr = -1;
|
||||||
struct pid_namespace *ns;
|
struct pid_namespace *ns;
|
||||||
|
|
||||||
ns = current->nsproxy->pid_ns;
|
ns = task_active_pid_ns(current);
|
||||||
pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);
|
pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);
|
||||||
if (!pid)
|
if (!pid)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -364,7 +364,7 @@ struct pid *find_ge_pid(int nr)
|
||||||
pid = find_pid(nr);
|
pid = find_pid(nr);
|
||||||
if (pid)
|
if (pid)
|
||||||
break;
|
break;
|
||||||
nr = next_pidmap(current->nsproxy->pid_ns, nr);
|
nr = next_pidmap(task_active_pid_ns(current), nr);
|
||||||
} while (nr > 0);
|
} while (nr > 0);
|
||||||
|
|
||||||
return pid;
|
return pid;
|
||||||
|
|
Loading…
Reference in New Issue