From: Davidlohr Bueso <d...@stgolabs.net>

This becomes quite straightforward with the mmrange in place.

Signed-off-by: Davidlohr Bueso <dbu...@suse.de>
---
 arch/parisc/kernel/traps.c | 7 ++++---
 arch/parisc/mm/fault.c     | 8 ++++----
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
index c919e6c0a687..ac73697c7952 100644
--- a/arch/parisc/kernel/traps.c
+++ b/arch/parisc/kernel/traps.c
@@ -718,8 +718,9 @@ void notrace handle_interruption(int code, struct pt_regs 
*regs)
 
                if (user_mode(regs)) {
                        struct vm_area_struct *vma;
+                       DEFINE_RANGE_LOCK_FULL(mmrange);
 
-                       down_read(&current->mm->mmap_sem);
+                       mm_read_lock(current->mm, &mmrange);
                        vma = find_vma(current->mm,regs->iaoq[0]);
                        if (vma && (regs->iaoq[0] >= vma->vm_start)
                                && (vma->vm_flags & VM_EXEC)) {
@@ -727,10 +728,10 @@ void notrace handle_interruption(int code, struct pt_regs 
*regs)
                                fault_address = regs->iaoq[0];
                                fault_space = regs->iasq[0];
 
-                               up_read(&current->mm->mmap_sem);
+                               mm_read_unlock(current->mm, &mmrange);
                                break; /* call do_page_fault() */
                        }
-                       up_read(&current->mm->mmap_sem);
+                       mm_read_unlock(current->mm, &mmrange);
                }
                /* Fall Through */
        case 27: 
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
index 79db33a0cb0c..f4877e321c28 100644
--- a/arch/parisc/mm/fault.c
+++ b/arch/parisc/mm/fault.c
@@ -282,7 +282,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
        if (acc_type & VM_WRITE)
                flags |= FAULT_FLAG_WRITE;
 retry:
-       down_read(&mm->mmap_sem);
+       mm_read_lock(mm, &mmrange);
        vma = find_vma_prev(mm, address, &prev_vma);
        if (!vma || address < vma->vm_start)
                goto check_expansion;
@@ -339,7 +339,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
                        goto retry;
                }
        }
-       up_read(&mm->mmap_sem);
+       mm_read_unlock(mm, &mmrange);
        return;
 
 check_expansion:
@@ -351,7 +351,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
  * Something tried to access memory that isn't in our memory map..
  */
 bad_area:
-       up_read(&mm->mmap_sem);
+       mm_read_unlock(mm, &mmrange);
 
        if (user_mode(regs)) {
                struct siginfo si;
@@ -427,7 +427,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
        parisc_terminate("Bad Address (null pointer deref?)", regs, code, 
address);
 
   out_of_memory:
-       up_read(&mm->mmap_sem);
+       mm_read_unlock(mm, &mmrange);
        if (!user_mode(regs))
                goto no_context;
        pagefault_out_of_memory();
-- 
2.13.6

Reply via email to