ARC: mm: use SCRATCH_DATA0 register for caching pgdir in ARCv2 only
[linux-2.6-microblaze.git] / arch / arc / mm / fault.c
index 72f5405..41f1543 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/kdebug.h>
 #include <linux/perf_event.h>
 #include <linux/mm_types.h>
-#include <asm/pgalloc.h>
 #include <asm/mmu.h>
 
 /*
@@ -34,7 +33,7 @@ noinline static int handle_kernel_vaddr_fault(unsigned long address)
        pud_t *pud, *pud_k;
        pmd_t *pmd, *pmd_k;
 
-       pgd = pgd_offset_fast(current->active_mm, address);
+       pgd = pgd_offset(current->active_mm, address);
        pgd_k = pgd_offset_k(address);
 
        if (!pgd_present(*pgd_k))
@@ -106,6 +105,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
        if (write)
                flags |= FAULT_FLAG_WRITE;
 
+       perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
 retry:
        mmap_read_lock(mm);
 
@@ -131,7 +131,7 @@ retry:
                goto bad_area;
        }
 
-       fault = handle_mm_fault(vma, address, flags);
+       fault = handle_mm_fault(vma, address, flags, regs);
 
        /* Quick path to respond to signals */
        if (fault_signal_pending(fault, regs)) {
@@ -156,22 +156,9 @@ bad_area:
         * Major/minor page fault accounting
         * (in case of retry we only land here once)
         */
-       perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
-
-       if (likely(!(fault & VM_FAULT_ERROR))) {
-               if (fault & VM_FAULT_MAJOR) {
-                       tsk->maj_flt++;
-                       perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1,
-                                     regs, address);
-               } else {
-                       tsk->min_flt++;
-                       perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1,
-                                     regs, address);
-               }
-
+       if (likely(!(fault & VM_FAULT_ERROR)))
                /* Normal return path: fault Handled Gracefully */
                return;
-       }
 
        if (!user_mode(regs))
                goto no_context;