Offering: HULK hulk inclusion category: feature bugzilla: NA ---------------------------------------- Introduce cmdline `sp_normal_range` to configure sharepool normal range. Example: sp_normal_range=1T@0xea0000000000 Signed-off-by: Yin Tirui <yintirui@huawei.com> --- mm/share_pool.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/mm/share_pool.c b/mm/share_pool.c index 0eb309ad38e4..90d3fa079c3a 100644 --- a/mm/share_pool.c +++ b/mm/share_pool.c @@ -337,6 +337,9 @@ static struct sp_mapping *sp_mapping_normal; static struct sp_mapping *sp_mapping_ro; static struct sp_mapping *sp_mapping_dvpp; +static unsigned long __ro_after_init sp_normal_size; +static unsigned long __ro_after_init sp_normal_start; + static void sp_mapping_range_init(struct sp_mapping *spm) { int i; @@ -348,8 +351,13 @@ static void sp_mapping_range_init(struct sp_mapping *spm) spm->end[i] = MMAP_SHARE_POOL_RO_END; break; case SP_MAPPING_NORMAL: - spm->start[i] = MMAP_SHARE_POOL_NORMAL_START; - spm->end[i] = MMAP_SHARE_POOL_NORMAL_END; + if (sp_normal_size) { + spm->start[i] = sp_normal_start; + spm->end[i] = sp_normal_start + sp_normal_size; + } else { + spm->start[i] = MMAP_SHARE_POOL_NORMAL_START; + spm->end[i] = MMAP_SHARE_POOL_NORMAL_END; + } break; case SP_MAPPING_DVPP: spm->start[i] = MMAP_SHARE_POOL_DVPP_START + i * MMAP_SHARE_POOL_16G_SIZE; @@ -4190,6 +4198,51 @@ static int __init enable_share_pool(char *s) } __setup("enable_ascend_share_pool", enable_share_pool); +static inline bool sp_normal_range_valid(unsigned long addr, unsigned long size) +{ + return addr >= MMAP_SHARE_POOL_NORMAL_START && + addr + size <= MMAP_SHARE_POOL_NORMAL_END; +} + +static int __init sp_parse_normal_range(char *p) +{ + char *oldp; + u64 start_at, mem_size; + + if (unlikely(!p)) + return -EINVAL; + + oldp = p; + mem_size = memparse(p, &p); + if (unlikely(p == oldp)) + return -EINVAL; + + if (unlikely(!mem_size)) + return -EINVAL; + + if (unlikely(*p != '@')) { + pr_err("unrecognized sp_normal_range option format.\n"); + return -EINVAL; + } + + start_at = memparse(p + 1, &p); + if (unlikely(*p != '\0')) { + pr_err("unrecognized sp_normal_range end format.\n"); + return -EINVAL; + } + + if (unlikely(!sp_normal_range_valid(start_at, mem_size))) { + pr_err("invalid sp normal range, addr: 0x%llx, size: 0x%llx\n", start_at, mem_size); + return -EINVAL; + } + + sp_normal_size = mem_size; + sp_normal_start = start_at; + + return 1; +} +__setup("sp_normal_range=", sp_parse_normal_range); + static int __init share_pool_init(void) { if (!sp_is_enabled()) -- 2.43.0