]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/s390/mm/fault.c
Merge branch 'reiserfs-updates' from Jeff Mahoney
[linux-2.6-omap-h63xx.git] / arch / s390 / mm / fault.c
index 2650f46001d098c5f04cee1ce5b11d7de3eaffb9..833e8366c351d08238466e21f660c66dc47e0845 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/hardirq.h>
 #include <linux/kprobes.h>
 #include <linux/uaccess.h>
+#include <linux/hugetlb.h>
 #include <asm/system.h>
 #include <asm/pgtable.h>
 #include <asm/s390_ext.h>
@@ -199,29 +200,6 @@ static void do_low_address(struct pt_regs *regs, unsigned long error_code)
        do_no_context(regs, error_code, 0);
 }
 
-/*
- * We ran out of memory, or some other thing happened to us that made
- * us unable to handle the page fault gracefully.
- */
-static int do_out_of_memory(struct pt_regs *regs, unsigned long error_code,
-                           unsigned long address)
-{
-       struct task_struct *tsk = current;
-       struct mm_struct *mm = tsk->mm;
-
-       up_read(&mm->mmap_sem);
-       if (is_global_init(tsk)) {
-               yield();
-               down_read(&mm->mmap_sem);
-               return 1;
-       }
-       printk("VM: killing process %s\n", tsk->comm);
-       if (regs->psw.mask & PSW_MASK_PSTATE)
-               do_group_exit(SIGKILL);
-       do_no_context(regs, error_code, address);
-       return 0;
-}
-
 static void do_sigbus(struct pt_regs *regs, unsigned long error_code,
                      unsigned long address)
 {
@@ -366,7 +344,8 @@ good_area:
                        goto bad_area;
        }
 
-survive:
+       if (is_vm_hugetlb_page(vma))
+               address &= HPAGE_MASK;
        /*
         * If for any reason at all we couldn't handle the fault,
         * make sure we exit gracefully rather than endlessly redo
@@ -375,8 +354,8 @@ survive:
        fault = handle_mm_fault(mm, vma, address, write);
        if (unlikely(fault & VM_FAULT_ERROR)) {
                if (fault & VM_FAULT_OOM) {
-                       if (do_out_of_memory(regs, error_code, address))
-                               goto survive;
+                       up_read(&mm->mmap_sem);
+                       pagefault_out_of_memory();
                        return;
                } else if (fault & VM_FAULT_SIGBUS) {
                        do_sigbus(regs, error_code, address);