Commit a46ef99d authored by Linus Torvalds's avatar Linus Torvalds

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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e4eb1ff6
...@@ -605,9 +605,9 @@ pfm_unprotect_ctx_ctxsw(pfm_context_t *x, unsigned long f) ...@@ -605,9 +605,9 @@ pfm_unprotect_ctx_ctxsw(pfm_context_t *x, unsigned long f)
} }
static inline unsigned int static inline unsigned int
pfm_do_munmap(struct mm_struct *mm, unsigned long addr, size_t len, int acct) pfm_vm_munmap(struct mm_struct *mm, unsigned long addr, size_t len)
{ {
return do_munmap(mm, addr, len); return vm_munmap(mm, addr, len);
} }
static inline unsigned long static inline unsigned long
...@@ -1473,13 +1473,8 @@ pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long siz ...@@ -1473,13 +1473,8 @@ pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long siz
/* /*
* does the actual unmapping * does the actual unmapping
*/ */
down_write(&task->mm->mmap_sem); r = pfm_vm_munmap(task->mm, (unsigned long)vaddr, size);
DPRINT(("down_write done smpl_vaddr=%p size=%lu\n", vaddr, size));
r = pfm_do_munmap(task->mm, (unsigned long)vaddr, size, 0);
up_write(&task->mm->mmap_sem);
if (r !=0) { if (r !=0) {
printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size); printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size);
} }
......
...@@ -566,15 +566,10 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, ...@@ -566,15 +566,10 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len)
{ {
long ret;
if (invalid_64bit_range(addr, len)) if (invalid_64bit_range(addr, len))
return -EINVAL; return -EINVAL;
down_write(&current->mm->mmap_sem); return vm_munmap(current->mm, addr, len);
ret = do_munmap(current->mm, addr, len);
up_write(&current->mm->mmap_sem);
return ret;
} }
extern unsigned long do_mremap(unsigned long addr, extern unsigned long do_mremap(unsigned long addr,
......
...@@ -6366,10 +6366,8 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, ...@@ -6366,10 +6366,8 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
if (!user_alloc && !old.user_alloc && old.rmap && !npages) { if (!user_alloc && !old.user_alloc && old.rmap && !npages) {
int ret; int ret;
down_write(&current->mm->mmap_sem); ret = vm_munmap(current->mm, old.userspace_addr,
ret = do_munmap(current->mm, old.userspace_addr,
old.npages * PAGE_SIZE); old.npages * PAGE_SIZE);
up_write(&current->mm->mmap_sem);
if (ret < 0) if (ret < 0)
printk(KERN_WARNING printk(KERN_WARNING
"kvm_vm_ioctl_set_memory_region: " "kvm_vm_ioctl_set_memory_region: "
......
...@@ -157,11 +157,9 @@ static int i810_unmap_buffer(struct drm_buf *buf) ...@@ -157,11 +157,9 @@ static int i810_unmap_buffer(struct drm_buf *buf)
if (buf_priv->currently_mapped != I810_BUF_MAPPED) if (buf_priv->currently_mapped != I810_BUF_MAPPED)
return -EINVAL; return -EINVAL;
down_write(&current->mm->mmap_sem); retcode = vm_munmap(current->mm,
retcode = do_munmap(current->mm,
(unsigned long)buf_priv->virtual, (unsigned long)buf_priv->virtual,
(size_t) buf->total); (size_t) buf->total);
up_write(&current->mm->mmap_sem);
buf_priv->currently_mapped = I810_BUF_UNMAPPED; buf_priv->currently_mapped = I810_BUF_UNMAPPED;
buf_priv->virtual = NULL; buf_priv->virtual = NULL;
......
...@@ -92,11 +92,8 @@ static void aio_free_ring(struct kioctx *ctx) ...@@ -92,11 +92,8 @@ static void aio_free_ring(struct kioctx *ctx)
for (i=0; i<info->nr_pages; i++) for (i=0; i<info->nr_pages; i++)
put_page(info->ring_pages[i]); put_page(info->ring_pages[i]);
if (info->mmap_size) { if (info->mmap_size)
down_write(&ctx->mm->mmap_sem); vm_munmap(ctx->mm, info->mmap_base, info->mmap_size);
do_munmap(ctx->mm, info->mmap_base, info->mmap_size);
up_write(&ctx->mm->mmap_sem);
}
if (info->ring_pages && info->ring_pages != info->internal_pages) if (info->ring_pages && info->ring_pages != info->internal_pages)
kfree(info->ring_pages); kfree(info->ring_pages);
......
...@@ -1417,6 +1417,7 @@ extern int do_munmap(struct mm_struct *, unsigned long, size_t); ...@@ -1417,6 +1417,7 @@ extern int do_munmap(struct mm_struct *, unsigned long, size_t);
/* These take the mm semaphore themselves */ /* These take the mm semaphore themselves */
extern unsigned long vm_brk(unsigned long, unsigned long); extern unsigned long vm_brk(unsigned long, unsigned long);
extern int vm_munmap(struct mm_struct *, unsigned long, size_t);
/* truncate.c */ /* truncate.c */
extern void truncate_inode_pages(struct address_space *, loff_t); extern void truncate_inode_pages(struct address_space *, loff_t);
......
...@@ -2107,21 +2107,24 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) ...@@ -2107,21 +2107,24 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
return 0; return 0;
} }
EXPORT_SYMBOL(do_munmap); EXPORT_SYMBOL(do_munmap);
SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) int vm_munmap(struct mm_struct *mm, unsigned long start, size_t len)
{ {
int ret; int ret;
struct mm_struct *mm = current->mm;
profile_munmap(addr);
down_write(&mm->mmap_sem); down_write(&mm->mmap_sem);
ret = do_munmap(mm, addr, len); ret = do_munmap(mm, start, len);
up_write(&mm->mmap_sem); up_write(&mm->mmap_sem);
return ret; return ret;
} }
EXPORT_SYMBOL(vm_munmap);
SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
{
profile_munmap(addr);
return vm_munmap(current->mm, addr, len);
}
static inline void verify_mm_writelocked(struct mm_struct *mm) static inline void verify_mm_writelocked(struct mm_struct *mm)
{ {
......
...@@ -1709,16 +1709,21 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) ...@@ -1709,16 +1709,21 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
} }
EXPORT_SYMBOL(do_munmap); EXPORT_SYMBOL(do_munmap);
SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) int vm_munmap(struct mm_struct *mm, unsigned long addr, size_t len)
{ {
int ret; int ret;
struct mm_struct *mm = current->mm;
down_write(&mm->mmap_sem); down_write(&mm->mmap_sem);
ret = do_munmap(mm, addr, len); ret = do_munmap(mm, addr, len);
up_write(&mm->mmap_sem); up_write(&mm->mmap_sem);
return ret; return ret;
} }
EXPORT_SYMBOL(vm_munmap);
SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
{
return vm_munmap(current->mm, addr, len);
}
/* /*
* release all the mappings made in a process's VM space * release all the mappings made in a process's VM space
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment