From: Wang Wensheng <wangwensheng4@huawei.com> Offering: HULK hulk inclusion category: feature bugzilla: NA ---------------------------------------- If dvpp_mapping_global is true, we use a global sp_mapping for all dvpp mappings. This feature is disabled on default and is used in mdc scene. Signed-off-by: Wang Wensheng <wangwensheng4@huawei.com> --- mm/share_pool.c | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/mm/share_pool.c b/mm/share_pool.c index 1e417a117838..8965625cfe63 100644 --- a/mm/share_pool.c +++ b/mm/share_pool.c @@ -91,6 +91,9 @@ static DEFINE_MUTEX(spm_list_lock); /* mutex to protect hugepage allocator registration */ static DEFINE_MUTEX(sp_hugepage_reg_mutex); +/* Dvpp mapping global */ +static int __read_mostly dvpp_mapping_global; + #define SEQ_printf(m, x...) \ do { \ if (m) \ @@ -303,6 +306,7 @@ static void sp_mapping_set_type(struct sp_mapping *spm, unsigned long type) static struct sp_mapping *sp_mapping_normal; static struct sp_mapping *sp_mapping_ro; +static struct sp_mapping *sp_mapping_dvpp; static void sp_mapping_range_init(struct sp_mapping *spm) { @@ -1654,7 +1658,10 @@ static struct sp_area *sp_area_alloc(unsigned long size, unsigned long flags, } mapping = sp_mapping_ro; } else if (flags & SP_DVPP) { - mapping = spg->dvpp_mapping; + if (dvpp_mapping_global) + mapping = sp_mapping_dvpp; + else + mapping = spg->dvpp_mapping; } else { mapping = sp_mapping_normal; } @@ -3258,7 +3265,10 @@ bool mg_sp_config_dvpp_range(size_t start, size_t size, int device_id, int tgid) if (IS_ERR(spg)) goto put_mm; - spm = spg->dvpp_mapping; + if (dvpp_mapping_global) + spm = sp_mapping_dvpp; + else + spm = spg->dvpp_mapping; default_start = MMAP_SHARE_POOL_DVPP_START + device_id * MMAP_SHARE_POOL_16G_SIZE; /* The dvpp range of each group can be configured only once */ if (spm->start[device_id] != default_start) @@ -3435,10 +3445,14 @@ static void spa_dvpp_stat_show(struct seq_file *seq) { struct sp_mapping *spm; - mutex_lock(&spm_list_lock); - list_for_each_entry(spm, &spm_dvpp_list, spm_node) - spa_stat_of_mapping_show(seq, spm); - mutex_unlock(&spm_list_lock); + if (dvpp_mapping_global) { + spa_stat_of_mapping_show(seq, sp_mapping_dvpp); + } else { + mutex_lock(&spm_list_lock); + list_for_each_entry(spm, &spm_dvpp_list, spm_node) + spa_stat_of_mapping_show(seq, spm); + mutex_unlock(&spm_list_lock); + } } @@ -3678,6 +3692,13 @@ void __sp_mm_clean(struct mm_struct *mm) DEFINE_STATIC_KEY_FALSE(share_pool_enabled_key); +static int __init enable_dvpp_mapping_global(char *s) +{ + dvpp_mapping_global = 1; + return 1; +} +__setup("dvpp_mapping_global", enable_dvpp_mapping_global); + static int __init enable_share_pool(char *s) { static_branch_enable(&share_pool_enabled_key); @@ -3700,10 +3721,20 @@ static int __init share_pool_init(void) if (!sp_mapping_ro) goto free_normal; + if (dvpp_mapping_global) { + sp_mapping_dvpp = sp_mapping_create(SP_MAPPING_DVPP); + if (!sp_mapping_dvpp) { + sp_mapping_dvpp = NULL; + goto free_ro; + } + } + proc_sharepool_init(); return 0; +free_ro: + kfree(sp_mapping_ro); free_normal: kfree(sp_mapping_normal); fail: -- 2.43.0