提交 dfd353c0 编写于 作者: F Fang Lijun 提交者: Yang Yingliang

mm: add do_vm_mmap

ascend inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I4D63I
CVE: NA

-------------------------------------------------

An interface do_vm_mmap is added to support the allocation in
the address spaces of other processes.
Signed-off-by: NFang Lijun <fanglijun3@huawei.com>
Signed-off-by: NZhou Guanghui <zhouguanghui1@huawei.com>
Reviewed-by: NWeilong Chen <chenweilong@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 3380b4a9
...@@ -2436,6 +2436,9 @@ static inline void mm_populate(unsigned long addr, unsigned long len) {} ...@@ -2436,6 +2436,9 @@ static inline void mm_populate(unsigned long addr, unsigned long len) {}
extern int __must_check vm_brk(unsigned long, unsigned long); extern int __must_check vm_brk(unsigned long, unsigned long);
extern int __must_check vm_brk_flags(unsigned long, unsigned long, unsigned long); extern int __must_check vm_brk_flags(unsigned long, unsigned long, unsigned long);
extern int vm_munmap(unsigned long, size_t); extern int vm_munmap(unsigned long, size_t);
extern unsigned long do_vm_mmap(struct mm_struct *mm, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flag, unsigned long pgoff);
extern unsigned long __must_check vm_mmap(struct file *, unsigned long, extern unsigned long __must_check vm_mmap(struct file *, unsigned long,
unsigned long, unsigned long, unsigned long, unsigned long,
unsigned long, unsigned long); unsigned long, unsigned long);
......
...@@ -3094,6 +3094,40 @@ int vm_munmap(unsigned long start, size_t len) ...@@ -3094,6 +3094,40 @@ int vm_munmap(unsigned long start, size_t len)
} }
EXPORT_SYMBOL(vm_munmap); EXPORT_SYMBOL(vm_munmap);
/*
* Must acquire an additional reference to the mm struct to prevent the
* mm struct of other process from being released.
*
* This interface is applicable only to kernel thread scenarios.
*/
unsigned long do_vm_mmap(struct mm_struct *mm, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flag, unsigned long pgoff)
{
unsigned long ret;
unsigned long populate;
LIST_HEAD(uf);
if (mm == NULL || current->mm)
return -EINVAL;
if (down_write_killable(&mm->mmap_sem))
return -EINTR;
current->mm = mm;
ret = do_mmap_pgoff(0, addr, len, prot, flag, pgoff,
&populate, &uf);
current->mm = NULL;
up_write(&mm->mmap_sem);
userfaultfd_unmap_complete(mm, &uf);
if (populate)
mm_populate(ret, populate);
return ret;
}
EXPORT_SYMBOL(do_vm_mmap);
SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
{ {
profile_munmap(addr); profile_munmap(addr);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册