提交 0d940005 编写于 作者: D Ding Tianhong 提交者: Yang Yingliang

arm64/ascend: set the correct dvpp mmap area when no MAP_DVPP flags

ascend inclusion
category: feature
bugzilla: NA
CVE: NA

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

The commit 4daf80d7164 ("arm64/ascend: Enable...") missed to set the
correct dvpp mmap area when the user didn't set the MAP_DVPP flags,
so add new area zone to fix this.

And fix some coding style, rename the enable_map_dvpp to
enable_mmap_dvpp.

v2: return true if the input addr is DVPP_MMAP_BASE for dvpp_mmap_zone.

Fixes: 4daf80d7164 ("arm64/ascend: Enable DvPP mmap features for Ascend Platform")
Signed-off-by: NDing Tianhong <dingtianhong@huawei.com>
Reviewed-by: NHanjun Guo <guohanjun@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 5e7cbe34
......@@ -771,7 +771,7 @@ __setup("keepinitrd", keepinitrd_setup);
static int __init ascend_enable_setup(char *__unused)
{
if (IS_ENABLED(CONFIG_ASCEND_DVPP_MMAP))
enable_map_dvpp = 1;
enable_mmap_dvpp = 1;
if (IS_ENABLED(CONFIG_ASCEND_IOPF_HIPRI))
enable_iopf_hipri = 1;
......
......@@ -103,10 +103,6 @@ void arch_pick_mmap_layout(struct mm_struct *mm, struct rlimit *rlim_stack)
mm->get_unmapped_area = arch_get_unmapped_area;
} else {
mm->mmap_base = mmap_base(random_factor, rlim_stack);
if (enable_map_dvpp && dvpp_mmap_zone(mm->mmap_base))
mm->mmap_base = DVPP_MMAP_BASE;
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
}
}
......
......@@ -1526,8 +1526,8 @@ static unsigned long svm_get_unmapped_area(struct file *file,
info.low_limit = TASK_UNMAPPED_BASE;
info.high_limit = DVPP_MMAP_BASE;
if (enable_map_dvpp)
dvpp_mmap_get_area(info);
if (enable_mmap_dvpp)
dvpp_mmap_get_area(&info, flags);
addr = vm_unmapped_area(&info);
}
......
......@@ -277,8 +277,8 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
info.align_mask = PAGE_MASK & ~huge_page_mask(h);
info.align_offset = 0;
if (enable_map_dvpp)
dvpp_mmap_get_area(info);
if (enable_mmap_dvpp)
dvpp_mmap_get_area(&info, flags);
return vm_unmapped_area(&info);
}
......
......@@ -8,7 +8,7 @@
#include <linux/atomic.h>
#include <uapi/linux/mman.h>
extern int enable_mmap_dvpp;
/*
* Enable MAP_32BIT for Ascend Platform
*/
......@@ -16,31 +16,56 @@
#define MAP_DVPP 0x200
#define DVPP_MMAP_BASE (TASK_SIZE - 0x100000000UL)
#define DVPP_MMAP_SIZE (0x100000000UL)
#define DVPP_MMAP_BASE (TASK_SIZE - DVPP_MMAP_SIZE)
#define dvpp_mmap_check(addr, len, flags) \
(((enable_map_dvpp) && (flags & MAP_DVPP) && \
(addr < DVPP_MMAP_BASE + DVPP_MMAP_SIZE) && \
(addr > DVPP_MMAP_BASE)) ? -EINVAL : 0)
static inline int dvpp_mmap_check(unsigned long addr, unsigned long len,
unsigned long flags)
{
if (enable_mmap_dvpp && (flags & MAP_DVPP) &&
(addr < DVPP_MMAP_BASE + DVPP_MMAP_SIZE) &&
(addr > DVPP_MMAP_BASE))
return -EINVAL;
else
return 0;
}
#define dvpp_mmap_get_area(info) \
({ \
(info.low_limit = DVPP_MMAP_BASE); \
(info.high_limit = DVPP_MMAP_BASE + DVPP_MMAP_SIZE); \
})
static inline void dvpp_mmap_get_area(struct vm_unmapped_area_info *info,
unsigned long flags)
{
if (flags & MAP_DVPP) {
info->low_limit = DVPP_MMAP_BASE;
info->high_limit = DVPP_MMAP_BASE + DVPP_MMAP_SIZE;
} else {
info->low_limit = max(info->low_limit, TASK_UNMAPPED_BASE);
info->high_limit = min(info->high_limit, DVPP_MMAP_BASE);
}
}
#define dvpp_mmap_zone(addr) ((addr > DVPP_MMAP_BASE) ? 1 : 0)
static inline int dvpp_mmap_zone(unsigned long addr)
{
if (addr >= DVPP_MMAP_BASE)
return 1;
else
return 0;
}
#else
#define MAP_DVPP (0)
#define dvpp_mmap_check(addr, len, flags) (0)
static inline int dvpp_mmap_check(unsigned long addr, unsigned long len,
unsigned long flags)
{
return 0;
}
#define dvpp_mmap_get_area(info) do { } while (0)
static inline void dvpp_mmap_get_area(struct vm_unmapped_area_info *info,
unsigned long flags)
{
}
#define dvpp_mmap_zone(addr) (0)
static inline int dvpp_mmap_zone(unsigned long addr) { return 0; }
#define DVPP_MMAP_BASE (0)
......@@ -48,8 +73,6 @@
#endif
extern int enable_map_dvpp;
/*
* Arrange for legacy / undefined architecture specific flags to be
* ignored by mmap handling code.
......
......@@ -2099,8 +2099,8 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
info.high_limit = TASK_SIZE;
info.align_mask = 0;
if (enable_map_dvpp)
dvpp_mmap_get_area(info);
if (enable_mmap_dvpp)
dvpp_mmap_get_area(&info, flags);
return vm_unmapped_area(&info);
}
......@@ -2148,8 +2148,8 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
info.high_limit = mm->mmap_base;
info.align_mask = 0;
if (enable_map_dvpp)
dvpp_mmap_get_area(info);
if (enable_mmap_dvpp)
dvpp_mmap_get_area(&info, flags);
addr = vm_unmapped_area(&info);
......@@ -2165,8 +2165,8 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
info.low_limit = TASK_UNMAPPED_BASE;
info.high_limit = TASK_SIZE;
if (enable_map_dvpp)
dvpp_mmap_get_area(info);
if (enable_mmap_dvpp)
dvpp_mmap_get_area(&info, flags);
addr = vm_unmapped_area(&info);
}
......@@ -3747,18 +3747,18 @@ subsys_initcall(init_reserve_notifier);
/*
* Enable the MAP_32BIT (mmaps and hugetlb).
*/
int enable_map_dvpp __read_mostly;
int enable_mmap_dvpp __read_mostly;
#ifdef CONFIG_ASCEND_DVPP_MMAP
static int __init ascend_enable_map_dvpp(char *s)
static int __init ascend_enable_mmap_dvpp(char *s)
{
enable_map_dvpp = 1;
enable_mmap_dvpp = 1;
pr_info("Ascend enable dvpp mmap features\n");
return 1;
}
__setup("enable_map_dvpp", ascend_enable_map_dvpp);
__setup("enable_mmap_dvpp", ascend_enable_mmap_dvpp);
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册