From 837e53abb95457271db7e030a4b2a11a9eca4c97 Mon Sep 17 00:00:00 2001 From: Xu Yu Date: Mon, 4 Nov 2019 16:50:49 +0800 Subject: [PATCH 0872/2944] alinux: mm, memcg: rework memory latency histogram interfaces to #26424368 There are some duplicate codes in the original implementation of memory latency histogram, such as {x, y, z}_show, and {x, y, z}_write, where x, y, z represents various types of memory latency. This reworks common codes of memory latency histogram to make it easier to add more types of memory latency later. Signed-off-by: Xu Yu Reviewed-by: Yang Shi Reviewed-by: Xunlei Pang --- include/linux/memcontrol.h | 6 +-- mm/memcontrol.c | 119 ++++++++++++--------------------------------- mm/page_alloc.c | 5 +- mm/vmscan.c | 3 +- 4 files changed, 40 insertions(+), 93 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 2393747..65aa839 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -89,9 +89,9 @@ struct mem_cgroup_reclaim_cookie { struct alloc_context; enum mem_lat_stat_item { - GLOBAL_DIRECT_RECLAIM, /* global direct reclaim latency */ - MEMCG_DIRECT_RECLAIM, /* memcg direct reclaim latency */ - DIRECT_COMPACT, /* direct compact latency */ + MEM_LAT_GLOBAL_DIRECT_RECLAIM, /* global direct reclaim latency */ + MEM_LAT_MEMCG_DIRECT_RECLAIM, /* memcg direct reclaim latency */ + MEM_LAT_DIRECT_COMPACT, /* direct compact latency */ MEM_LAT_NR_STAT, }; diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5d4e4b2..00a3f1d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4511,80 +4511,40 @@ void memcg_check_wmark_min_adj(struct task_struct *curr, } } -static void smp_global_direct_reclaim_write(void *info) -{ - struct mem_cgroup *memcg = (struct mem_cgroup *)info; - int idx = GLOBAL_DIRECT_RECLAIM; - int i; - - for (i = MEM_LAT_0_1; i < MEM_LAT_NR_COUNT; i++) - this_cpu_write(memcg->lat_stat_cpu->item[idx][i], 0); -} - -static void smp_memcg_direct_reclaim_write(void *info) -{ - struct mem_cgroup *memcg = (struct mem_cgroup *)info; - int idx = MEMCG_DIRECT_RECLAIM; - int i; - - for (i = MEM_LAT_0_1; i < MEM_LAT_NR_COUNT; i++) - this_cpu_write(memcg->lat_stat_cpu->item[idx][i], 0); -} - -static void smp_direct_compact_write(void *info) -{ - struct mem_cgroup *memcg = (struct mem_cgroup *)info; - int idx = DIRECT_COMPACT; - int i; - - for (i = MEM_LAT_0_1; i < MEM_LAT_NR_COUNT; i++) - this_cpu_write(memcg->lat_stat_cpu->item[idx][i], 0); -} +#define MEMCG_LAT_STAT_SMP_WRITE(name, sidx) \ +static void smp_write_##name(void *info) \ +{ \ + struct mem_cgroup *memcg = (struct mem_cgroup *)info; \ + int i; \ + \ + for (i = MEM_LAT_0_1; i < MEM_LAT_NR_COUNT; i++) \ + this_cpu_write(memcg->lat_stat_cpu->item[sidx][i], 0); \ +} \ + +MEMCG_LAT_STAT_SMP_WRITE(global_direct_reclaim, MEM_LAT_GLOBAL_DIRECT_RECLAIM); +MEMCG_LAT_STAT_SMP_WRITE(memcg_direct_reclaim, MEM_LAT_MEMCG_DIRECT_RECLAIM); +MEMCG_LAT_STAT_SMP_WRITE(direct_compact, MEM_LAT_DIRECT_COMPACT); smp_call_func_t smp_memcg_lat_write_funcs[] = { - smp_global_direct_reclaim_write, - smp_memcg_direct_reclaim_write, - smp_direct_compact_write, + smp_write_global_direct_reclaim, + smp_write_memcg_direct_reclaim, + smp_write_direct_compact, }; static int memcg_lat_stat_write(struct cgroup_subsys_state *css, - enum mem_lat_stat_item idx) + struct cftype *cft, u64 val) { struct mem_cgroup *memcg = mem_cgroup_from_css(css); + enum mem_lat_stat_item idx = cft->private; smp_call_func_t func = smp_memcg_lat_write_funcs[idx]; - func((void *)memcg); - smp_call_function(func, (void *)memcg, 1); - - return 0; -} - -static int global_direct_reclaim_latency_write(struct cgroup_subsys_state *css, - struct cftype *cft, u64 val) -{ if (val != 0) return -EINVAL; - return memcg_lat_stat_write(css, GLOBAL_DIRECT_RECLAIM); -} - -static int memcg_direct_reclaim_latency_write(struct cgroup_subsys_state *css, - struct cftype *cft, u64 val) -{ - if (val != 0) - return -EINVAL; - - return memcg_lat_stat_write(css, MEMCG_DIRECT_RECLAIM); -} - -static int memcg_direct_compact_latency_write( - struct cgroup_subsys_state *css, - struct cftype *cft, u64 val) -{ - if (val != 0) - return -EINVAL; + func((void *)memcg); + smp_call_function(func, (void *)memcg, 1); - return memcg_lat_stat_write(css, DIRECT_COMPACT); + return 0; } static u64 memcg_lat_stat_gather(struct mem_cgroup *memcg, @@ -4600,9 +4560,10 @@ static u64 memcg_lat_stat_gather(struct mem_cgroup *memcg, return sum; } -static void memcg_lat_stat_show(struct seq_file *m, enum mem_lat_stat_item idx) +static int memcg_lat_stat_show(struct seq_file *m, void *v) { struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); + enum mem_lat_stat_item idx = seq_cft(m)->private; seq_printf(m, "0-1ms: \t%llu\n", memcg_lat_stat_gather(memcg, idx, MEM_LAT_0_1)); @@ -4620,25 +4581,6 @@ static void memcg_lat_stat_show(struct seq_file *m, enum mem_lat_stat_item idx) memcg_lat_stat_gather(memcg, idx, MEM_LAT_1000_INF)); seq_printf(m, "total(ms): \t%llu\n", memcg_lat_stat_gather(memcg, idx, MEM_LAT_TOTAL) / 1000000); -} - -static int global_direct_reclaim_latency_show(struct seq_file *m, void *v) -{ - memcg_lat_stat_show(m, GLOBAL_DIRECT_RECLAIM); - - return 0; -} - -static int memcg_direct_reclaim_latency_show(struct seq_file *m, void *v) -{ - memcg_lat_stat_show(m, MEMCG_DIRECT_RECLAIM); - - return 0; -} - -static int memcg_direct_compact_latency_show(struct seq_file *m, void *v) -{ - memcg_lat_stat_show(m, DIRECT_COMPACT); return 0; } @@ -5586,18 +5528,21 @@ static int memory_events_local_show(struct seq_file *m, void *v) }, { .name = "direct_reclaim_global_latency", - .write_u64 = global_direct_reclaim_latency_write, - .seq_show = global_direct_reclaim_latency_show, + .private = MEM_LAT_GLOBAL_DIRECT_RECLAIM, + .write_u64 = memcg_lat_stat_write, + .seq_show = memcg_lat_stat_show, }, { .name = "direct_reclaim_memcg_latency", - .write_u64 = memcg_direct_reclaim_latency_write, - .seq_show = memcg_direct_reclaim_latency_show, + .private = MEM_LAT_MEMCG_DIRECT_RECLAIM, + .write_u64 = memcg_lat_stat_write, + .seq_show = memcg_lat_stat_show, }, { .name = "direct_compact_latency", - .write_u64 = memcg_direct_compact_latency_write, - .seq_show = memcg_direct_compact_latency_show, + .private = MEM_LAT_DIRECT_COMPACT, + .write_u64 = memcg_lat_stat_write, + .seq_show = memcg_lat_stat_show, }, { .name = "force_empty", diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 337ed97..ee9f49b 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3733,7 +3733,7 @@ void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...) prio); memalloc_noreclaim_restore(noreclaim_flag); - memcg_lat_stat_update(DIRECT_COMPACT, (ktime_get_ns() - start)); + memcg_lat_stat_update(MEM_LAT_DIRECT_COMPACT, (ktime_get_ns() - start)); psi_memstall_leave(&pflags); if (*compact_result <= COMPACT_INACTIVE) @@ -3953,7 +3953,8 @@ void fs_reclaim_release(gfp_t gfp_mask) current->reclaim_state = NULL; memalloc_noreclaim_restore(noreclaim_flag); fs_reclaim_release(gfp_mask); - memcg_lat_stat_update(GLOBAL_DIRECT_RECLAIM, (ktime_get_ns() - start)); + memcg_lat_stat_update(MEM_LAT_GLOBAL_DIRECT_RECLAIM, + (ktime_get_ns() - start)); psi_memstall_leave(&pflags); cond_resched(); diff --git a/mm/vmscan.c b/mm/vmscan.c index aa3c286..e4f506f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3488,7 +3488,8 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, nr_reclaimed = do_try_to_free_pages(zonelist, &sc); memalloc_noreclaim_restore(noreclaim_flag); - memcg_lat_stat_update(MEMCG_DIRECT_RECLAIM, (ktime_get_ns() - start)); + memcg_lat_stat_update(MEM_LAT_MEMCG_DIRECT_RECLAIM, + (ktime_get_ns() - start)); psi_memstall_leave(&pflags); trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed); -- 1.8.3.1