]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
x86/mm: unify init task OOM handling
authorIngo Molnar <mingo@elte.hu>
Mon, 13 Oct 2008 15:49:02 +0000 (17:49 +0200)
committerIngo Molnar <mingo@elte.hu>
Mon, 13 Oct 2008 16:11:13 +0000 (18:11 +0200)
Linus noticed that the "again:" versus "survive:" OOM logic for
the init task was arbitrarily different.

The 64-bit codepath is the better one, because it correctly re-lookups
the vma after having dropped the ->mmap_sem.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/mm/fault.c

index ac2ad781da00390fb12debd4bed8d972ec75ba92..8bc5956e1af46476bbe6b96fc71c04c7de8923ce 100644 (file)
@@ -671,7 +671,8 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
                goto bad_area_nosemaphore;
 
 again:
-       /* When running in the kernel we expect faults to occur only to
+       /*
+        * When running in the kernel we expect faults to occur only to
         * addresses in user space.  All other faults represent errors in the
         * kernel and should generate an OOPS.  Unfortunately, in the case of an
         * erroneous fault occurring in a code path which already holds mmap_sem
@@ -734,9 +735,6 @@ good_area:
                        goto bad_area;
        }
 
-#ifdef CONFIG_X86_32
-survive:
-#endif
        /*
         * If for any reason at all we couldn't handle the fault,
         * make sure we exit gracefully rather than endlessly redo
@@ -871,12 +869,11 @@ out_of_memory:
        up_read(&mm->mmap_sem);
        if (is_global_init(tsk)) {
                yield();
-#ifdef CONFIG_X86_32
-               down_read(&mm->mmap_sem);
-               goto survive;
-#else
+               /*
+                * Re-lookup the vma - in theory the vma tree might
+                * have changed:
+                */
                goto again;
-#endif
        }
 
        printk("VM: killing process %s\n", tsk->comm);