From: l00536735 <lihaoxiang@huawei.com> --- mm/share_pool.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/mm/share_pool.c b/mm/share_pool.c index 90d3fa079c3a..ed41f0616a6e 100644 --- a/mm/share_pool.c +++ b/mm/share_pool.c @@ -70,6 +70,8 @@ #define SEC2US(sec) ((sec) * 1000000) #define NS2US(ns) ((ns) / 1000) +static int sysctl_sp_dump_enable = 1; + static int system_group_count; /* idr of all sp_groups */ @@ -2642,6 +2644,39 @@ static int sp_alloc_mmap_populate(struct sp_area *spa, struct sp_alloc_context * return mmap_ret; } +static inline void sp_oom_dump(unsigned long size, unsigned long sp_flags, + int spg_id) +{ + /* print once per 10s */ + static DEFINE_RATELIMIT_STATE(nopage_rs, DEFAULT_RATELIMIT_INTERVAL, 1); + struct mem_cgroup *memcg; + struct sp_meminfo *meminfo; + struct sp_group_master *master = NULL; + long alloc_size; + + if (!__ratelimit(&nopage_rs)) + return; + + pr_info("process %s(%d) mg_sp_alloc(0x%lx, 0x%lx, %d) failed.\n", + current->comm, current->tgid, size, sp_flags, spg_id); + + if (current->mm) + master = current->mm->sp_group_master; + + if (master) { + meminfo = &master->meminfo; + alloc_size = meminfo_alloc_sum(meminfo); + pr_info("It applied %ld aligned KB.\n", byte2kb(alloc_size)); + } + + show_mem(); + memcg = get_mem_cgroup_from_mm(current->mm); + if (memcg) { + mem_cgroup_print_oom_meminfo(memcg); + css_put(&memcg->css); + } +} + static void *__mg_sp_alloc_nodemask(unsigned long size, unsigned long sp_flags, int spg_id, nodemask_t *nodemask) { @@ -2703,9 +2738,11 @@ static void *__mg_sp_alloc_nodemask(unsigned long size, unsigned long sp_flags, out: sp_group_put(spg); - if (ret) + if (ret) { + if (ret == -ENOMEM && sysctl_sp_dump_enable) + sp_oom_dump(size, sp_flags, spg_id); return ERR_PTR(ret); - else + } else return (void *)(spa->va_start); } @@ -4243,6 +4280,18 @@ static int __init sp_parse_normal_range(char *p) } __setup("sp_normal_range=", sp_parse_normal_range); +static struct ctl_table sp_ctl_table[] = { + { + .procname = "sharepool_oom_dump_enable", + .data = &sysctl_sp_dump_enable, + .maxlen = sizeof(sysctl_sp_dump_enable), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, +}; + static int __init share_pool_init(void) { if (!sp_is_enabled()) @@ -4265,6 +4314,8 @@ static int __init share_pool_init(void) } proc_sharepool_init(); + if (!register_sysctl("sharepool", sp_ctl_table)) + pr_warn("Ascend share pool sysctl init failed.\n"); return 0; -- 2.43.0