Merge tag 'linux-kselftest-kunit-5.15-rc1' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / arch / alpha / mm / fault.c
index c2d7b6d..eee5102 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/interrupt.h>
 #include <linux/extable.h>
 #include <linux/uaccess.h>
+#include <linux/perf_event.h>
 
 extern void die_if_kernel(char *,struct pt_regs *,long, unsigned long *);
 
@@ -116,8 +117,9 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
 #endif
        if (user_mode(regs))
                flags |= FAULT_FLAG_USER;
+       perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
 retry:
-       down_read(&mm->mmap_sem);
+       mmap_read_lock(mm);
        vma = find_vma(mm, address);
        if (!vma)
                goto bad_area;
@@ -148,7 +150,7 @@ retry:
        /* If for any reason at all we couldn't handle the fault,
           make sure we exit gracefully rather than endlessly redo
           the fault.  */
-       fault = handle_mm_fault(vma, address, flags);
+       fault = handle_mm_fault(vma, address, flags, regs);
 
        if (fault_signal_pending(fault, regs))
                return;
@@ -164,14 +166,10 @@ retry:
        }
 
        if (flags & FAULT_FLAG_ALLOW_RETRY) {
-               if (fault & VM_FAULT_MAJOR)
-                       current->maj_flt++;
-               else
-                       current->min_flt++;
                if (fault & VM_FAULT_RETRY) {
                        flags |= FAULT_FLAG_TRIED;
 
-                        /* No need to up_read(&mm->mmap_sem) as we would
+                        /* No need to mmap_read_unlock(mm) as we would
                         * have already released it in __lock_page_or_retry
                         * in mm/filemap.c.
                         */
@@ -180,14 +178,14 @@ retry:
                }
        }
 
-       up_read(&mm->mmap_sem);
+       mmap_read_unlock(mm);
 
        return;
 
        /* Something tried to access memory that isn't in our memory map.
           Fix it, but check if it's kernel or user first.  */
  bad_area:
-       up_read(&mm->mmap_sem);
+       mmap_read_unlock(mm);
 
        if (user_mode(regs))
                goto do_sigsegv;
@@ -211,23 +209,23 @@ retry:
        /* We ran out of memory, or some other thing happened to us that
           made us unable to handle the page fault gracefully.  */
  out_of_memory:
-       up_read(&mm->mmap_sem);
+       mmap_read_unlock(mm);
        if (!user_mode(regs))
                goto no_context;
        pagefault_out_of_memory();
        return;
 
  do_sigbus:
-       up_read(&mm->mmap_sem);
+       mmap_read_unlock(mm);
        /* Send a sigbus, regardless of whether we were in kernel
           or user mode.  */
-       force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *) address, 0);
+       force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *) address);
        if (!user_mode(regs))
                goto no_context;
        return;
 
  do_sigsegv:
-       force_sig_fault(SIGSEGV, si_code, (void __user *) address, 0);
+       force_sig_fault(SIGSEGV, si_code, (void __user *) address);
        return;
 
 #ifdef CONFIG_ALPHA_LARGE_VMALLOC