Commit f39dcd53 authored by Ding Tianhong's avatar Ding Tianhong Committed by Yang Yingliang
Browse files

arm64/ascend: Don't use the DvPP mmap space for svm.



ascend inclusion
category: feature
bugzilla: NA
CVE: NA

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

The svm_get_unmapped_area is only used for real time service(RTS),
the interface should not alloc virtual address from the DvPP mmap
space, so add restrictions to avoid this..

Signed-off-by: default avatarJiankang Chen <chenjiankang1@huawei.com>
Signed-off-by: default avatarZhou Guanghui <zhouguanghui1@huawei.com>
Signed-off-by: default avatarChen Jun <chenjun102@huawei.com>
Signed-off-by: default avatarLijun Fang <fanglijun3@huawei.com>
Signed-off-by: default avatarDing Tianhong <dingtianhong@huawei.com>
Reviewed-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
parent 97f31b31
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -1500,6 +1500,10 @@ static unsigned long svm_get_unmapped_area(struct file *file,
		struct vm_area_struct *vma = NULL;

		addr = ALIGN(addr, len);

		if (dvpp_mmap_check(addr, len, flags))
			return -ENOMEM;

		vma = find_vma(mm, addr);
		if (TASK_SIZE - len >= addr && addr >= mmap_min_addr &&
		   (vma == NULL || addr + len <= vm_start_gap(vma)))
@@ -1509,16 +1513,22 @@ static unsigned long svm_get_unmapped_area(struct file *file,
	info.flags = VM_UNMAPPED_AREA_TOPDOWN;
	info.length = len;
	info.low_limit = max(PAGE_SIZE, mmap_min_addr);
	info.high_limit = mm->mmap_base;
	info.high_limit = ((mm->mmap_base <= DVPP_MMAP_BASE) ?
			   mm->mmap_base : DVPP_MMAP_BASE);
	info.align_mask = ((len >> PAGE_SHIFT) - 1) << PAGE_SHIFT;
	info.align_offset = pgoff << PAGE_SHIFT;

	addr = vm_unmapped_area(&info);

	if (offset_in_page(addr)) {
		VM_BUG_ON(addr != -ENOMEM);
		info.flags = 0;
		info.low_limit = TASK_UNMAPPED_BASE;
		info.high_limit = TASK_SIZE;
		info.high_limit = DVPP_MMAP_BASE;

		if (enable_map_dvpp)
			dvpp_mmap_get_area(info);

		addr = vm_unmapped_area(&info);
	}