BACKPORT: mmap locking API: use coccinelle to convert mmap_sem rwsem call sites

This change converts the existing mmap_sem rwsem calls to use the new mmap
locking API instead.

The change is generated using coccinelle with the following rule:

// spatch --sp-file mmap_lock_api.cocci --in-place --include-headers --dir .

@@
expression mm;
@@
(
-init_rwsem
+mmap_init_lock
|
-down_write
+mmap_write_lock
|
-down_write_killable
+mmap_write_lock_killable
|
-down_write_trylock
+mmap_write_trylock
|
-up_write
+mmap_write_unlock
|
-downgrade_write
+mmap_write_downgrade
|
-down_read
+mmap_read_lock
|
-down_read_killable
+mmap_read_lock_killable
|
-down_read_trylock
+mmap_read_trylock
|
-up_read
+mmap_read_unlock
)
-(&mm->mmap_sem)
+(mm)

Change-Id: If729000ea8cedab7079ccc1350db26ed71f0df92
Signed-off-by: Michel Lespinasse <walken@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Reviewed-by: Laurent Dufour <ldufour@linux.ibm.com>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Davidlohr Bueso <dbueso@suse.de>
Cc: David Rientjes <rientjes@google.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Jerome Glisse <jglisse@redhat.com>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Liam Howlett <Liam.Howlett@oracle.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ying Han <yinghan@google.com>
Link: http://lkml.kernel.org/r/20200520052908.204642-5-walken@google.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Michel Lespinasse authored and Thomas Turner committed 2025-09-30 21:35:03 +01:00
1 parent fee2a623e1
commit e680cd14cc
156 files changed
+696 -696

No files matched your search

+2 -2
View File
@@ -957,12 +957,12 @@ give_sigsegv:
si_code = SEGV_ACCERR;
else {
struct mm_struct *mm = current->mm;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
if (find_vma(mm, (unsigned long)va))
si_code = SEGV_ACCERR;
else
si_code = SEGV_MAPERR;
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
}
send_sig_fault(SIGSEGV, si_code, va, 0, current);
return;
+5 -5
View File
@@ -117,7 +117,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
if (user_mode(regs))
flags |= FAULT_FLAG_USER;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
goto bad_area;
@@ -180,14 +180,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,14 +211,14 @@ 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, current);
+2 -2
View File
@@ -91,10 +91,10 @@ fault:
if (unlikely(ret != -EFAULT))
goto fail;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
ret = fixup_user_fault(current, current->mm, (unsigned long) uaddr,
FAULT_FLAG_WRITE, NULL);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (likely(!ret))
goto again;
+2 -2
View File
@@ -91,7 +91,7 @@ static void show_faulting_vma(unsigned long address)
/* can't use print_vma_addr() yet as it doesn't check for
* non-inclusive vma
*/
down_read(&active_mm->mmap_sem);
mmap_read_lock(active_mm);
vma = find_vma(active_mm, address);
/* check against the find_vma( ) behaviour which returns the next VMA
@@ -114,7 +114,7 @@ static void show_faulting_vma(unsigned long address)
} else
pr_info(" @No matching VMA found\n");
up_read(&active_mm->mmap_sem);
mmap_read_unlock(active_mm);
}
static void show_ecr_verbose(struct pt_regs *regs)
+5 -5
View File
@@ -99,7 +99,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
if (user_mode(regs))
flags |= FAULT_FLAG_USER;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
goto bad_area;
@@ -175,7 +175,7 @@ good_area:
}
/* Fault Handled Gracefully */
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
}
@@ -194,7 +194,7 @@ good_area:
* Fix it, but check if it's kernel or user first..
*/
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/* User mode accesses just cause a SIGSEGV */
if (user_mode(regs)) {
@@ -218,7 +218,7 @@ no_context:
die("Oops", regs, address);
out_of_memory:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (user_mode(regs)) {
pagefault_out_of_memory();
@@ -228,7 +228,7 @@ out_of_memory:
goto no_context;
do_sigbus:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (!user_mode(regs))
goto no_context;
+2 -2
View File
@@ -435,7 +435,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
npages = 1; /* for sigpage */
npages += vdso_total_pages;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
hint = sigpage_addr(mm, npages);
addr = get_unmapped_area(NULL, hint, npages << PAGE_SHIFT, 0, 0);
@@ -462,7 +462,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
arm_install_vdso(mm, addr + PAGE_SIZE);
up_fail:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
#endif
+2 -2
View File
@@ -101,12 +101,12 @@ static void set_segfault(struct pt_regs *regs, unsigned long addr)
siginfo_t info;
clear_siginfo(&info);
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
if (find_vma(current->mm, addr) == NULL)
info.si_code = SEGV_MAPERR;
else
info.si_code = SEGV_ACCERR;
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
info.si_signo = SIGSEGV;
info.si_errno = 0;
+8 -8
View File
@@ -99,7 +99,7 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n)
atomic = faulthandler_disabled();
if (!atomic)
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
while (n) {
pte_t *pte;
spinlock_t *ptl;
@@ -107,11 +107,11 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n)
while (!pin_page_for_write(to, &pte, &ptl)) {
if (!atomic)
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (__put_user(0, (char __user *)to))
goto out;
if (!atomic)
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
}
tocopy = (~(unsigned long)to & ~PAGE_MASK) + 1;
@@ -131,7 +131,7 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n)
spin_unlock(ptl);
}
if (!atomic)
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
out:
return n;
@@ -168,17 +168,17 @@ __clear_user_memset(void __user *addr, unsigned long n)
return 0;
}
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
while (n) {
pte_t *pte;
spinlock_t *ptl;
int tocopy;
while (!pin_page_for_write(addr, &pte, &ptl)) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (__put_user(0, (char __user *)addr))
goto out;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
}
tocopy = (~(unsigned long)addr & ~PAGE_MASK) + 1;
@@ -196,7 +196,7 @@ __clear_user_memset(void __user *addr, unsigned long n)
else
spin_unlock(ptl);
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
out:
return n;
+3 -3
View File
@@ -302,11 +302,11 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
* validly references user space from well defined areas of the code,
* we can bug out early if this is from code which shouldn't.
*/
if (!down_read_trylock(&mm->mmap_sem)) {
if (!mmap_read_trylock(mm)) {
if (!user_mode(regs) && !search_exception_tables(regs->ARM_pc))
goto no_context;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
} else {
/*
* The above down_read_trylock() might have succeeded in
@@ -359,7 +359,7 @@ retry:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/*
* Handle the "normal" case first - VM_FAULT_MAJOR
+2 -2
View File
@@ -417,12 +417,12 @@ void arm64_notify_segfault(unsigned long addr)
{
int code;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
if (find_vma(current->mm, addr) == NULL)
code = SEGV_MAPERR;
else
code = SEGV_ACCERR;
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
force_signal_inject(SIGSEGV, code, addr);
}
+4 -4
View File
@@ -357,7 +357,7 @@ int aarch32_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
struct mm_struct *mm = current->mm;
int ret;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
ret = aarch32_kuser_helpers_setup(mm);
@@ -374,7 +374,7 @@ int aarch32_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
#endif /* CONFIG_COMPAT_VDSO */
out:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
#endif /* CONFIG_COMPAT */
@@ -418,7 +418,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
struct mm_struct *mm = current->mm;
int ret;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
ret = __setup_additional_pages(ARM64_VDSO,
@@ -426,7 +426,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
bprm,
uses_interp);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+3 -3
View File
@@ -490,11 +490,11 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
* validly references user space from well defined areas of the code,
* we can bug out early if this is from code which shouldn't.
*/
if (!down_read_trylock(&mm->mmap_sem)) {
if (!mmap_read_trylock(mm)) {
if (!user_mode(regs) && !search_exception_tables(regs->pc))
goto no_context;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
} else {
/*
* The above down_read_trylock() might have succeeded in which
@@ -523,7 +523,7 @@ retry:
goto retry;
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/*
* Handle the "normal" (no error) case first.
+2 -2
View File
@@ -65,7 +65,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
unsigned long vdso_base;
struct mm_struct *mm = current->mm;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
/* Try to get it loaded right near ld.so/glibc. */
@@ -89,7 +89,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
mm->context.vdso = (void *)vdso_base;
up_fail:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+4 -4
View File
@@ -68,7 +68,7 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs)
if (user_mode(regs))
flags |= FAULT_FLAG_USER;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
goto bad_area;
@@ -121,11 +121,11 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/* Handle copyin/out exception cases */
if (!user_mode(regs))
@@ -152,7 +152,7 @@ good_area:
return;
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (user_mode(regs)) {
force_sig_fault(SIGSEGV, si_code, (void __user *)address, current);
+4 -4
View File
@@ -2308,13 +2308,13 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t
* now we atomically find some area in the address space and
* remap the buffer in it.
*/
down_write(&task->mm->mmap_sem);
mmap_write_lock(task->mm);
/* find some free area in address space, must have mmap sem held */
vma->vm_start = get_unmapped_area(NULL, 0, size, 0, MAP_PRIVATE|MAP_ANONYMOUS);
if (IS_ERR_VALUE(vma->vm_start)) {
DPRINT(("Cannot find unmapped area for size %ld\n", size));
up_write(&task->mm->mmap_sem);
mmap_write_unlock(task->mm);
goto error;
}
vma->vm_end = vma->vm_start + size;
@@ -2325,7 +2325,7 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t
/* can only be applied to current task, need to have the mm semaphore held when called */
if (pfm_remap_buffer(vma, (unsigned long)smpl_buf, vma->vm_start, size)) {
DPRINT(("Can't remap buffer\n"));
up_write(&task->mm->mmap_sem);
mmap_write_unlock(task->mm);
goto error;
}
@@ -2336,7 +2336,7 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t
insert_vm_struct(mm, vma);
vm_stat_account(vma->vm_mm, vma->vm_flags, vma_pages(vma));
up_write(&task->mm->mmap_sem);
mmap_write_unlock(task->mm);
/*
* keep track of user level virtual address
+4 -4
View File
@@ -124,7 +124,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
if (mask & VM_WRITE)
flags |= FAULT_FLAG_WRITE;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma_prev(mm, address, &prev_vma);
if (!vma && !prev_vma )
@@ -201,7 +201,7 @@ retry:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
check_expansion:
@@ -232,7 +232,7 @@ retry:
goto good_area;
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
#ifdef CONFIG_VIRTUAL_MEM_MAP
bad_area_no_up:
#endif
@@ -306,7 +306,7 @@ retry:
return;
out_of_memory:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (!user_mode(regs))
goto no_context;
pagefault_out_of_memory();
+6 -6
View File
@@ -121,13 +121,13 @@ ia64_init_addr_space (void)
vma->vm_end = vma->vm_start + PAGE_SIZE;
vma->vm_flags = VM_DATA_DEFAULT_FLAGS|VM_GROWSUP|VM_ACCOUNT;
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
if (insert_vm_struct(current->mm, vma)) {
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
vm_area_free(vma);
return;
}
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
}
/* map NaT-page at address zero to speed up speculative dereferencing of NULL: */
@@ -139,13 +139,13 @@ ia64_init_addr_space (void)
vma->vm_page_prot = __pgprot(pgprot_val(PAGE_READONLY) | _PAGE_MA_NAT);
vma->vm_flags = VM_READ | VM_MAYREAD | VM_IO |
VM_DONTEXPAND | VM_DONTDUMP;
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
if (insert_vm_struct(current->mm, vma)) {
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
vm_area_free(vma);
return;
}
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
}
}
}
+8 -8
View File
@@ -389,7 +389,7 @@ sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
if (!capable(CAP_SYS_ADMIN))
goto out;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
} else {
struct vm_area_struct *vma;
@@ -401,7 +401,7 @@ sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
* Verify that the specified address region actually belongs
* to this process.
*/
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, addr);
if (!vma || addr < vma->vm_start || addr + len > vma->vm_end)
goto out_unlock;
@@ -452,7 +452,7 @@ sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
}
}
out_unlock:
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
out:
return ret;
}
@@ -472,7 +472,7 @@ sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
spinlock_t *ptl;
unsigned long mem_value;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
pgd = pgd_offset(mm, (unsigned long)mem);
if (!pgd_present(*pgd))
goto bad_access;
@@ -495,11 +495,11 @@ sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
__put_user(newval, mem);
pte_unmap_unlock(pte, ptl);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return mem_value;
bad_access:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/* This is not necessarily a bad access, we can get here if
a memory we're trying to write to should be copied-on-write.
Make the kernel do the necessary page stuff, then re-iterate.
@@ -539,13 +539,13 @@ sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
struct mm_struct *mm = current->mm;
unsigned long mem_value;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
mem_value = *mem;
if (mem_value == oldval)
*mem = newval;
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return mem_value;
}
+4 -4
View File
@@ -86,7 +86,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
if (user_mode(regs))
flags |= FAULT_FLAG_USER;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
@@ -177,7 +177,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return 0;
/*
@@ -185,7 +185,7 @@ good_area:
* 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();
@@ -214,6 +214,6 @@ acc_err:
current->thread.faddr = address;
send_sig:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return send_fault_sig(regs);
}
+6 -6
View File
@@ -137,12 +137,12 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
* source. If this is invalid we can skip the address space check,
* thus avoiding the deadlock.
*/
if (unlikely(!down_read_trylock(&mm->mmap_sem))) {
if (unlikely(!mmap_read_trylock(mm))) {
if (kernel_mode(regs) && !search_exception_tables(regs->pc))
goto bad_area_nosemaphore;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
}
vma = find_vma(mm, address);
@@ -249,7 +249,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/*
* keep track of tlb+htab misses that are good addrs but
@@ -260,7 +260,7 @@ good_area:
return;
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
bad_area_nosemaphore:
pte_errors++;
@@ -279,7 +279,7 @@ bad_area_nosemaphore:
* us unable to handle the page fault gracefully.
*/
out_of_memory:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (!user_mode(regs))
bad_page_fault(regs, address, SIGKILL);
else
@@ -287,7 +287,7 @@ out_of_memory:
return;
do_sigbus:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (user_mode(regs)) {
force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, current);
return;
+2 -2
View File
@@ -749,13 +749,13 @@ int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31)
return 1;
case SIGSEGV:
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, (unsigned long)fault_addr);
if (vma && (vma->vm_start <= (unsigned long)fault_addr))
si_code = SEGV_ACCERR;
else
si_code = SEGV_MAPERR;
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
force_sig_fault(SIGSEGV, si_code, fault_addr, current);
return 1;
+2 -2
View File
@@ -96,7 +96,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
struct vm_area_struct *vma;
int ret;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
/* Map delay slot emulation page */
@@ -187,6 +187,6 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
ret = 0;
out:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+2 -2
View File
@@ -137,10 +137,10 @@ static void octeon_flush_cache_sigtramp(unsigned long addr)
{
struct vm_area_struct *vma;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, addr);
octeon_flush_icache_all_cores(vma);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
+2 -2
View File
@@ -1034,7 +1034,7 @@ static void r4k_flush_cache_sigtramp(unsigned long addr)
struct flush_cache_sigtramp_args args;
int npages;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
npages = get_user_pages_fast(addr, 1, 0, &args.page);
if (npages < 1)
@@ -1047,7 +1047,7 @@ static void r4k_flush_cache_sigtramp(unsigned long addr)
put_page(args.page);
out:
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
static void r4k_flush_icache_all(void)
+3 -3
View File
@@ -130,7 +130,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
vdso_mapping_len += L1_cache_info[DCACHE].aliasing_num - 1;
#endif
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
addr = vdso_random_addr(vdso_mapping_len);
@@ -185,12 +185,12 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
goto up_fail;
}
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return 0;
up_fail:
mm->context.vdso = NULL;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+6 -6
View File
@@ -122,12 +122,12 @@ void do_page_fault(unsigned long entry, unsigned long addr,
* validly references user space from well defined areas of the code,
* we can bug out early if this is from code which shouldn't.
*/
if (unlikely(!down_read_trylock(&mm->mmap_sem))) {
if (unlikely(!mmap_read_trylock(mm))) {
if (!user_mode(regs) &&
!search_exception_tables(instruction_pointer(regs)))
goto no_context;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
} else {
/*
* The above down_read_trylock() might have succeeded in which
@@ -248,7 +248,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
/*
@@ -256,7 +256,7 @@ good_area:
* Fix it, but check if it's kernel or user first..
*/
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
bad_area_nosemaphore:
@@ -316,14 +316,14 @@ no_context:
*/
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);
/* Kernel mode? Handle exceptions or die */
if (!user_mode(regs))
+6 -6
View File
@@ -84,11 +84,11 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long cause,
if (user_mode(regs))
flags |= FAULT_FLAG_USER;
if (!down_read_trylock(&mm->mmap_sem)) {
if (!mmap_read_trylock(mm)) {
if (!user_mode(regs) && !search_exception_tables(regs->ea))
goto bad_area_nosemaphore;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
}
vma = find_vma(mm, address);
@@ -173,7 +173,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
/*
@@ -181,7 +181,7 @@ good_area:
* Fix it, but check if it's kernel or user first..
*/
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
bad_area_nosemaphore:
/* User mode accesses just cause a SIGSEGV */
@@ -219,14 +219,14 @@ no_context:
* 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);
/* Kernel mode? Handle exceptions or die */
if (!user_mode(regs))
+2 -2
View File
@@ -124,14 +124,14 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
struct mm_struct *mm = current->mm;
int ret;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
/* Map kuser helpers to user space address */
ret = install_special_mapping(mm, KUSER_BASE, KUSER_SIZE,
VM_READ | VM_EXEC | VM_MAYREAD |
VM_MAYEXEC, kuser_page);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+5 -5
View File
@@ -108,7 +108,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address,
goto no_context;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
@@ -197,7 +197,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
/*
@@ -206,7 +206,7 @@ good_area:
*/
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
bad_area_nosemaphore:
@@ -265,14 +265,14 @@ out_of_memory:
__asm__ __volatile__("l.nop 42");
__asm__ __volatile__("l.nop 1");
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
+3 -3
View File
@@ -684,7 +684,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
if (user_mode(regs)) {
struct vm_area_struct *vma;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm,regs->iaoq[0]);
if (vma && (regs->iaoq[0] >= vma->vm_start)
&& (vma->vm_flags & VM_EXEC)) {
@@ -692,10 +692,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);
mmap_read_unlock(current->mm);
break; /* call do_page_fault() */
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
/* Fall Through */
case 27:
+4 -4
View File
@@ -281,7 +281,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);
mmap_read_lock(mm);
vma = find_vma_prev(mm, address, &prev_vma);
if (!vma || address < vma->vm_start)
goto check_expansion;
@@ -338,7 +338,7 @@ good_area:
goto retry;
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
check_expansion:
@@ -350,7 +350,7 @@ check_expansion:
* Something tried to access memory that isn't in our memory map..
*/
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (user_mode(regs)) {
int signo, si_code;
@@ -422,7 +422,7 @@ no_context:
parisc_terminate("Bad Address (null pointer deref?)", regs, code, address);
out_of_memory:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (!user_mode(regs))
goto no_context;
pagefault_out_of_memory();
+3 -3
View File
@@ -197,7 +197,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
* and end up putting it elsewhere.
* Add enough to the size so that the result can be aligned.
*/
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
vdso_base = get_unmapped_area(NULL, vdso_base,
(vdso_pages << PAGE_SHIFT) +
@@ -237,11 +237,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
goto fail_mmapsem;
}
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return 0;
fail_mmapsem:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return rc;
}
+2 -2
View File
@@ -586,7 +586,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
npages = get_user_pages_fast(hva, 1, writing, pages);
if (npages < 1) {
/* Check if it's an I/O mapping */
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, hva);
if (vma && vma->vm_start <= hva && hva + psize <= vma->vm_end &&
(vma->vm_flags & VM_PFNMAP)) {
@@ -596,7 +596,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
is_ci = pte_ci(__pte((pgprot_val(vma->vm_page_prot))));
write_ok = vma->vm_flags & VM_WRITE;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (!pfn)
goto out_put;
} else {
+2 -2
View File
@@ -63,7 +63,7 @@ static long kvmppc_account_memlimit(unsigned long stt_pages, bool inc)
if (!current || !current->mm)
return ret; /* process exited */
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
if (inc) {
unsigned long locked, lock_limit;
@@ -88,7 +88,7 @@ static long kvmppc_account_memlimit(unsigned long stt_pages, bool inc)
rlimit(RLIMIT_MEMLOCK),
ret ? " - exceeded" : "");
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
return ret;
}
+3 -3
View File
@@ -3781,14 +3781,14 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
/* Look up the VMA for the start of this memory slot */
hva = memslot->userspace_addr;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, hva);
if (!vma || vma->vm_start > hva || (vma->vm_flags & VM_IO))
goto up_out;
psize = vma_kernel_pagesize(vma);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
/* We can handle 4k, 64k or 16M pages in the VRMA */
if (psize >= 0x1000000)
@@ -3821,7 +3821,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
return err;
up_out:
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
goto out_srcu;
}
+2 -2
View File
@@ -358,7 +358,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
if (tlbsel == 1) {
struct vm_area_struct *vma;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, hva);
if (vma && hva >= vma->vm_start &&
@@ -444,7 +444,7 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
tsize = max(BOOK3E_PAGESZ_4K, tsize & ~1);
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
if (likely(!pfnmap)) {
+2 -2
View File
@@ -46,7 +46,7 @@ int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
if (mm->pgd == NULL)
return -EFAULT;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
ret = -EFAULT;
vma = find_vma(mm, ea);
if (!vma)
@@ -95,7 +95,7 @@ int copro_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
current->min_flt++;
out_unlock:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return ret;
}
EXPORT_SYMBOL_GPL(copro_handle_mm_fault);
+6 -6
View File
@@ -133,7 +133,7 @@ static int __bad_area(struct pt_regs *regs, unsigned long address, int si_code,
* Something tried to access memory that isn't in our memory map..
* Fix it, but check if it's kernel or user first..
*/
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return __bad_area_nosemaphore(regs, address, si_code, pkey);
}
@@ -494,12 +494,12 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address,
* source. If this is invalid we can skip the address space check,
* thus avoiding the deadlock.
*/
if (unlikely(!down_read_trylock(&mm->mmap_sem))) {
if (unlikely(!mmap_read_trylock(mm))) {
if (!is_user && !search_exception_tables(regs->nip))
return bad_area_nosemaphore(regs, address);
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
} else {
/*
* The above down_read_trylock() might have succeeded in
@@ -523,7 +523,7 @@ retry:
if (!must_retry)
return bad_area(regs, address);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (fault_in_pages_readable((const char __user *)regs->nip,
sizeof(unsigned int)))
return bad_area_nosemaphore(regs, address);
@@ -555,7 +555,7 @@ good_area:
int pkey = vma_pkey(vma);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return bad_key_fault_exception(regs, address, pkey);
}
#endif /* CONFIG_PPC_MEM_KEYS */
@@ -586,7 +586,7 @@ good_area:
return is_user ? 0 : SIGBUS;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (unlikely(fault & VM_FAULT_ERROR))
return mm_fault_error(regs, address, fault);
+2 -2
View File
@@ -46,7 +46,7 @@ static long mm_iommu_adjust_locked_vm(struct mm_struct *mm,
if (!npages)
return 0;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
if (incr) {
locked = mm->locked_vm + npages;
@@ -67,7 +67,7 @@ static long mm_iommu_adjust_locked_vm(struct mm_struct *mm,
npages << PAGE_SHIFT,
mm->locked_vm << PAGE_SHIFT,
rlimit(RLIMIT_MEMLOCK));
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+6 -6
View File
@@ -99,7 +99,7 @@ static void subpage_prot_clear(unsigned long addr, unsigned long len)
size_t nw;
unsigned long next, limit;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
limit = addr + len;
if (limit > spt->maxaddr)
limit = spt->maxaddr;
@@ -127,7 +127,7 @@ static void subpage_prot_clear(unsigned long addr, unsigned long len)
/* now flush any existing HPTEs for the range */
hpte_flush_range(mm, addr, nw);
}
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
}
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
@@ -217,7 +217,7 @@ SYSCALL_DEFINE3(subpage_prot, unsigned long, addr,
if (!access_ok(VERIFY_READ, map, (len >> PAGE_SHIFT) * sizeof(u32)))
return -EFAULT;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
subpage_mark_vma_nohuge(mm, addr, len);
for (limit = addr + len; addr < limit; addr = next) {
next = pmd_addr_end(addr, limit);
@@ -252,11 +252,11 @@ SYSCALL_DEFINE3(subpage_prot, unsigned long, addr,
if (addr + (nw << PAGE_SHIFT) > next)
nw = (next - addr) >> PAGE_SHIFT;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
if (__copy_from_user(spp, map, nw * sizeof(u32)))
return -EFAULT;
map += nw;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
/* now flush any existing HPTEs for the range */
hpte_flush_range(mm, addr, nw);
@@ -265,6 +265,6 @@ SYSCALL_DEFINE3(subpage_prot, unsigned long, addr,
spt->maxaddr = limit;
err = 0;
out:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return err;
}
+3 -3
View File
@@ -336,7 +336,7 @@ get_exec_dcookie_and_offset(struct spu *spu, unsigned int *offsetp,
fput(exe_file);
}
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
for (vma = mm->mmap; vma; vma = vma->vm_next) {
if (vma->vm_start > spu_ref || vma->vm_end <= spu_ref)
continue;
@@ -353,13 +353,13 @@ get_exec_dcookie_and_offset(struct spu *spu, unsigned int *offsetp,
*spu_bin_dcookie = fast_get_dcookie(&vma->vm_file->f_path);
pr_debug("got dcookie for %pD\n", vma->vm_file);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
out:
return app_cookie;
fail_no_image_cookie:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
printk(KERN_ERR "SPU_PROF: "
"%s, line %d: Cannot find dcookie for SPU binary\n",
+2 -2
View File
@@ -349,11 +349,11 @@ static vm_fault_t spufs_ps_fault(struct vm_fault *vmf,
goto refault;
if (ctx->state == SPU_STATE_SAVED) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
spu_context_nospu_trace(spufs_ps_fault__sleep, ctx);
err = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
spu_context_trace(spufs_ps_fault__wake, ctx, ctx->spu);
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
} else {
area = ctx->spu->problem_phys + ps_offs;
ret = vmf_insert_pfn(vmf->vma, vmf->address,
+2 -2
View File
@@ -72,7 +72,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
vdso_len = (vdso_pages + 1) << PAGE_SHIFT;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
vdso_base = get_unmapped_area(NULL, 0, vdso_len, 0, 0);
if (IS_ERR_VALUE(vdso_base)) {
ret = vdso_base;
@@ -94,7 +94,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
mm->context.vdso = NULL;
end:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+5 -5
View File
@@ -80,7 +80,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs)
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr);
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, addr);
if (unlikely(!vma))
goto bad_area;
@@ -171,7 +171,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
/*
@@ -179,7 +179,7 @@ good_area:
* Fix it, but check if it's kernel or user first.
*/
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/* User mode accesses just cause a SIGSEGV */
if (user_mode(regs)) {
do_trap(regs, SIGSEGV, code, addr, tsk);
@@ -207,14 +207,14 @@ no_context:
* (which will retry the fault, or kill us if we got oom-killed).
*/
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);
/* Kernel mode? Handle exceptions or die */
if (!user_mode(regs))
goto no_context;
+2 -2
View File
@@ -240,7 +240,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
* it at vdso_base which is the "natural" base for it, but we might
* fail and end up putting it elsewhere.
*/
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
vdso_base = get_unmapped_area(NULL, 0, vdso_pages << PAGE_SHIFT, 0, 0);
if (IS_ERR_VALUE(vdso_base)) {
@@ -271,7 +271,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
rc = 0;
out_up:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return rc;
}
+2 -2
View File
@@ -1200,7 +1200,7 @@ int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg,
int dat_protection, fake;
int rc;
down_read(&sg->mm->mmap_sem);
mmap_read_lock(sg->mm);
/*
* We don't want any guest-2 tables to change - so the parent
* tables/pointers we read stay valid - unshadowing is however
@@ -1229,6 +1229,6 @@ shadow_page:
if (!rc)
rc = gmap_shadow_page(sg, saddr, __pte(pte.val));
ipte_unlock(vcpu);
up_read(&sg->mm->mmap_sem);
mmap_read_unlock(sg->mm);
return rc;
}
+12 -12
View File
@@ -707,9 +707,9 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap)
r = -EINVAL;
else {
r = 0;
down_write(&kvm->mm->mmap_sem);
mmap_write_lock(kvm->mm);
kvm->mm->context.allow_gmap_hpage_1m = 1;
up_write(&kvm->mm->mmap_sem);
mmap_write_unlock(kvm->mm);
/*
* We might have to create fake 4k page
* tables. To avoid that the hardware works on
@@ -1542,7 +1542,7 @@ static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
if (!keys)
return -ENOMEM;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
srcu_idx = srcu_read_lock(&kvm->srcu);
for (i = 0; i < args->count; i++) {
hva = gfn_to_hva(kvm, args->start_gfn + i);
@@ -1556,7 +1556,7 @@ static long kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
break;
}
srcu_read_unlock(&kvm->srcu, srcu_idx);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (!r) {
r = copy_to_user((uint8_t __user *)args->skeydata_addr, keys,
@@ -1600,7 +1600,7 @@ static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
goto out;
i = 0;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
srcu_idx = srcu_read_lock(&kvm->srcu);
while (i < args->count) {
unlocked = false;
@@ -1627,7 +1627,7 @@ static long kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
i++;
}
srcu_read_unlock(&kvm->srcu, srcu_idx);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
out:
kvfree(keys);
return r;
@@ -1817,14 +1817,14 @@ static int kvm_s390_get_cmma_bits(struct kvm *kvm,
if (!values)
return -ENOMEM;
down_read(&kvm->mm->mmap_sem);
mmap_read_lock(kvm->mm);
srcu_idx = srcu_read_lock(&kvm->srcu);
if (peek)
ret = kvm_s390_peek_cmma(kvm, args, values, bufsize);
else
ret = kvm_s390_get_cmma(kvm, args, values, bufsize);
srcu_read_unlock(&kvm->srcu, srcu_idx);
up_read(&kvm->mm->mmap_sem);
mmap_read_unlock(kvm->mm);
if (kvm->arch.migration_mode)
args->remaining = atomic64_read(&kvm->arch.cmma_dirty_pages);
@@ -1874,7 +1874,7 @@ static int kvm_s390_set_cmma_bits(struct kvm *kvm,
goto out;
}
down_read(&kvm->mm->mmap_sem);
mmap_read_lock(kvm->mm);
srcu_idx = srcu_read_lock(&kvm->srcu);
for (i = 0; i < args->count; i++) {
hva = gfn_to_hva(kvm, args->start_gfn + i);
@@ -1889,12 +1889,12 @@ static int kvm_s390_set_cmma_bits(struct kvm *kvm,
set_pgste_bits(kvm->mm, hva, mask, pgstev);
}
srcu_read_unlock(&kvm->srcu, srcu_idx);
up_read(&kvm->mm->mmap_sem);
mmap_read_unlock(kvm->mm);
if (!kvm->mm->context.uses_cmm) {
down_write(&kvm->mm->mmap_sem);
mmap_write_lock(kvm->mm);
kvm->mm->context.uses_cmm = 1;
up_write(&kvm->mm->mmap_sem);
mmap_write_unlock(kvm->mm);
}
out:
vfree(bits);
+16 -16
View File
@@ -269,18 +269,18 @@ static int handle_iske(struct kvm_vcpu *vcpu)
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
retry:
unlocked = false;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
rc = get_guest_storage_key(current->mm, vmaddr, &key);
if (rc) {
rc = fixup_user_fault(current, current->mm, vmaddr,
FAULT_FLAG_WRITE, &unlocked);
if (!rc) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
goto retry;
}
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (rc == -EFAULT)
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
if (rc < 0)
@@ -316,17 +316,17 @@ static int handle_rrbe(struct kvm_vcpu *vcpu)
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
retry:
unlocked = false;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
rc = reset_guest_reference_bit(current->mm, vmaddr);
if (rc < 0) {
rc = fixup_user_fault(current, current->mm, vmaddr,
FAULT_FLAG_WRITE, &unlocked);
if (!rc) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
goto retry;
}
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (rc == -EFAULT)
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
if (rc < 0)
@@ -384,7 +384,7 @@ static int handle_sske(struct kvm_vcpu *vcpu)
if (kvm_is_error_hva(vmaddr))
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
rc = cond_set_guest_storage_key(current->mm, vmaddr, key, &oldkey,
m3 & SSKE_NQ, m3 & SSKE_MR,
m3 & SSKE_MC);
@@ -394,7 +394,7 @@ static int handle_sske(struct kvm_vcpu *vcpu)
FAULT_FLAG_WRITE, &unlocked);
rc = !rc ? -EAGAIN : rc;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (rc == -EFAULT)
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
if (rc == -EAGAIN)
@@ -1000,7 +1000,7 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
if (rc)
return rc;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
rc = cond_set_guest_storage_key(current->mm, vmaddr,
key, NULL, nq, mr, mc);
if (rc < 0) {
@@ -1008,7 +1008,7 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
FAULT_FLAG_WRITE, &unlocked);
rc = !rc ? -EAGAIN : rc;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (rc == -EFAULT)
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
if (rc == -EAGAIN)
@@ -1129,9 +1129,9 @@ static int handle_essa(struct kvm_vcpu *vcpu)
* already correct, we do nothing and avoid the lock.
*/
if (vcpu->kvm->mm->context.uses_cmm == 0) {
down_write(&vcpu->kvm->mm->mmap_sem);
mmap_write_lock(vcpu->kvm->mm);
vcpu->kvm->mm->context.uses_cmm = 1;
up_write(&vcpu->kvm->mm->mmap_sem);
mmap_write_unlock(vcpu->kvm->mm);
}
/*
* If we are here, we are supposed to have CMMA enabled in
@@ -1148,11 +1148,11 @@ static int handle_essa(struct kvm_vcpu *vcpu)
} else {
int srcu_idx;
down_read(&vcpu->kvm->mm->mmap_sem);
mmap_read_lock(vcpu->kvm->mm);
srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
i = __do_essa(vcpu, orc);
srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
up_read(&vcpu->kvm->mm->mmap_sem);
mmap_read_unlock(vcpu->kvm->mm);
if (i < 0)
return i;
/* Account for the possible extra cbrl entry */
@@ -1160,10 +1160,10 @@ static int handle_essa(struct kvm_vcpu *vcpu)
}
vcpu->arch.sie_block->cbrlo &= PAGE_MASK; /* reset nceo */
cbrlo = phys_to_virt(vcpu->arch.sie_block->cbrlo);
down_read(&gmap->mm->mmap_sem);
mmap_read_lock(gmap->mm);
for (i = 0; i < entries; ++i)
__gmap_zap(gmap, cbrlo[i]);
up_read(&gmap->mm->mmap_sem);
mmap_read_unlock(gmap->mm);
return 0;
}
+3 -3
View File
@@ -459,7 +459,7 @@ static inline vm_fault_t do_exception(struct pt_regs *regs, int access)
access = VM_WRITE;
if (access == VM_WRITE)
flags |= FAULT_FLAG_WRITE;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
gmap = NULL;
if (IS_ENABLED(CONFIG_PGSTE) && type == GMAP_FAULT) {
@@ -543,7 +543,7 @@ retry:
flags &= ~(FAULT_FLAG_ALLOW_RETRY |
FAULT_FLAG_RETRY_NOWAIT);
flags |= FAULT_FLAG_TRIED;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
goto retry;
}
}
@@ -561,7 +561,7 @@ retry:
}
fault = 0;
out_up:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
out:
return fault;
}
+20 -20
View File
@@ -405,10 +405,10 @@ int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len)
return -EINVAL;
flush = 0;
down_write(&gmap->mm->mmap_sem);
mmap_write_lock(gmap->mm);
for (off = 0; off < len; off += PMD_SIZE)
flush |= __gmap_unmap_by_gaddr(gmap, to + off);
up_write(&gmap->mm->mmap_sem);
mmap_write_unlock(gmap->mm);
if (flush)
gmap_flush_tlb(gmap);
return 0;
@@ -438,7 +438,7 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
return -EINVAL;
flush = 0;
down_write(&gmap->mm->mmap_sem);
mmap_write_lock(gmap->mm);
for (off = 0; off < len; off += PMD_SIZE) {
/* Remove old translation */
flush |= __gmap_unmap_by_gaddr(gmap, to + off);
@@ -448,7 +448,7 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
(void *) from + off))
break;
}
up_write(&gmap->mm->mmap_sem);
mmap_write_unlock(gmap->mm);
if (flush)
gmap_flush_tlb(gmap);
if (off >= len)
@@ -495,9 +495,9 @@ unsigned long gmap_translate(struct gmap *gmap, unsigned long gaddr)
{
unsigned long rc;
down_read(&gmap->mm->mmap_sem);
mmap_read_lock(gmap->mm);
rc = __gmap_translate(gmap, gaddr);
up_read(&gmap->mm->mmap_sem);
mmap_read_unlock(gmap->mm);
return rc;
}
EXPORT_SYMBOL_GPL(gmap_translate);
@@ -640,7 +640,7 @@ int gmap_fault(struct gmap *gmap, unsigned long gaddr,
int rc;
bool unlocked;
down_read(&gmap->mm->mmap_sem);
mmap_read_lock(gmap->mm);
retry:
unlocked = false;
@@ -663,7 +663,7 @@ retry:
rc = __gmap_link(gmap, gaddr, vmaddr);
out_up:
up_read(&gmap->mm->mmap_sem);
mmap_read_unlock(gmap->mm);
return rc;
}
EXPORT_SYMBOL_GPL(gmap_fault);
@@ -697,7 +697,7 @@ void gmap_discard(struct gmap *gmap, unsigned long from, unsigned long to)
unsigned long gaddr, vmaddr, size;
struct vm_area_struct *vma;
down_read(&gmap->mm->mmap_sem);
mmap_read_lock(gmap->mm);
for (gaddr = from; gaddr < to;
gaddr = (gaddr + PMD_SIZE) & PMD_MASK) {
/* Find the vm address for the guest address */
@@ -720,7 +720,7 @@ void gmap_discard(struct gmap *gmap, unsigned long from, unsigned long to)
size = min(to - gaddr, PMD_SIZE - (gaddr & ~PMD_MASK));
zap_page_range(vma, vmaddr, size);
}
up_read(&gmap->mm->mmap_sem);
mmap_read_unlock(gmap->mm);
}
EXPORT_SYMBOL_GPL(gmap_discard);
@@ -1101,9 +1101,9 @@ int gmap_mprotect_notify(struct gmap *gmap, unsigned long gaddr,
return -EINVAL;
if (!MACHINE_HAS_ESOP && prot == PROT_READ)
return -EINVAL;
down_read(&gmap->mm->mmap_sem);
mmap_read_lock(gmap->mm);
rc = gmap_protect_range(gmap, gaddr, len, prot, GMAP_NOTIFY_MPROT);
up_read(&gmap->mm->mmap_sem);
mmap_read_unlock(gmap->mm);
return rc;
}
EXPORT_SYMBOL_GPL(gmap_mprotect_notify);
@@ -1691,11 +1691,11 @@ struct gmap *gmap_shadow(struct gmap *parent, unsigned long asce,
}
spin_unlock(&parent->shadow_lock);
/* protect after insertion, so it will get properly invalidated */
down_read(&parent->mm->mmap_sem);
mmap_read_lock(parent->mm);
rc = gmap_protect_range(parent, asce & _ASCE_ORIGIN,
((asce & _ASCE_TABLE_LENGTH) + 1) * PAGE_SIZE,
PROT_READ, GMAP_NOTIFY_SHADOW);
up_read(&parent->mm->mmap_sem);
mmap_read_unlock(parent->mm);
spin_lock(&parent->shadow_lock);
new->initialized = true;
if (rc) {
@@ -2542,12 +2542,12 @@ int s390_enable_sie(void)
/* Fail if the page tables are 2K */
if (!mm_alloc_pgste(mm))
return -EINVAL;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
mm->context.has_pgste = 1;
/* split thp mappings and disable thp for future mappings */
thp_split_mm(mm);
zap_zero_pages(mm);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return 0;
}
EXPORT_SYMBOL_GPL(s390_enable_sie);
@@ -2599,7 +2599,7 @@ int s390_enable_skey(void)
struct vm_area_struct *vma;
int rc = 0;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
if (mm_uses_skeys(mm))
goto out_up;
@@ -2618,7 +2618,7 @@ int s390_enable_skey(void)
walk_page_range(0, TASK_SIZE, &walk);
out_up:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return rc;
}
EXPORT_SYMBOL_GPL(s390_enable_skey);
@@ -2637,9 +2637,9 @@ void s390_reset_cmma(struct mm_struct *mm)
{
struct mm_walk walk = { .pte_entry = __s390_reset_cmma };
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
walk.mm = mm;
walk_page_range(0, TASK_SIZE, &walk);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
}
EXPORT_SYMBOL_GPL(s390_reset_cmma);
+2 -2
View File
@@ -18,7 +18,7 @@ static long get_pfn(unsigned long user_addr, unsigned long access,
struct vm_area_struct *vma;
long ret;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
ret = -EINVAL;
vma = find_vma(current->mm, user_addr);
if (!vma)
@@ -28,7 +28,7 @@ static long get_pfn(unsigned long user_addr, unsigned long access,
goto out;
ret = follow_pfn(vma, user_addr, pfn);
out:
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return ret;
}
+3 -3
View File
@@ -69,10 +69,10 @@ asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len, int op)
if (addr + len < addr)
return -EFAULT;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma (current->mm, addr);
if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return -EFAULT;
}
@@ -91,6 +91,6 @@ asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len, int op)
if (op & CACHEFLUSH_I)
flush_icache_range(addr, addr+len);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return 0;
}
+2 -2
View File
@@ -64,7 +64,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
unsigned long addr;
int ret;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
@@ -83,7 +83,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
current->mm->context.vdso = (void *)addr;
up_fail:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+7 -7
View File
@@ -278,7 +278,7 @@ __bad_area(struct pt_regs *regs, unsigned long error_code,
* Something tried to access memory that isn't in our memory map..
* Fix it, but check if it's kernel or user first..
*/
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
__bad_area_nosemaphore(regs, error_code, address, si_code);
}
@@ -302,7 +302,7 @@ do_sigbus(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);
mmap_read_unlock(mm);
/* Kernel mode? Handle exceptions or die: */
if (!user_mode(regs))
@@ -321,7 +321,7 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
*/
if (fatal_signal_pending(current)) {
if (!(fault & VM_FAULT_RETRY))
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (!user_mode(regs))
no_context(regs, error_code, address);
return 1;
@@ -333,11 +333,11 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
if (fault & VM_FAULT_OOM) {
/* Kernel mode? Handle exceptions or die: */
if (!user_mode(regs)) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
no_context(regs, error_code, address);
return 1;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
/*
* We ran out of memory, call the OOM killer, and return the
@@ -441,7 +441,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
}
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (unlikely(!vma)) {
@@ -510,5 +510,5 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
}
+9 -9
View File
@@ -196,7 +196,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
if (!from_user && address >= PAGE_OFFSET)
goto bad_area;
@@ -273,7 +273,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
/*
@@ -281,7 +281,7 @@ good_area:
* Fix it, but check if it's kernel or user first..
*/
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
bad_area_nosemaphore:
/* User mode accesses just cause a SIGSEGV */
@@ -330,7 +330,7 @@ no_context:
* us unable to handle the page fault gracefully.
*/
out_of_memory:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (from_user) {
pagefault_out_of_memory();
return;
@@ -338,7 +338,7 @@ out_of_memory:
goto no_context;
do_sigbus:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
do_fault_siginfo(BUS_ADRERR, SIGBUS, regs, text_fault);
if (!from_user)
goto no_context;
@@ -385,7 +385,7 @@ static void force_user_fault(unsigned long address, int write)
code = SEGV_MAPERR;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
goto bad_area;
@@ -410,15 +410,15 @@ good_area:
case VM_FAULT_OOM:
goto do_sigbus;
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return;
bad_area:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
__do_fault_siginfo(code, SIGSEGV, tsk->thread.kregs, address);
return;
do_sigbus:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
__do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address);
}
+6 -6
View File
@@ -329,7 +329,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
if (!down_read_trylock(&mm->mmap_sem)) {
if (!mmap_read_trylock(mm)) {
if ((regs->tstate & TSTATE_PRIV) &&
!search_exception_tables(regs->tpc)) {
insn = get_fault_insn(regs, insn);
@@ -337,7 +337,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
}
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
}
if (fault_code & FAULT_CODE_BAD_RA)
@@ -470,7 +470,7 @@ good_area:
goto retry;
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
mm_rss = get_mm_rss(mm);
#if defined(CONFIG_TRANSPARENT_HUGEPAGE)
@@ -501,7 +501,7 @@ exit_exception:
*/
bad_area:
insn = get_fault_insn(regs, insn);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
handle_kernel_fault:
do_kernel_fault(regs, si_code, fault_code, insn, address);
@@ -513,7 +513,7 @@ handle_kernel_fault:
*/
out_of_memory:
insn = get_fault_insn(regs, insn);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (!(regs->tstate & TSTATE_PRIV)) {
pagefault_out_of_memory();
goto exit_exception;
@@ -526,7 +526,7 @@ intr_or_no_mm:
do_sigbus:
insn = get_fault_insn(regs, insn);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/*
* Send a sigbus, regardless of whether we were in kernel
+2 -2
View File
@@ -179,7 +179,7 @@ static int map_vdso(const struct vdso_image *image,
unsigned long text_start, addr = 0;
int ret = 0;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
/*
* First, get an unmapped region: then randomize it, and make sure that
@@ -235,7 +235,7 @@ up_fail:
if (ret)
current->mm->context.vdso = NULL;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
+1 -1
View File
@@ -55,7 +55,7 @@ static inline void activate_mm(struct mm_struct *old, struct mm_struct *new)
__switch_mm(&new->context.id);
down_write_nested(&new->mmap_sem, 1);
uml_setup_stubs(new);
up_write(&new->mmap_sem);
mmap_write_unlock(new);
}
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
+1 -1
View File
@@ -300,7 +300,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr,
printk(KERN_ERR "fix_range_common: failed, killing current "
"process: %d\n", task_tgid_vnr(current));
/* We are under mmap_sem, release it such that current can terminate */
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
force_sig(SIGKILL, current);
do_signal(&current->thread.regs);
}
+3 -3
View File
@@ -46,7 +46,7 @@ int handle_page_fault(unsigned long address, unsigned long ip,
if (is_user)
flags |= FAULT_FLAG_USER;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
goto out;
@@ -122,7 +122,7 @@ good_area:
#endif
flush_tlb_page(vma, address);
out:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
out_nosemaphore:
return err;
@@ -131,7 +131,7 @@ out_of_memory:
* We ran out of memory, call the OOM killer, and return the userspace
* (which will retry the fault, or kill us if we got oom-killed).
*/
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (!is_user)
goto out_nosemaphore;
pagefault_out_of_memory();
+3 -3
View File
@@ -233,12 +233,12 @@ static int do_pf(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
* validly references user space from well defined areas of the code,
* we can bug out early if this is from code which shouldn't.
*/
if (!down_read_trylock(&mm->mmap_sem)) {
if (!mmap_read_trylock(mm)) {
if (!user_mode(regs)
&& !search_exception_tables(regs->UCreg_pc))
goto no_context;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
} else {
/*
* The above down_read_trylock() might have succeeded in
@@ -275,7 +275,7 @@ retry:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/*
* Handle the "normal" case first - VM_FAULT_MAJOR
+5 -5
View File
@@ -156,7 +156,7 @@ static int map_vdso(const struct vdso_image *image, unsigned long addr)
unsigned long text_start;
int ret = 0;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
addr = get_unmapped_area(NULL, addr,
@@ -199,7 +199,7 @@ static int map_vdso(const struct vdso_image *image, unsigned long addr)
}
up_fail:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
@@ -261,7 +261,7 @@ int map_vdso_once(const struct vdso_image *image, unsigned long addr)
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
/*
* Check if we have already mapped vdso blob - fail to prevent
* abusing from userspace install_speciall_mapping, which may
@@ -272,11 +272,11 @@ int map_vdso_once(const struct vdso_image *image, unsigned long addr)
for (vma = mm->mmap; vma; vma = vma->vm_next) {
if (vma_is_special_mapping(vma, &vdso_mapping) ||
vma_is_special_mapping(vma, &vvar_mapping)) {
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return -EEXIST;
}
}
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return map_vdso(image, addr);
}
+2 -2
View File
@@ -172,7 +172,7 @@ static void mark_screen_rdonly(struct mm_struct *mm)
pte_t *pte;
int i;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
pgd = pgd_offset(mm, 0xA0000);
if (pgd_none_or_clear_bad(pgd))
goto out;
@@ -198,7 +198,7 @@ static void mark_screen_rdonly(struct mm_struct *mm)
}
pte_unmap_unlock(pte, ptl);
out:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
flush_tlb_mm_range(mm, 0xA0000, 0xA0000 + 32*PAGE_SIZE, PAGE_SHIFT, false);
}
+4 -4
View File
@@ -26,9 +26,9 @@ static const struct file_operations ptdump_fops = {
static int ptdump_show_curknl(struct seq_file *m, void *v)
{
if (current->mm->pgd) {
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
ptdump_walk_pgd_level_debugfs(m, current->mm->pgd, false);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
return 0;
}
@@ -52,9 +52,9 @@ static struct dentry *pe_curusr;
static int ptdump_show_curusr(struct seq_file *m, void *v)
{
if (current->mm->pgd) {
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
ptdump_walk_pgd_level_debugfs(m, current->mm->pgd, true);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
return 0;
}
+4 -4
View File
@@ -933,7 +933,7 @@ __bad_area(struct pt_regs *regs, unsigned long error_code,
* Something tried to access memory that isn't in our memory map..
* Fix it, but check if it's kernel or user first..
*/
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
__bad_area_nosemaphore(regs, error_code, address,
(vma) ? &pkey : NULL, si_code);
@@ -1338,14 +1338,14 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code,
* validate the source. If this is invalid we can skip the address
* space check, thus avoiding the deadlock:
*/
if (unlikely(!down_read_trylock(&mm->mmap_sem))) {
if (unlikely(!mmap_read_trylock(mm))) {
if (!(error_code & X86_PF_USER) &&
!search_exception_tables(regs->ip)) {
bad_area_nosemaphore(regs, error_code, address, NULL);
return;
}
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
} else {
/*
* The above down_read_trylock() might have succeeded in
@@ -1435,7 +1435,7 @@ good_area:
return;
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (unlikely(fault & VM_FAULT_ERROR)) {
mm_fault_error(regs, error_code, address, &pkey, fault);
return;
+6 -6
View File
@@ -52,10 +52,10 @@ static unsigned long mpx_mmap(unsigned long len)
if (len != mpx_bt_size_bytes(mm))
return -EINVAL;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
addr = do_mmap(NULL, 0, len, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, VM_MPX, 0, &populate, NULL);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
if (populate)
mm_populate(addr, populate);
@@ -239,7 +239,7 @@ int mpx_enable_management(void)
* unmap path; we can just use mm->context.bd_addr instead.
*/
bd_base = mpx_get_bounds_dir();
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
/* MPX doesn't support addresses above 47 bits yet. */
if (find_vma(mm, DEFAULT_MAP_WINDOW)) {
@@ -253,7 +253,7 @@ int mpx_enable_management(void)
if (mm->context.bd_addr == MPX_INVALID_BOUNDS_DIR)
ret = -ENXIO;
out:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
@@ -264,9 +264,9 @@ int mpx_disable_management(void)
if (!cpu_feature_enabled(X86_FEATURE_MPX))
return -ENXIO;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
mm->context.bd_addr = MPX_INVALID_BOUNDS_DIR;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return 0;
}
+2 -2
View File
@@ -61,7 +61,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
if (!vdso_enabled)
return 0;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return -EINTR;
err = install_special_mapping(mm, um_vdso_addr, PAGE_SIZE,
@@ -69,7 +69,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
vdsop);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return err;
}
+5 -5
View File
@@ -74,7 +74,7 @@ void do_page_fault(struct pt_regs *regs)
if (user_mode(regs))
flags |= FAULT_FLAG_USER;
retry:
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
if (!vma)
@@ -140,7 +140,7 @@ good_area:
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
if (flags & VM_FAULT_MAJOR)
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
@@ -153,7 +153,7 @@ good_area:
* 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)) {
current->thread.bad_vaddr = address;
current->thread.error_code = is_write;
@@ -168,7 +168,7 @@ bad_area:
* us unable to handle the page fault gracefully.
*/
out_of_memory:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (!user_mode(regs))
bad_page_fault(regs, address, SIGKILL);
else
@@ -176,7 +176,7 @@ 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.
+5 -5
View File
@@ -220,7 +220,7 @@ static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
mm = alloc->vma_vm_mm;
if (mm) {
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
vma = alloc->vma;
}
@@ -279,7 +279,7 @@ static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
/* vm_insert_page does not seem to increment the refcount */
}
if (mm) {
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
mmput_async(mm);
}
return 0;
@@ -312,7 +312,7 @@ err_page_ptr_cleared:
}
err_no_vma:
if (mm) {
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
mmput_async(mm);
}
return vma ? -ENOMEM : -ESRCH;
@@ -1013,7 +1013,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
mm = alloc->vma_vm_mm;
if (!mmget_not_zero(mm))
goto err_mmget;
if (!down_read_trylock(&mm->mmap_sem))
if (!mmap_read_trylock(mm))
goto err_down_read_mmap_sem_failed;
vma = binder_alloc_get_vma(alloc);
@@ -1027,7 +1027,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
trace_binder_unmap_user_end(alloc, index);
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
mmput_async(mm);
trace_binder_unmap_kernel_start(alloc, index);
+3 -3
View File
@@ -2185,12 +2185,12 @@ static void inv_args(struct smq_invoke_ctx *ctx)
uint64_t inv_len;
struct vm_area_struct *vma;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
VERIFY(err, NULL != (vma = find_vma(
current->mm,
rpra[over].buf.pv)));
if (err) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
goto bail;
}
if (ctx->overps[i]->do_cmo) {
@@ -2205,7 +2205,7 @@ static void inv_args(struct smq_invoke_ctx *ctx)
ctx->overps[i]->mend -
ctx->overps[i]->mstart;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
dma_buf_begin_cpu_access_partial(
map->buf, DMA_TO_DEVICE, offset,
inv_len);
+2 -2
View File
@@ -51,7 +51,7 @@ static int afu_dma_adjust_locked_vm(struct device *dev, long npages, bool incr)
if (!current->mm)
return 0;
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
if (incr) {
locked = current->mm->locked_vm + npages;
@@ -72,7 +72,7 @@ static int afu_dma_adjust_locked_vm(struct device *dev, long npages, bool incr)
current->mm->locked_vm << PAGE_SHIFT, rlimit(RLIMIT_MEMLOCK),
ret ? "- execeeded" : "");
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
return ret;
}
@@ -1385,9 +1385,9 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
* concurrently and the queues are actually stopped
*/
if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm)) {
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
is_invalid_userptr = atomic_read(&mem->invalid);
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
}
mutex_lock(&mem->lock);
+3 -3
View File
@@ -389,7 +389,7 @@ struct amdgpu_mn *amdgpu_mn_get(struct amdgpu_device *adev,
int r;
mutex_lock(&adev->mn_lock);
if (down_write_killable(&mm->mmap_sem)) {
if (mmap_write_lock_killable(mm)) {
mutex_unlock(&adev->mn_lock);
return ERR_PTR(-EINTR);
}
@@ -420,13 +420,13 @@ struct amdgpu_mn *amdgpu_mn_get(struct amdgpu_device *adev,
hash_add(adev->mn_hash, &amn->node, AMDGPU_MN_KEY(mm, type));
release_locks:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
mutex_unlock(&adev->mn_lock);
return amn;
free_amn:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
mutex_unlock(&adev->mn_lock);
kfree(amn);
+4 -4
View File
@@ -817,7 +817,7 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY))
flags |= FOLL_WRITE;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
if (gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) {
/*
@@ -829,7 +829,7 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
vma = find_vma(mm, gtt->userptr);
if (!vma || vma->vm_file || vma->vm_end < end) {
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return -EPERM;
}
}
@@ -864,12 +864,12 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
} while (pinned < ttm->num_pages);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return 0;
release_pages:
release_pages(pages, pinned);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return r;
}
+2 -2
View File
@@ -901,7 +901,7 @@ void kfd_signal_iommu_event(struct kfd_dev *dev, unsigned int pasid,
memset(&memory_exception_data, 0, sizeof(memory_exception_data));
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, address);
memory_exception_data.gpu_id = dev->id;
@@ -924,7 +924,7 @@ void kfd_signal_iommu_event(struct kfd_dev *dev, unsigned int pasid,
memory_exception_data.failure.NoExecute = 0;
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
mmput(mm);
pr_debug("notpresent %d, noexecute %d, readonly %d\n",
+2 -2
View File
@@ -1901,7 +1901,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
struct mm_struct *mm = current->mm;
struct vm_area_struct *vma;
if (down_write_killable(&mm->mmap_sem)) {
if (mmap_write_lock_killable(mm)) {
addr = -EINTR;
goto err;
}
@@ -1911,7 +1911,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
else
addr = -ENOMEM;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
if (IS_ERR_VALUE(addr))
goto err;
+4 -4
View File
@@ -221,7 +221,7 @@ i915_mmu_notifier_find(struct i915_mm_struct *mm)
if (IS_ERR(mn))
err = PTR_ERR(mn);
down_write(&mm->mm->mmap_sem);
mmap_write_lock(mm->mm);
mutex_lock(&mm->i915->mm_lock);
if (mm->mn == NULL && !err) {
/* Protected by mmap_sem (write-lock) */
@@ -238,7 +238,7 @@ i915_mmu_notifier_find(struct i915_mm_struct *mm)
err = 0;
}
mutex_unlock(&mm->i915->mm_lock);
up_write(&mm->mm->mmap_sem);
mmap_write_unlock(mm->mm);
if (mn && !IS_ERR(mn)) {
destroy_workqueue(mn->wq);
@@ -519,7 +519,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
ret = -EFAULT;
if (mmget_not_zero(mm)) {
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
while (pinned < npages) {
ret = get_user_pages_remote
(work->task, mm,
@@ -532,7 +532,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
pinned += ret;
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
mmput(mm);
}
}
+2 -2
View File
@@ -190,12 +190,12 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm,
&p->validated);
if (need_mmap_lock)
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
r = radeon_bo_list_validate(p->rdev, &p->ticket, &p->validated, p->ring);
if (need_mmap_lock)
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return r;
}
+3 -3
View File
@@ -336,17 +336,17 @@ int radeon_gem_userptr_ioctl(struct drm_device *dev, void *data,
}
if (args->flags & RADEON_GEM_USERPTR_VALIDATE) {
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
r = radeon_bo_reserve(bo, true);
if (r) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
goto release_object;
}
radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_GTT);
r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
radeon_bo_unreserve(bo);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
if (r)
goto release_object;
}
+3 -3
View File
@@ -203,7 +203,7 @@ static struct radeon_mn *radeon_mn_get(struct radeon_device *rdev)
struct radeon_mn *rmn;
int r;
if (down_write_killable(&mm->mmap_sem))
if (mmap_write_lock_killable(mm))
return ERR_PTR(-EINTR);
mutex_lock(&rdev->mn_lock);
@@ -232,13 +232,13 @@ static struct radeon_mn *radeon_mn_get(struct radeon_device *rdev)
release_locks:
mutex_unlock(&rdev->mn_lock);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return rmn;
free_rmn:
mutex_unlock(&rdev->mn_lock);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
kfree(rmn);
return ERR_PTR(r);
+2 -2
View File
@@ -70,7 +70,7 @@ static vm_fault_t ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
goto out_unlock;
ttm_bo_get(bo);
up_read(&vmf->vma->vm_mm->mmap_sem);
mmap_read_unlock(vmf->vma->vm_mm);
(void) dma_fence_wait(bo->moving, true);
ttm_bo_unreserve(bo);
ttm_bo_put(bo);
@@ -145,7 +145,7 @@ static vm_fault_t ttm_bo_vm_fault(struct vm_fault *vmf)
if (fault_flag_allow_retry_first(vmf->flags)) {
if (!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) {
ttm_bo_get(bo);
up_read(&vmf->vma->vm_mm->mmap_sem);
mmap_read_unlock(vmf->vma->vm_mm);
(void) ttm_bo_wait_unreserved(bo);
ttm_bo_put(bo);
}
+11 -11
View File
@@ -2599,15 +2599,15 @@ static int memdesc_sg_virt(struct kgsl_memdesc *memdesc, unsigned long useraddr)
goto out;
}
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
if (!check_vma(useraddr, memdesc->size)) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
ret = -EFAULT;
goto out;
}
npages = get_user_pages(useraddr, sglen, write, pages, NULL);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
ret = (npages < 0) ? (int)npages : 0;
if (ret)
@@ -2729,7 +2729,7 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device,
* Find the VMA containing this pointer and figure out if it
* is a dma-buf.
*/
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, hostptr);
if (vma && vma->vm_file) {
@@ -2737,7 +2737,7 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device,
ret = check_vma_flags(vma, entry->memdesc.flags);
if (ret) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return ret;
}
@@ -2746,7 +2746,7 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device,
* already mapped
*/
if (vma->vm_ops == &kgsl_gpumem_vm_ops) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return -EFAULT;
}
@@ -2755,7 +2755,7 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device,
if (fd) {
dmabuf = dma_buf_get(fd - 1);
if (IS_ERR(dmabuf)) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return PTR_ERR(dmabuf);
}
/*
@@ -2767,21 +2767,21 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device,
*/
if (dmabuf != vma->vm_file->private_data) {
dma_buf_put(dmabuf);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return -EBADF;
}
}
}
if (IS_ERR_OR_NULL(dmabuf)) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return dmabuf ? PTR_ERR(dmabuf) : -ENODEV;
}
ret = kgsl_setup_dma_buf(device, pagetable, entry, dmabuf);
if (ret) {
dma_buf_put(dmabuf);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return ret;
}
@@ -2793,7 +2793,7 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device,
else
entry->memdesc.flags &= ~((u64) KGSL_MEMFLAGS_IOCOHERENT);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return 0;
}
#else
+2 -2
View File
@@ -832,9 +832,9 @@ static void ufile_disassociate_ucontext(struct ib_ucontext *ibcontext)
}
}
down_write(&owning_mm->mmap_sem);
mmap_write_lock(owning_mm);
ib_dev->disassociate_ucontext(ibcontext);
up_write(&owning_mm->mmap_sem);
mmap_write_unlock(owning_mm);
mmput(owning_mm);
put_task_struct(owning_process);
}
+13 -13
View File
@@ -147,14 +147,14 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
current->mm->pinned_vm += npages;
if ((current->mm->pinned_vm > lock_limit) && !capable(CAP_IPC_LOCK)) {
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
ret = -ENOMEM;
goto vma;
}
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
cur_base = addr & PAGE_MASK;
@@ -172,14 +172,14 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
sg_list_start = umem->sg_head.sgl;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
while (npages) {
ret = get_user_pages_longterm(cur_base,
min_t(unsigned long, npages,
PAGE_SIZE / sizeof (struct page *)),
gup_flags, page_list, vma_list);
if (ret < 0) {
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
goto umem_release;
}
@@ -197,7 +197,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
/* preparing for next loop */
sg_list_start = sg;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
umem->nmap = ib_dma_map_sg_attrs(context->device,
umem->sg_head.sgl,
@@ -216,9 +216,9 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
umem_release:
__ib_umem_release(context->device, umem, 0);
vma:
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
current->mm->pinned_vm -= ib_umem_num_pages(umem);
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
out:
if (vma_list)
free_page((unsigned long) vma_list);
@@ -234,9 +234,9 @@ static void ib_umem_account(struct work_struct *work)
{
struct ib_umem *umem = container_of(work, struct ib_umem, work);
down_write(&umem->mm->mmap_sem);
mmap_write_lock(umem->mm);
umem->mm->pinned_vm -= umem->diff;
up_write(&umem->mm->mmap_sem);
mmap_write_unlock(umem->mm);
mmput(umem->mm);
kfree(umem);
}
@@ -278,7 +278,7 @@ void ib_umem_release(struct ib_umem *umem)
* we defer the vm_locked accounting to the system workqueue.
*/
if (context->closing) {
if (!down_write_trylock(&mm->mmap_sem)) {
if (!mmap_write_trylock(mm)) {
INIT_WORK(&umem->work, ib_umem_account);
umem->mm = mm;
umem->diff = diff;
@@ -287,10 +287,10 @@ void ib_umem_release(struct ib_umem *umem)
return;
}
} else
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
mm->pinned_vm -= diff;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
mmput(mm);
out:
kfree(umem);
+5 -5
View File
@@ -352,16 +352,16 @@ int ib_umem_odp_get(struct ib_ucontext *context, struct ib_umem *umem,
struct vm_area_struct *vma;
struct hstate *h;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, ib_umem_start(umem));
if (!vma || !is_vm_hugetlb_page(vma)) {
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
ret_val = -EINVAL;
goto out_mm;
}
h = hstate_vma(vma);
umem->page_shift = huge_page_shift(h);
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
umem->hugetlb = 1;
} else {
umem->hugetlb = 0;
@@ -693,7 +693,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 user_virt, u64 bcnt,
ALIGN(bcnt, PAGE_SIZE) / PAGE_SIZE,
PAGE_SIZE / sizeof(struct page *));
down_read(&owning_mm->mmap_sem);
mmap_read_lock(owning_mm);
/*
* Note: this might result in redundent page getting. We can
* avoid this by checking dma_list to be 0 before calling
@@ -704,7 +704,7 @@ int ib_umem_odp_map_dma_pages(struct ib_umem *umem, u64 user_virt, u64 bcnt,
npages = get_user_pages_remote(owning_process, owning_mm,
user_virt, gup_num_pages,
flags, local_page_list, NULL, NULL);
up_read(&owning_mm->mmap_sem);
mmap_read_unlock(owning_mm);
if (npages < 0)
break;
+6 -6
View File
@@ -91,9 +91,9 @@ bool hfi1_can_pin_pages(struct hfi1_devdata *dd, struct mm_struct *mm,
/* Convert to number of pages */
size = DIV_ROUND_UP(size, PAGE_SIZE);
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
pinned = mm->pinned_vm;
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
/* First, check the absolute limit against all pinned pages. */
if (pinned + npages >= ulimit && !can_lock)
@@ -111,9 +111,9 @@ int hfi1_acquire_user_pages(struct mm_struct *mm, unsigned long vaddr, size_t np
if (ret < 0)
return ret;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
mm->pinned_vm += ret;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return ret;
}
@@ -130,8 +130,8 @@ void hfi1_release_user_pages(struct mm_struct *mm, struct page **p,
}
if (mm) { /* during close after signal, mm can be NULL */
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
mm->pinned_vm -= npages;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
}
}
+2 -2
View File
@@ -1390,7 +1390,7 @@ static void i40iw_set_hugetlb_values(u64 addr, struct i40iw_mr *iwmr)
struct vm_area_struct *vma;
struct hstate *h;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
vma = find_vma(current->mm, addr);
if (vma && is_vm_hugetlb_page(vma)) {
h = hstate_vma(vma);
@@ -1399,7 +1399,7 @@ static void i40iw_set_hugetlb_values(u64 addr, struct i40iw_mr *iwmr)
iwmr->page_msk = huge_page_mask(h);
}
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
/**
+2 -2
View File
@@ -380,7 +380,7 @@ static struct ib_umem *mlx4_get_umem_mr(struct ib_ucontext *context, u64 start,
if (!ib_access_writable(access_flags)) {
struct vm_area_struct *vma;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
/*
* FIXME: Ideally this would iterate over all the vmas that
* cover the memory, but for now it requires a single vma to
@@ -395,7 +395,7 @@ static struct ib_umem *mlx4_get_umem_mr(struct ib_ucontext *context, u64 start,
access_flags |= IB_ACCESS_LOCAL_WRITE;
}
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
return ib_umem_get(context, start, length, access_flags, 0);
+4 -4
View File
@@ -139,11 +139,11 @@ int qib_get_user_pages(unsigned long start_page, size_t num_pages,
{
int ret;
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
ret = __qib_get_user_pages(start_page, num_pages, p);
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
return ret;
}
@@ -151,12 +151,12 @@ int qib_get_user_pages(unsigned long start_page, size_t num_pages,
void qib_release_user_pages(struct page **p, size_t num_pages)
{
if (current->mm) /* during close after signal, mm can be NULL */
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
__qib_release_user_pages(p, num_pages, 1);
if (current->mm) {
current->mm->pinned_vm -= num_pages;
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
}
}
+7 -7
View File
@@ -59,9 +59,9 @@ static void usnic_uiom_reg_account(struct work_struct *work)
struct usnic_uiom_reg *umem = container_of(work,
struct usnic_uiom_reg, work);
down_write(&umem->mm->mmap_sem);
mmap_write_lock(umem->mm);
umem->mm->locked_vm -= umem->diff;
up_write(&umem->mm->mmap_sem);
mmap_write_unlock(umem->mm);
mmput(umem->mm);
kfree(umem);
}
@@ -136,7 +136,7 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable,
npages = PAGE_ALIGN(size + (addr & ~PAGE_MASK)) >> PAGE_SHIFT;
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
locked = npages + current->mm->pinned_vm;
lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
@@ -199,7 +199,7 @@ out:
else
current->mm->pinned_vm = locked;
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
free_page((unsigned long) page_list);
return ret;
}
@@ -459,7 +459,7 @@ void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr,
* we defer the vm_locked accounting to the system workqueue.
*/
if (ucontext->closing) {
if (!down_write_trylock(&mm->mmap_sem)) {
if (!mmap_write_trylock(mm)) {
INIT_WORK(&uiomr->work, usnic_uiom_reg_account);
uiomr->mm = mm;
uiomr->diff = diff;
@@ -468,10 +468,10 @@ void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr,
return;
}
} else
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
mm->pinned_vm -= diff;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
mmput(mm);
out:
kfree(uiomr);
+2 -2
View File
@@ -522,7 +522,7 @@ static void do_fault(struct work_struct *work)
flags |= FAULT_FLAG_WRITE;
flags |= FAULT_FLAG_REMOTE;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_extend_vma(mm, address);
if (!vma || address < vma->vm_start)
/* failed to get a vma in the right range */
@@ -534,7 +534,7 @@ static void do_fault(struct work_struct *work)
ret = handle_mm_fault(vma, address, flags);
out:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
if (ret & VM_FAULT_ERROR)
/* failed to service fault */
+2 -2
View File
@@ -629,7 +629,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
if (!mmget_not_zero(svm->mm))
goto bad_req;
down_read(&svm->mm->mmap_sem);
mmap_read_lock(svm->mm);
vma = find_extend_vma(svm->mm, address);
if (!vma || address < vma->vm_start)
goto invalid;
@@ -644,7 +644,7 @@ static irqreturn_t prq_event_thread(int irq, void *d)
result = QI_RESP_SUCCESS;
invalid:
up_read(&svm->mm->mmap_sem);
mmap_read_unlock(svm->mm);
mmput(svm->mm);
bad_req:
/* Accounting for major/minor faults? */
+2 -2
View File
@@ -537,7 +537,7 @@ int videobuf_qbuf(struct videobuf_queue *q, struct v4l2_buffer *b)
MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
if (b->memory == V4L2_MEMORY_MMAP)
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
videobuf_queue_lock(q);
retval = -EBUSY;
@@ -624,7 +624,7 @@ done:
videobuf_queue_unlock(q);
if (b->memory == V4L2_MEMORY_MMAP)
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return retval;
}
@@ -172,7 +172,7 @@ static int videobuf_dma_contig_user_get(struct videobuf_dma_contig_memory *mem,
mem->size = PAGE_ALIGN(vb->size + offset);
ret = -EINVAL;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, untagged_baddr);
if (!vma)
@@ -204,7 +204,7 @@ static int videobuf_dma_contig_user_get(struct videobuf_dma_contig_memory *mem,
}
out_up:
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return ret;
}
+2 -2
View File
@@ -203,9 +203,9 @@ static int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction,
{
int ret;
down_read(&current->mm->mmap_sem);
mmap_read_lock(current->mm);
ret = videobuf_dma_init_user_locked(dma, direction, data, size);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
return ret;
}
+2 -2
View File
@@ -211,7 +211,7 @@ static int get_vma_info(struct mm_struct *mm, u64 addr,
struct vm_area_struct *vma = NULL;
int rc = 0;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = find_vma(mm, addr);
if (!vma) {
@@ -222,7 +222,7 @@ static int get_vma_info(struct mm_struct *mm, u64 addr,
*vma_start = vma->vm_start;
*vma_end = vma->vm_end;
out:
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return rc;
}
+2 -2
View File
@@ -325,7 +325,7 @@ static void cxl_prefault_vma(struct cxl_context *ctx)
return;
}
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
for (vma = mm->mmap; vma; vma = vma->vm_next) {
for (ea = vma->vm_start; ea < vma->vm_end;
ea = next_segment(ea, slb.vsid)) {
@@ -340,7 +340,7 @@ static void cxl_prefault_vma(struct cxl_context *ctx)
last_esid = slb.esid;
}
}
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
mmput(mm);
}
+6 -6
View File
@@ -277,16 +277,16 @@ __scif_dec_pinned_vm_lock(struct mm_struct *mm,
if (!mm || !nr_pages || !scif_ulimit_check)
return 0;
if (try_lock) {
if (!down_write_trylock(&mm->mmap_sem)) {
if (!mmap_write_trylock(mm)) {
dev_err(scif_info.mdev.this_device,
"%s %d err\n", __func__, __LINE__);
return -1;
}
} else {
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
}
mm->pinned_vm -= nr_pages;
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return 0;
}
@@ -1385,11 +1385,11 @@ int __scif_pin_pages(void *addr, size_t len, int *out_prot,
prot |= SCIF_PROT_WRITE;
retry:
mm = current->mm;
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
if (ulimit) {
err = __scif_check_inc_pinned_vm(mm, nr_pages);
if (err) {
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
pinned_pages->nr_pages = 0;
goto error_unmap;
}
@@ -1401,7 +1401,7 @@ retry:
(prot & SCIF_PROT_WRITE) ? FOLL_WRITE : 0,
pinned_pages->pages,
NULL);
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
if (nr_pages != pinned_pages->nr_pages) {
if (pinned_pages->nr_pages < 0)
pinned_pages->nr_pages = 0;
+8 -8
View File
@@ -82,14 +82,14 @@ static struct gru_thread_state *gru_find_lock_gts(unsigned long vaddr)
struct vm_area_struct *vma;
struct gru_thread_state *gts = NULL;
down_read(&mm->mmap_sem);
mmap_read_lock(mm);
vma = gru_find_vma(vaddr);
if (vma)
gts = gru_find_thread_state(vma, TSID(vaddr, vma));
if (gts)
mutex_lock(&gts->ts_ctxlock);
else
up_read(&mm->mmap_sem);
mmap_read_unlock(mm);
return gts;
}
@@ -99,7 +99,7 @@ static struct gru_thread_state *gru_alloc_locked_gts(unsigned long vaddr)
struct vm_area_struct *vma;
struct gru_thread_state *gts = ERR_PTR(-EINVAL);
down_write(&mm->mmap_sem);
mmap_write_lock(mm);
vma = gru_find_vma(vaddr);
if (!vma)
goto err;
@@ -108,11 +108,11 @@ static struct gru_thread_state *gru_alloc_locked_gts(unsigned long vaddr)
if (IS_ERR(gts))
goto err;
mutex_lock(&gts->ts_ctxlock);
downgrade_write(&mm->mmap_sem);
mmap_write_downgrade(mm);
return gts;
err:
up_write(&mm->mmap_sem);
mmap_write_unlock(mm);
return gts;
}
@@ -122,7 +122,7 @@ err:
static void gru_unlock_gts(struct gru_thread_state *gts)
{
mutex_unlock(&gts->ts_ctxlock);
up_read(&current->mm->mmap_sem);
mmap_read_unlock(current->mm);
}
/*
@@ -588,9 +588,9 @@ static irqreturn_t gru_intr(int chiplet, int blade)
*/
gts->ustats.fmm_tlbmiss++;
if (!gts->ts_force_cch_reload &&
down_read_trylock(&gts->ts_mm->mmap_sem)) {
mmap_read_trylock(gts->ts_mm)) {
gru_try_dropin(gru, gts, tfh, NULL);
up_read(&gts->ts_mm->mmap_sem);
mmap_read_unlock(gts->ts_mm);
} else {
tfh_user_polling_mode(tfh);
STAT(intr_mm_lock_failed);
+2 -2
View File
@@ -148,7 +148,7 @@ static int gru_create_new_context(unsigned long arg)
if (!(req.options & GRU_OPT_MISS_MASK))
req.options |= GRU_OPT_MISS_FMM_INTR;
down_write(&current->mm->mmap_sem);
mmap_write_lock(current->mm);
vma = gru_find_vma(req.gseg);
if (vma) {
vdata = vma->vm_private_data;
@@ -159,7 +159,7 @@ static int gru_create_new_context(unsigned long arg)
vdata->vd_tlb_preload_count = req.tlb_preload_count;
ret = 0;
}
up_write(&current->mm->mmap_sem);
mmap_write_unlock(current->mm);
return ret;
}
Loaded 100 of 156 files, more files were not shown because too many files have changed in this diff. Show more