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