Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

VM: add "vm_munmap()" helper function

Like the vm_brk() function, this is the same as "do_munmap()", except it
does the VM locking for the caller.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+28 -36
+3 -8
arch/ia64/kernel/perfmon.c
··· 605 605 } 606 606 607 607 static inline unsigned int 608 - pfm_do_munmap(struct mm_struct *mm, unsigned long addr, size_t len, int acct) 608 + pfm_vm_munmap(struct mm_struct *mm, unsigned long addr, size_t len) 609 609 { 610 - return do_munmap(mm, addr, len); 610 + return vm_munmap(mm, addr, len); 611 611 } 612 612 613 613 static inline unsigned long ··· 1473 1473 /* 1474 1474 * does the actual unmapping 1475 1475 */ 1476 - down_write(&task->mm->mmap_sem); 1476 + r = pfm_vm_munmap(task->mm, (unsigned long)vaddr, size); 1477 1477 1478 - DPRINT(("down_write done smpl_vaddr=%p size=%lu\n", vaddr, size)); 1479 - 1480 - r = pfm_do_munmap(task->mm, (unsigned long)vaddr, size, 0); 1481 - 1482 - up_write(&task->mm->mmap_sem); 1483 1478 if (r !=0) { 1484 1479 printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size); 1485 1480 }
+1 -6
arch/sparc/kernel/sys_sparc_64.c
··· 566 566 567 567 SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) 568 568 { 569 - long ret; 570 - 571 569 if (invalid_64bit_range(addr, len)) 572 570 return -EINVAL; 573 571 574 - down_write(&current->mm->mmap_sem); 575 - ret = do_munmap(current->mm, addr, len); 576 - up_write(&current->mm->mmap_sem); 577 - return ret; 572 + return vm_munmap(current->mm, addr, len); 578 573 } 579 574 580 575 extern unsigned long do_mremap(unsigned long addr,
+1 -3
arch/x86/kvm/x86.c
··· 6366 6366 if (!user_alloc && !old.user_alloc && old.rmap && !npages) { 6367 6367 int ret; 6368 6368 6369 - down_write(&current->mm->mmap_sem); 6370 - ret = do_munmap(current->mm, old.userspace_addr, 6369 + ret = vm_munmap(current->mm, old.userspace_addr, 6371 6370 old.npages * PAGE_SIZE); 6372 - up_write(&current->mm->mmap_sem); 6373 6371 if (ret < 0) 6374 6372 printk(KERN_WARNING 6375 6373 "kvm_vm_ioctl_set_memory_region: "
+1 -3
drivers/gpu/drm/i810/i810_dma.c
··· 157 157 if (buf_priv->currently_mapped != I810_BUF_MAPPED) 158 158 return -EINVAL; 159 159 160 - down_write(&current->mm->mmap_sem); 161 - retcode = do_munmap(current->mm, 160 + retcode = vm_munmap(current->mm, 162 161 (unsigned long)buf_priv->virtual, 163 162 (size_t) buf->total); 164 - up_write(&current->mm->mmap_sem); 165 163 166 164 buf_priv->currently_mapped = I810_BUF_UNMAPPED; 167 165 buf_priv->virtual = NULL;
+2 -5
fs/aio.c
··· 92 92 for (i=0; i<info->nr_pages; i++) 93 93 put_page(info->ring_pages[i]); 94 94 95 - if (info->mmap_size) { 96 - down_write(&ctx->mm->mmap_sem); 97 - do_munmap(ctx->mm, info->mmap_base, info->mmap_size); 98 - up_write(&ctx->mm->mmap_sem); 99 - } 95 + if (info->mmap_size) 96 + vm_munmap(ctx->mm, info->mmap_base, info->mmap_size); 100 97 101 98 if (info->ring_pages && info->ring_pages != info->internal_pages) 102 99 kfree(info->ring_pages);
+1
include/linux/mm.h
··· 1417 1417 1418 1418 /* These take the mm semaphore themselves */ 1419 1419 extern unsigned long vm_brk(unsigned long, unsigned long); 1420 + extern int vm_munmap(struct mm_struct *, unsigned long, size_t); 1420 1421 1421 1422 /* truncate.c */ 1422 1423 extern void truncate_inode_pages(struct address_space *, loff_t);
+12 -9
mm/mmap.c
··· 2107 2107 2108 2108 return 0; 2109 2109 } 2110 - 2111 2110 EXPORT_SYMBOL(do_munmap); 2111 + 2112 + int vm_munmap(struct mm_struct *mm, unsigned long start, size_t len) 2113 + { 2114 + int ret; 2115 + 2116 + down_write(&mm->mmap_sem); 2117 + ret = do_munmap(mm, start, len); 2118 + up_write(&mm->mmap_sem); 2119 + return ret; 2120 + } 2121 + EXPORT_SYMBOL(vm_munmap); 2112 2122 2113 2123 SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) 2114 2124 { 2115 - int ret; 2116 - struct mm_struct *mm = current->mm; 2117 - 2118 2125 profile_munmap(addr); 2119 - 2120 - down_write(&mm->mmap_sem); 2121 - ret = do_munmap(mm, addr, len); 2122 - up_write(&mm->mmap_sem); 2123 - return ret; 2126 + return vm_munmap(current->mm, addr, len); 2124 2127 } 2125 2128 2126 2129 static inline void verify_mm_writelocked(struct mm_struct *mm)
+7 -2
mm/nommu.c
··· 1709 1709 } 1710 1710 EXPORT_SYMBOL(do_munmap); 1711 1711 1712 - SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) 1712 + int vm_munmap(struct mm_struct *mm, unsigned long addr, size_t len) 1713 1713 { 1714 1714 int ret; 1715 - struct mm_struct *mm = current->mm; 1716 1715 1717 1716 down_write(&mm->mmap_sem); 1718 1717 ret = do_munmap(mm, addr, len); 1719 1718 up_write(&mm->mmap_sem); 1720 1719 return ret; 1720 + } 1721 + EXPORT_SYMBOL(vm_munmap); 1722 + 1723 + SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) 1724 + { 1725 + return vm_munmap(current->mm, addr, len); 1721 1726 } 1722 1727 1723 1728 /*