Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 43638
b: refs/heads/master
c: 84d7378
h: refs/heads/master
v: v3
  • Loading branch information
Sukadev Bhattiprolu authored and Linus Torvalds committed Dec 8, 2006
1 parent 78ea929 commit 94c837a
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6cc1b22a4acef3816eaa5f8c227d93d749b23195
refs/heads/master: 84d737866e2babdeab0c6b18ea155c6a649663b8
5 changes: 3 additions & 2 deletions trunk/fs/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include <linux/binfmts.h>
#include <linux/swap.h>
#include <linux/utsname.h>
#include <linux/pid_namespace.h>
#include <linux/module.h>
#include <linux/namei.h>
#include <linux/proc_fs.h>
Expand Down Expand Up @@ -620,8 +621,8 @@ static int de_thread(struct task_struct *tsk)
* Reparenting needs write_lock on tasklist_lock,
* so it is safe to do it under read_lock.
*/
if (unlikely(tsk->group_leader == child_reaper))
child_reaper = tsk;
if (unlikely(tsk->group_leader == child_reaper(tsk)))
tsk->nsproxy->pid_ns->child_reaper = tsk;

zap_other_threads(tsk);
read_unlock(&tasklist_lock);
Expand Down
5 changes: 3 additions & 2 deletions trunk/include/linux/pid.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ enum pid_type
*
* Holding a reference to struct pid solves both of these problems.
* It is small so holding a reference does not consume a lot of
* resources, and since a new struct pid is allocated when the numeric
* pid value is reused we don't mistakenly refer to new processes.
* resources, and since a new struct pid is allocated when the numeric pid
* value is reused (when pids wrap around) we don't mistakenly refer to new
* processes.
*/

struct pid
Expand Down
6 changes: 6 additions & 0 deletions trunk/include/linux/pid_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ struct pid_namespace {
struct kref kref;
struct pidmap pidmap[PIDMAP_ENTRIES];
int last_pid;
struct task_struct *child_reaper;
};

extern struct pid_namespace init_pid_ns;
Expand All @@ -36,4 +37,9 @@ static inline void put_pid_ns(struct pid_namespace *ns)
kref_put(&ns->kref, free_pid_ns);
}

static inline struct task_struct *child_reaper(struct task_struct *tsk)
{
return tsk->nsproxy->pid_ns->child_reaper;
}

#endif /* _LINUX_PID_NS_H */
1 change: 0 additions & 1 deletion trunk/include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -1400,7 +1400,6 @@ extern NORET_TYPE void do_group_exit(int);
extern void daemonize(const char *, ...);
extern int allow_signal(int);
extern int disallow_signal(int);
extern struct task_struct *child_reaper;

extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *);
extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *);
Expand Down
5 changes: 2 additions & 3 deletions trunk/init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
#include <linux/debug_locks.h>
#include <linux/lockdep.h>
#include <linux/utsrelease.h>
#include <linux/pid_namespace.h>
#include <linux/compile.h>

#include <asm/io.h>
Expand Down Expand Up @@ -626,8 +627,6 @@ static int __init initcall_debug_setup(char *str)
}
__setup("initcall_debug", initcall_debug_setup);

struct task_struct *child_reaper = &init_task;

extern initcall_t __initcall_start[], __initcall_end[];

static void __init do_initcalls(void)
Expand Down Expand Up @@ -727,7 +726,7 @@ static int init(void * unused)
* assumptions about where in the task array this
* can be found.
*/
child_reaper = current;
init_pid_ns.child_reaper = current;

cad_pid = task_pid(current);

Expand Down
23 changes: 15 additions & 8 deletions trunk/kernel/exit.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <linux/file.h>
#include <linux/binfmts.h>
#include <linux/nsproxy.h>
#include <linux/pid_namespace.h>
#include <linux/ptrace.h>
#include <linux/profile.h>
#include <linux/mount.h>
Expand All @@ -48,7 +49,6 @@
#include <asm/mmu_context.h>

extern void sem_exit (void);
extern struct task_struct *child_reaper;

static void exit_mm(struct task_struct * tsk);

Expand Down Expand Up @@ -260,7 +260,8 @@ static int has_stopped_jobs(int pgrp)
}

/**
* reparent_to_init - Reparent the calling kernel thread to the init task.
* reparent_to_init - Reparent the calling kernel thread to the init task
* of the pid space that the thread belongs to.
*
* If a kernel thread is launched as a result of a system call, or if
* it ever exits, it should generally reparent itself to init so that
Expand All @@ -278,8 +279,8 @@ static void reparent_to_init(void)
ptrace_unlink(current);
/* Reparent to init */
remove_parent(current);
current->parent = child_reaper;
current->real_parent = child_reaper;
current->parent = child_reaper(current);
current->real_parent = child_reaper(current);
add_parent(current);

/* Set the exit signal to SIGCHLD so we signal init on exit */
Expand Down Expand Up @@ -662,7 +663,8 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced)
* When we die, we re-parent all our children.
* Try to give them to another thread in our thread
* group, and if no such member exists, give it to
* the global child reaper process (ie "init")
* the child reaper process (ie "init") in our pid
* space.
*/
static void
forget_original_parent(struct task_struct *father, struct list_head *to_release)
Expand All @@ -673,7 +675,7 @@ forget_original_parent(struct task_struct *father, struct list_head *to_release)
do {
reaper = next_thread(reaper);
if (reaper == father) {
reaper = child_reaper;
reaper = child_reaper(father);
break;
}
} while (reaper->exit_state);
Expand Down Expand Up @@ -859,8 +861,13 @@ fastcall NORET_TYPE void do_exit(long code)
panic("Aiee, killing interrupt handler!");
if (unlikely(!tsk->pid))
panic("Attempted to kill the idle task!");
if (unlikely(tsk == child_reaper))
panic("Attempted to kill init!");
if (unlikely(tsk == child_reaper(tsk))) {
if (tsk->nsproxy->pid_ns != &init_pid_ns)
tsk->nsproxy->pid_ns->child_reaper = init_pid_ns.child_reaper;
else
panic("Attempted to kill init!");
}


if (unlikely(current->ptrace & PT_TRACE_EXIT)) {
current->ptrace_message = code;
Expand Down
3 changes: 2 additions & 1 deletion trunk/kernel/pid.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ struct pid_namespace init_pid_ns = {
.pidmap = {
[ 0 ... PIDMAP_ENTRIES-1] = { ATOMIC_INIT(BITS_PER_PAGE), NULL }
},
.last_pid = 0
.last_pid = 0,
.child_reaper = &init_task
};

/*
Expand Down
11 changes: 9 additions & 2 deletions trunk/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
#include <linux/signal.h>
#include <linux/capability.h>
#include <linux/freezer.h>
#include <linux/pid_namespace.h>
#include <linux/nsproxy.h>

#include <asm/param.h>
#include <asm/uaccess.h>
#include <asm/unistd.h>
Expand Down Expand Up @@ -1877,8 +1880,12 @@ int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
if (sig_kernel_ignore(signr)) /* Default is nothing. */
continue;

/* Init gets no signals it doesn't want. */
if (current == child_reaper)
/*
* Init of a pid space gets no signals it doesn't want from
* within that pid space. It can of course get signals from
* its parent pid space.
*/
if (current == child_reaper(current))
continue;

if (sig_kernel_stop(signr)) {
Expand Down

0 comments on commit 94c837a

Please sign in to comment.