diff --git a/include/linux/share_pool.h b/include/linux/share_pool.h index 37a26487a7d8c114675fb5a59c255d95a82d2601..3a56238c8a4d145b043d370afefaf2fd35b40dd7 100644 --- a/include/linux/share_pool.h +++ b/include/linux/share_pool.h @@ -262,6 +262,16 @@ static inline bool sp_is_enabled(void) return static_branch_likely(&share_pool_enabled_key); } +static inline void sp_area_work_around(struct vm_unmapped_area_info *info, + unsigned long flags) +{ + /* the MAP_DVPP couldn't work with MAP_SHARE_POOL. In addition, the + * address ranges corresponding to the two flags must not overlap. + */ + if (sp_is_enabled() && !(flags & MAP_DVPP)) + info->high_limit = min(info->high_limit, MMAP_SHARE_POOL_START); +} + #else /* CONFIG_ASCEND_SHARE_POOL */ static inline int mg_sp_group_add_task(int pid, unsigned long prot, int spg_id) @@ -442,7 +452,7 @@ static inline bool sp_is_enabled(void) return false; } -static inline void sp_area_work_around(struct vm_unmapped_area_info *info) +static inline void sp_area_work_around(struct vm_unmapped_area_info *info, unsigned long flags) { } diff --git a/mm/mmap.c b/mm/mmap.c index 0af1300734a2f0db06848ce03cb2e737f5f84aa7..d5a97a56dca7b9e1d2a5ac9f7cffdf456d97c43c 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -2450,6 +2451,8 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, if (enable_mmap_dvpp) dvpp_mmap_get_area(&info, flags); + sp_area_work_around(&info, flags); + return vm_unmapped_area(&info); } #endif @@ -2500,6 +2503,8 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr, if (enable_mmap_dvpp) dvpp_mmap_get_area(&info, flags); + sp_area_work_around(&info, flags); + addr = vm_unmapped_area(&info); /* @@ -2517,6 +2522,8 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr, if (enable_mmap_dvpp) dvpp_mmap_get_area(&info, flags); + sp_area_work_around(&info, flags); + addr = vm_unmapped_area(&info); } diff --git a/mm/util.c b/mm/util.c index 2350c064abc6262b03e3603b9f1845906110c6f0..d31820abadb4b6fe37a2b6397bedc1907622dcfa 100644 --- a/mm/util.c +++ b/mm/util.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -392,6 +393,9 @@ static unsigned long mmap_base(unsigned long rnd, struct rlimit *rlim_stack) else if (gap > MAX_GAP) gap = MAX_GAP; + if (sp_is_enabled()) + return ALIGN_DOWN(MMAP_SHARE_POOL_START - rnd, PAGE_SIZE); + return PAGE_ALIGN(STACK_TOP - gap - rnd); }