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>
This commit is contained in:
parent
e4eb1ff61b
commit
a46ef99d80
|
@ -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
|
||||||
/*
|
/*
|
||||||
* 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 @@ out:
|
||||||
|
|
||||||
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(¤t->mm->mmap_sem);
|
return vm_munmap(current->mm, addr, len);
|
||||||
ret = do_munmap(current->mm, addr, len);
|
|
||||||
up_write(¤t->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,
|
||||||
if (!user_alloc && !old.user_alloc && old.rmap && !npages) {
|
if (!user_alloc && !old.user_alloc && old.rmap && !npages) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
down_write(¤t->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(¤t->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)
|
||||||
if (buf_priv->currently_mapped != I810_BUF_MAPPED)
|
if (buf_priv->currently_mapped != I810_BUF_MAPPED)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
down_write(¤t->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(¤t->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;
|
||||||
|
|
7
fs/aio.c
7
fs/aio.c
|
@ -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);
|
||||||
|
|
||||||
/* 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);
|
||||||
|
|
21
mm/mmap.c
21
mm/mmap.c
|
@ -2107,20 +2107,23 @@ 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);
|
||||||
|
|
||||||
|
int vm_munmap(struct mm_struct *mm, unsigned long start, size_t len)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
down_write(&mm->mmap_sem);
|
||||||
|
ret = do_munmap(mm, start, len);
|
||||||
|
up_write(&mm->mmap_sem);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(vm_munmap);
|
||||||
|
|
||||||
SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
|
SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
struct mm_struct *mm = current->mm;
|
|
||||||
|
|
||||||
profile_munmap(addr);
|
profile_munmap(addr);
|
||||||
|
return vm_munmap(current->mm, addr, len);
|
||||||
down_write(&mm->mmap_sem);
|
|
||||||
ret = do_munmap(mm, addr, len);
|
|
||||||
up_write(&mm->mmap_sem);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void verify_mm_writelocked(struct mm_struct *mm)
|
static inline void verify_mm_writelocked(struct mm_struct *mm)
|
||||||
|
|
|
@ -1709,16 +1709,21 @@ erase_whole_vma:
|
||||||
}
|
}
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue