]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - arch/alpha/mm/fault.c
During VM oom condition, kill all threads in process group
[linux-2.6.git] / arch / alpha / mm / fault.c
index 8aa9db834c11551afc1462bf970d2dbc0ab8a157..25154df3055abf7a501db5b5b00255d0bcbb410e 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/ptrace.h>
 #include <linux/mman.h>
 #include <linux/smp.h>
-#include <linux/smp_lock.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
 
@@ -149,21 +148,17 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
           the fault.  */
        fault = handle_mm_fault(mm, vma, address, cause > 0);
        up_read(&mm->mmap_sem);
-
-       switch (fault) {
-             case VM_FAULT_MINOR:
-               current->min_flt++;
-               break;
-             case VM_FAULT_MAJOR:
-               current->maj_flt++;
-               break;
-             case VM_FAULT_SIGBUS:
-               goto do_sigbus;
-             case VM_FAULT_OOM:
-               goto out_of_memory;
-             default:
+       if (unlikely(fault & VM_FAULT_ERROR)) {
+               if (fault & VM_FAULT_OOM)
+                       goto out_of_memory;
+               else if (fault & VM_FAULT_SIGBUS)
+                       goto do_sigbus;
                BUG();
        }
+       if (fault & VM_FAULT_MAJOR)
+               current->maj_flt++;
+       else
+               current->min_flt++;
        return;
 
        /* Something tried to access memory that isn't in our memory map.
@@ -202,7 +197,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
               current->comm, current->pid);
        if (!user_mode(regs))
                goto no_context;
-       do_exit(SIGKILL);
+       do_group_exit(SIGKILL);
 
  do_sigbus:
        /* Send a sigbus, regardless of whether we were in kernel