aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSerge E. Hallyn <serue@us.ibm.com>2007-10-19 02:39:52 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-19 14:53:37 -0400
commitb460cbc581a53cc088ceba80608021dd49c63c43 (patch)
tree83c28d0adbc15f4157c77b40fa60c40a71cb8673 /arch
parent3743ca05ff464b8a9e345c08a6c9ce30485f9805 (diff)
pid namespaces: define is_global_init() and is_container_init()
is_init() is an ambiguous name for the pid==1 check. Split it into is_global_init() and is_container_init(). A cgroup init has it's tsk->pid == 1. A global init also has it's tsk->pid == 1 and it's active pid namespace is the init_pid_ns. But rather than check the active pid namespace, compare the task structure with 'init_pid_ns.child_reaper', which is initialized during boot to the /sbin/init process and never changes. Changelog: 2.6.22-rc4-mm2-pidns1: - Use 'init_pid_ns.child_reaper' to determine if a given task is the global init (/sbin/init) process. This would improve performance and remove dependence on the task_pid(). 2.6.21-mm2-pidns2: - [Sukadev Bhattiprolu] Changed is_container_init() calls in {powerpc, ppc,avr32}/traps.c for the _exception() call to is_global_init(). This way, we kill only the cgroup if the cgroup's init has a bug rather than force a kernel panic. [akpm@linux-foundation.org: fix comment] [sukadev@us.ibm.com: Use is_global_init() in arch/m32r/mm/fault.c] [bunk@stusta.de: kernel/pid.c: remove unused exports] [sukadev@us.ibm.com: Fix capability.c to work with threaded init] Signed-off-by: Serge E. Hallyn <serue@us.ibm.com> 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: 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>
Diffstat (limited to 'arch')
-rw-r--r--arch/alpha/mm/fault.c2
-rw-r--r--arch/arm/mm/fault.c2
-rw-r--r--arch/avr32/kernel/traps.c2
-rw-r--r--arch/avr32/mm/fault.c6
-rw-r--r--arch/ia64/mm/fault.c2
-rw-r--r--arch/m32r/mm/fault.c2
-rw-r--r--arch/m68k/mm/fault.c2
-rw-r--r--arch/mips/mm/fault.c2
-rw-r--r--arch/powerpc/kernel/traps.c2
-rw-r--r--arch/powerpc/mm/fault.c2
-rw-r--r--arch/powerpc/platforms/pseries/ras.c2
-rw-r--r--arch/ppc/kernel/traps.c2
-rw-r--r--arch/ppc/mm/fault.c2
-rw-r--r--arch/s390/lib/uaccess_pt.c2
-rw-r--r--arch/s390/mm/fault.c2
-rw-r--r--arch/sh/mm/fault.c2
-rw-r--r--arch/sh64/mm/fault.c6
-rw-r--r--arch/um/kernel/trap.c2
-rw-r--r--arch/x86/lib/usercopy_32.c2
-rw-r--r--arch/x86/mm/fault_32.c2
-rw-r--r--arch/x86/mm/fault_64.c2
-rw-r--r--arch/xtensa/mm/fault.c2
22 files changed, 26 insertions, 26 deletions
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c
index 25154df3055a..e0593e606140 100644
--- a/arch/alpha/mm/fault.c
+++ b/arch/alpha/mm/fault.c
@@ -188,7 +188,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
188 /* We ran out of memory, or some other thing happened to us that 188 /* We ran out of memory, or some other thing happened to us that
189 made us unable to handle the page fault gracefully. */ 189 made us unable to handle the page fault gracefully. */
190 out_of_memory: 190 out_of_memory:
191 if (is_init(current)) { 191 if (is_global_init(current)) {
192 yield(); 192 yield();
193 down_read(&mm->mmap_sem); 193 down_read(&mm->mmap_sem);
194 goto survive; 194 goto survive;
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index 59ed1d05b71b..a8a7dab757eb 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -197,7 +197,7 @@ survive:
197 return fault; 197 return fault;
198 198
199out_of_memory: 199out_of_memory:
200 if (!is_init(tsk)) 200 if (!is_global_init(tsk))
201 goto out; 201 goto out;
202 202
203 /* 203 /*
diff --git a/arch/avr32/kernel/traps.c b/arch/avr32/kernel/traps.c
index 9a73ce7eb50f..8a7caf8e7b45 100644
--- a/arch/avr32/kernel/traps.c
+++ b/arch/avr32/kernel/traps.c
@@ -89,7 +89,7 @@ void _exception(long signr, struct pt_regs *regs, int code,
89 * generate the same exception over and over again and we get 89 * generate the same exception over and over again and we get
90 * nowhere. Better to kill it and let the kernel panic. 90 * nowhere. Better to kill it and let the kernel panic.
91 */ 91 */
92 if (is_init(current)) { 92 if (is_global_init(current)) {
93 __sighandler_t handler; 93 __sighandler_t handler;
94 94
95 spin_lock_irq(&current->sighand->siglock); 95 spin_lock_irq(&current->sighand->siglock);
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c
index 11472f8701bd..6560cb18b4e3 100644
--- a/arch/avr32/mm/fault.c
+++ b/arch/avr32/mm/fault.c
@@ -160,7 +160,7 @@ bad_area:
160 if (exception_trace && printk_ratelimit()) 160 if (exception_trace && printk_ratelimit())
161 printk("%s%s[%d]: segfault at %08lx pc %08lx " 161 printk("%s%s[%d]: segfault at %08lx pc %08lx "
162 "sp %08lx ecr %lu\n", 162 "sp %08lx ecr %lu\n",
163 is_init(tsk) ? KERN_EMERG : KERN_INFO, 163 is_global_init(tsk) ? KERN_EMERG : KERN_INFO,
164 tsk->comm, tsk->pid, address, regs->pc, 164 tsk->comm, tsk->pid, address, regs->pc,
165 regs->sp, ecr); 165 regs->sp, ecr);
166 _exception(SIGSEGV, regs, code, address); 166 _exception(SIGSEGV, regs, code, address);
@@ -209,7 +209,7 @@ no_context:
209 */ 209 */
210out_of_memory: 210out_of_memory:
211 up_read(&mm->mmap_sem); 211 up_read(&mm->mmap_sem);
212 if (is_init(current)) { 212 if (is_global_init(current)) {
213 yield(); 213 yield();
214 down_read(&mm->mmap_sem); 214 down_read(&mm->mmap_sem);
215 goto survive; 215 goto survive;
@@ -231,7 +231,7 @@ do_sigbus:
231 if (exception_trace) 231 if (exception_trace)
232 printk("%s%s[%d]: bus error at %08lx pc %08lx " 232 printk("%s%s[%d]: bus error at %08lx pc %08lx "
233 "sp %08lx ecr %lu\n", 233 "sp %08lx ecr %lu\n",
234 is_init(tsk) ? KERN_EMERG : KERN_INFO, 234 is_global_init(tsk) ? KERN_EMERG : KERN_INFO,
235 tsk->comm, tsk->pid, address, regs->pc, 235 tsk->comm, tsk->pid, address, regs->pc,
236 regs->sp, ecr); 236 regs->sp, ecr);
237 237
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
index 32f26253c4e8..7571076a16a1 100644
--- a/arch/ia64/mm/fault.c
+++ b/arch/ia64/mm/fault.c
@@ -274,7 +274,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
274 274
275 out_of_memory: 275 out_of_memory:
276 up_read(&mm->mmap_sem); 276 up_read(&mm->mmap_sem);
277 if (is_init(current)) { 277 if (is_global_init(current)) {
278 yield(); 278 yield();
279 down_read(&mm->mmap_sem); 279 down_read(&mm->mmap_sem);
280 goto survive; 280 goto survive;
diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c
index 70a766aad3e0..4a71df4c1b30 100644
--- a/arch/m32r/mm/fault.c
+++ b/arch/m32r/mm/fault.c
@@ -271,7 +271,7 @@ no_context:
271 */ 271 */
272out_of_memory: 272out_of_memory:
273 up_read(&mm->mmap_sem); 273 up_read(&mm->mmap_sem);
274 if (is_init(tsk)) { 274 if (is_global_init(tsk)) {
275 yield(); 275 yield();
276 down_read(&mm->mmap_sem); 276 down_read(&mm->mmap_sem);
277 goto survive; 277 goto survive;
diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c
index eaa618681159..f493f03231d5 100644
--- a/arch/m68k/mm/fault.c
+++ b/arch/m68k/mm/fault.c
@@ -180,7 +180,7 @@ good_area:
180 */ 180 */
181out_of_memory: 181out_of_memory:
182 up_read(&mm->mmap_sem); 182 up_read(&mm->mmap_sem);
183 if (is_init(current)) { 183 if (is_global_init(current)) {
184 yield(); 184 yield();
185 down_read(&mm->mmap_sem); 185 down_read(&mm->mmap_sem);
186 goto survive; 186 goto survive;
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
index 5699c7713e2f..fa636fc6b7b9 100644
--- a/arch/mips/mm/fault.c
+++ b/arch/mips/mm/fault.c
@@ -173,7 +173,7 @@ no_context:
173 */ 173 */
174out_of_memory: 174out_of_memory:
175 up_read(&mm->mmap_sem); 175 up_read(&mm->mmap_sem);
176 if (is_init(tsk)) { 176 if (is_global_init(tsk)) {
177 yield(); 177 yield();
178 down_read(&mm->mmap_sem); 178 down_read(&mm->mmap_sem);
179 goto survive; 179 goto survive;
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index bf9e39c6e296..9fb4a6849c5a 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -201,7 +201,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
201 * generate the same exception over and over again and we get 201 * generate the same exception over and over again and we get
202 * nowhere. Better to kill it and let the kernel panic. 202 * nowhere. Better to kill it and let the kernel panic.
203 */ 203 */
204 if (is_init(current)) { 204 if (is_global_init(current)) {
205 __sighandler_t handler; 205 __sighandler_t handler;
206 206
207 spin_lock_irq(&current->sighand->siglock); 207 spin_lock_irq(&current->sighand->siglock);
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index ab3546c5ac3a..a18fda361cc0 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -375,7 +375,7 @@ bad_area_nosemaphore:
375 */ 375 */
376out_of_memory: 376out_of_memory:
377 up_read(&mm->mmap_sem); 377 up_read(&mm->mmap_sem);
378 if (is_init(current)) { 378 if (is_global_init(current)) {
379 yield(); 379 yield();
380 down_read(&mm->mmap_sem); 380 down_read(&mm->mmap_sem);
381 goto survive; 381 goto survive;
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 3a393c7f390e..a1ab25c7082f 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -332,7 +332,7 @@ static int recover_mce(struct pt_regs *regs, struct rtas_error_log * err)
332 err->disposition == RTAS_DISP_NOT_RECOVERED && 332 err->disposition == RTAS_DISP_NOT_RECOVERED &&
333 err->target == RTAS_TARGET_MEMORY && 333 err->target == RTAS_TARGET_MEMORY &&
334 err->type == RTAS_TYPE_ECC_UNCORR && 334 err->type == RTAS_TYPE_ECC_UNCORR &&
335 !(current->pid == 0 || is_init(current))) { 335 !(current->pid == 0 || is_global_init(current))) {
336 /* Kill off a user process with an ECC error */ 336 /* Kill off a user process with an ECC error */
337 printk(KERN_ERR "MCE: uncorrectable ecc error for pid %d\n", 337 printk(KERN_ERR "MCE: uncorrectable ecc error for pid %d\n",
338 current->pid); 338 current->pid);
diff --git a/arch/ppc/kernel/traps.c b/arch/ppc/kernel/traps.c
index 3f3b292eb773..c78568905c3b 100644
--- a/arch/ppc/kernel/traps.c
+++ b/arch/ppc/kernel/traps.c
@@ -121,7 +121,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
121 * generate the same exception over and over again and we get 121 * generate the same exception over and over again and we get
122 * nowhere. Better to kill it and let the kernel panic. 122 * nowhere. Better to kill it and let the kernel panic.
123 */ 123 */
124 if (is_init(current)) { 124 if (is_global_init(current)) {
125 __sighandler_t handler; 125 __sighandler_t handler;
126 126
127 spin_lock_irq(&current->sighand->siglock); 127 spin_lock_irq(&current->sighand->siglock);
diff --git a/arch/ppc/mm/fault.c b/arch/ppc/mm/fault.c
index 94913ddcf76e..254c23b755e6 100644
--- a/arch/ppc/mm/fault.c
+++ b/arch/ppc/mm/fault.c
@@ -290,7 +290,7 @@ bad_area:
290 */ 290 */
291out_of_memory: 291out_of_memory:
292 up_read(&mm->mmap_sem); 292 up_read(&mm->mmap_sem);
293 if (is_init(current)) { 293 if (is_global_init(current)) {
294 yield(); 294 yield();
295 down_read(&mm->mmap_sem); 295 down_read(&mm->mmap_sem);
296 goto survive; 296 goto survive;
diff --git a/arch/s390/lib/uaccess_pt.c b/arch/s390/lib/uaccess_pt.c
index 60604b2819b2..b159a9d65680 100644
--- a/arch/s390/lib/uaccess_pt.c
+++ b/arch/s390/lib/uaccess_pt.c
@@ -64,7 +64,7 @@ out:
64 64
65out_of_memory: 65out_of_memory:
66 up_read(&mm->mmap_sem); 66 up_read(&mm->mmap_sem);
67 if (is_init(current)) { 67 if (is_global_init(current)) {
68 yield(); 68 yield();
69 down_read(&mm->mmap_sem); 69 down_read(&mm->mmap_sem);
70 goto survive; 70 goto survive;
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index 14c241ccdd4d..2456b52ed068 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -211,7 +211,7 @@ static int do_out_of_memory(struct pt_regs *regs, unsigned long error_code,
211 struct mm_struct *mm = tsk->mm; 211 struct mm_struct *mm = tsk->mm;
212 212
213 up_read(&mm->mmap_sem); 213 up_read(&mm->mmap_sem);
214 if (is_init(tsk)) { 214 if (is_global_init(tsk)) {
215 yield(); 215 yield();
216 down_read(&mm->mmap_sem); 216 down_read(&mm->mmap_sem);
217 return 1; 217 return 1;
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c
index 4729668ce5bf..f33cedb353fc 100644
--- a/arch/sh/mm/fault.c
+++ b/arch/sh/mm/fault.c
@@ -207,7 +207,7 @@ no_context:
207 */ 207 */
208out_of_memory: 208out_of_memory:
209 up_read(&mm->mmap_sem); 209 up_read(&mm->mmap_sem);
210 if (is_init(current)) { 210 if (is_global_init(current)) {
211 yield(); 211 yield();
212 down_read(&mm->mmap_sem); 212 down_read(&mm->mmap_sem);
213 goto survive; 213 goto survive;
diff --git a/arch/sh64/mm/fault.c b/arch/sh64/mm/fault.c
index dd81c669c79b..7aea586fc3d0 100644
--- a/arch/sh64/mm/fault.c
+++ b/arch/sh64/mm/fault.c
@@ -278,7 +278,7 @@ bad_area:
278 show_regs(regs); 278 show_regs(regs);
279#endif 279#endif
280 } 280 }
281 if (is_init(tsk)) { 281 if (is_global_init(tsk)) {
282 panic("INIT had user mode bad_area\n"); 282 panic("INIT had user mode bad_area\n");
283 } 283 }
284 tsk->thread.address = address; 284 tsk->thread.address = address;
@@ -320,14 +320,14 @@ no_context:
320 * us unable to handle the page fault gracefully. 320 * us unable to handle the page fault gracefully.
321 */ 321 */
322out_of_memory: 322out_of_memory:
323 if (is_init(current)) { 323 if (is_global_init(current)) {
324 panic("INIT out of memory\n"); 324 panic("INIT out of memory\n");
325 yield(); 325 yield();
326 goto survive; 326 goto survive;
327 } 327 }
328 printk("fault:Out of memory\n"); 328 printk("fault:Out of memory\n");
329 up_read(&mm->mmap_sem); 329 up_read(&mm->mmap_sem);
330 if (is_init(current)) { 330 if (is_global_init(current)) {
331 yield(); 331 yield();
332 down_read(&mm->mmap_sem); 332 down_read(&mm->mmap_sem);
333 goto survive; 333 goto survive;
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
index bd060551e619..cb3321f8e0a9 100644
--- a/arch/um/kernel/trap.c
+++ b/arch/um/kernel/trap.c
@@ -108,7 +108,7 @@ out_nosemaphore:
108 * us unable to handle the page fault gracefully. 108 * us unable to handle the page fault gracefully.
109 */ 109 */
110out_of_memory: 110out_of_memory:
111 if (is_init(current)) { 111 if (is_global_init(current)) {
112 up_read(&mm->mmap_sem); 112 up_read(&mm->mmap_sem);
113 yield(); 113 yield();
114 down_read(&mm->mmap_sem); 114 down_read(&mm->mmap_sem);
diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c
index 9f38b12b4af1..8bab2b2efaff 100644
--- a/arch/x86/lib/usercopy_32.c
+++ b/arch/x86/lib/usercopy_32.c
@@ -748,7 +748,7 @@ survive:
748 retval = get_user_pages(current, current->mm, 748 retval = get_user_pages(current, current->mm,
749 (unsigned long )to, 1, 1, 0, &pg, NULL); 749 (unsigned long )to, 1, 1, 0, &pg, NULL);
750 750
751 if (retval == -ENOMEM && is_init(current)) { 751 if (retval == -ENOMEM && is_global_init(current)) {
752 up_read(&current->mm->mmap_sem); 752 up_read(&current->mm->mmap_sem);
753 congestion_wait(WRITE, HZ/50); 753 congestion_wait(WRITE, HZ/50);
754 goto survive; 754 goto survive;
diff --git a/arch/x86/mm/fault_32.c b/arch/x86/mm/fault_32.c
index 6555c3d14371..4fc5e400cf0a 100644
--- a/arch/x86/mm/fault_32.c
+++ b/arch/x86/mm/fault_32.c
@@ -587,7 +587,7 @@ no_context:
587 */ 587 */
588out_of_memory: 588out_of_memory:
589 up_read(&mm->mmap_sem); 589 up_read(&mm->mmap_sem);
590 if (is_init(tsk)) { 590 if (is_global_init(tsk)) {
591 yield(); 591 yield();
592 down_read(&mm->mmap_sem); 592 down_read(&mm->mmap_sem);
593 goto survive; 593 goto survive;
diff --git a/arch/x86/mm/fault_64.c b/arch/x86/mm/fault_64.c
index 5e0e54906c48..5149ac136a5d 100644
--- a/arch/x86/mm/fault_64.c
+++ b/arch/x86/mm/fault_64.c
@@ -554,7 +554,7 @@ no_context:
554 */ 554 */
555out_of_memory: 555out_of_memory:
556 up_read(&mm->mmap_sem); 556 up_read(&mm->mmap_sem);
557 if (is_init(current)) { 557 if (is_global_init(current)) {
558 yield(); 558 yield();
559 goto again; 559 goto again;
560 } 560 }
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c
index 2f842859948f..33f366be323f 100644
--- a/arch/xtensa/mm/fault.c
+++ b/arch/xtensa/mm/fault.c
@@ -145,7 +145,7 @@ bad_area:
145 */ 145 */
146out_of_memory: 146out_of_memory:
147 up_read(&mm->mmap_sem); 147 up_read(&mm->mmap_sem);
148 if (is_init(current)) { 148 if (is_global_init(current)) {
149 yield(); 149 yield();
150 down_read(&mm->mmap_sem); 150 down_read(&mm->mmap_sem);
151 goto survive; 151 goto survive;