* [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-20 14:39 ` Konstantin Khlebnikov 0 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-20 14:39 UTC (permalink / raw) To: linux-mm, Andrew Morton; +Cc: linux-kernel This makes show_mem() much less verbose at huge machines. Instead of huge and almost useless dump of counters for each per-zone per-cpu lists this patch prints sum of these counters for each zone (free_pcp) and size of per-cpu list for current cpu (local_pcp). Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> --- include/linux/mm.h | 1 + mm/page_alloc.c | 32 +++++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 028565a..0538de0 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); * various contexts. */ #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ extern void show_free_areas(unsigned int flags); extern bool skip_free_areas_node(unsigned int flags, int nid); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a47f0b2..e591f3b 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) */ void show_free_areas(unsigned int filter) { + unsigned long free_pcp = 0; int cpu; struct zone *zone; for_each_populated_zone(zone) { if (skip_free_areas_node(filter, zone_to_nid(zone))) continue; - show_node(zone); - printk("%s per-cpu:\n", zone->name); + + if (filter & SHOW_MEM_PERCPU_LISTS) { + show_node(zone); + printk("%s per-cpu:\n", zone->name); + } for_each_online_cpu(cpu) { struct per_cpu_pageset *pageset; pageset = per_cpu_ptr(zone->pageset, cpu); + free_pcp += pageset->pcp.count; + + if (!(filter & SHOW_MEM_PERCPU_LISTS)) + continue; + printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", cpu, pageset->pcp.high, pageset->pcp.batch, pageset->pcp.count); @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" " active_file:%lu inactive_file:%lu isolated_file:%lu\n" - " unevictable:%lu" - " dirty:%lu writeback:%lu unstable:%lu\n" - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" - " free_cma:%lu\n", + " free:%lu free_pcp:%lu free_cma:%lu\n", global_page_state(NR_ACTIVE_ANON), global_page_state(NR_INACTIVE_ANON), global_page_state(NR_ISOLATED_ANON), @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) global_page_state(NR_FILE_DIRTY), global_page_state(NR_WRITEBACK), global_page_state(NR_UNSTABLE_NFS), - global_page_state(NR_FREE_PAGES), global_page_state(NR_SLAB_RECLAIMABLE), global_page_state(NR_SLAB_UNRECLAIMABLE), global_page_state(NR_FILE_MAPPED), global_page_state(NR_SHMEM), global_page_state(NR_PAGETABLE), global_page_state(NR_BOUNCE), + global_page_state(NR_FREE_PAGES), + free_pcp, global_page_state(NR_FREE_CMA_PAGES)); for_each_populated_zone(zone) { @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) if (skip_free_areas_node(filter, zone_to_nid(zone))) continue; + + free_pcp = 0; + for_each_online_cpu(cpu) + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; + show_node(zone); printk("%s" " free:%lukB" @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) " pagetables:%lukB" " unstable:%lukB" " bounce:%lukB" + " free_pcp:%lukB" + " local_pcp:%ukB" " free_cma:%lukB" " writeback_tmp:%lukB" " pages_scanned:%lu" @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) K(zone_page_state(zone, NR_PAGETABLE)), K(zone_page_state(zone, NR_UNSTABLE_NFS)), K(zone_page_state(zone, NR_BOUNCE)), + K(free_pcp), + K(this_cpu_read(zone->pageset->pcp.count)), K(zone_page_state(zone, NR_FREE_CMA_PAGES)), K(zone_page_state(zone, NR_WRITEBACK_TEMP)), K(zone_page_state(zone, NR_PAGES_SCANNED)), -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-20 14:39 ` Konstantin Khlebnikov 0 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-20 14:39 UTC (permalink / raw) To: linux-mm, Andrew Morton; +Cc: linux-kernel This makes show_mem() much less verbose at huge machines. Instead of huge and almost useless dump of counters for each per-zone per-cpu lists this patch prints sum of these counters for each zone (free_pcp) and size of per-cpu list for current cpu (local_pcp). Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> --- include/linux/mm.h | 1 + mm/page_alloc.c | 32 +++++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 028565a..0538de0 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); * various contexts. */ #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ extern void show_free_areas(unsigned int flags); extern bool skip_free_areas_node(unsigned int flags, int nid); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a47f0b2..e591f3b 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) */ void show_free_areas(unsigned int filter) { + unsigned long free_pcp = 0; int cpu; struct zone *zone; for_each_populated_zone(zone) { if (skip_free_areas_node(filter, zone_to_nid(zone))) continue; - show_node(zone); - printk("%s per-cpu:\n", zone->name); + + if (filter & SHOW_MEM_PERCPU_LISTS) { + show_node(zone); + printk("%s per-cpu:\n", zone->name); + } for_each_online_cpu(cpu) { struct per_cpu_pageset *pageset; pageset = per_cpu_ptr(zone->pageset, cpu); + free_pcp += pageset->pcp.count; + + if (!(filter & SHOW_MEM_PERCPU_LISTS)) + continue; + printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", cpu, pageset->pcp.high, pageset->pcp.batch, pageset->pcp.count); @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" " active_file:%lu inactive_file:%lu isolated_file:%lu\n" - " unevictable:%lu" - " dirty:%lu writeback:%lu unstable:%lu\n" - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" - " free_cma:%lu\n", + " free:%lu free_pcp:%lu free_cma:%lu\n", global_page_state(NR_ACTIVE_ANON), global_page_state(NR_INACTIVE_ANON), global_page_state(NR_ISOLATED_ANON), @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) global_page_state(NR_FILE_DIRTY), global_page_state(NR_WRITEBACK), global_page_state(NR_UNSTABLE_NFS), - global_page_state(NR_FREE_PAGES), global_page_state(NR_SLAB_RECLAIMABLE), global_page_state(NR_SLAB_UNRECLAIMABLE), global_page_state(NR_FILE_MAPPED), global_page_state(NR_SHMEM), global_page_state(NR_PAGETABLE), global_page_state(NR_BOUNCE), + global_page_state(NR_FREE_PAGES), + free_pcp, global_page_state(NR_FREE_CMA_PAGES)); for_each_populated_zone(zone) { @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) if (skip_free_areas_node(filter, zone_to_nid(zone))) continue; + + free_pcp = 0; + for_each_online_cpu(cpu) + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; + show_node(zone); printk("%s" " free:%lukB" @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) " pagetables:%lukB" " unstable:%lukB" " bounce:%lukB" + " free_pcp:%lukB" + " local_pcp:%ukB" " free_cma:%lukB" " writeback_tmp:%lukB" " pages_scanned:%lu" @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) K(zone_page_state(zone, NR_PAGETABLE)), K(zone_page_state(zone, NR_UNSTABLE_NFS)), K(zone_page_state(zone, NR_BOUNCE)), + K(free_pcp), + K(this_cpu_read(zone->pageset->pcp.count)), K(zone_page_state(zone, NR_FREE_CMA_PAGES)), K(zone_page_state(zone, NR_WRITEBACK_TEMP)), K(zone_page_state(zone, NR_PAGES_SCANNED)), ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-20 14:39 ` Konstantin Khlebnikov @ 2015-02-20 14:40 ` Konstantin Khlebnikov -1 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-20 14:40 UTC (permalink / raw) To: linux-mm, Andrew Morton; +Cc: linux-kernel On 20.02.2015 17:39, Konstantin Khlebnikov wrote: > This makes show_mem() much less verbose at huge machines. Instead of > huge and almost useless dump of counters for each per-zone per-cpu > lists this patch prints sum of these counters for each zone (free_pcp) > and size of per-cpu list for current cpu (local_pcp). Before: [ 14.569103] sysrq: SysRq : Show Memory [ 14.569599] Mem-Info: [ 14.569870] Node 0 DMA per-cpu: [ 14.570375] CPU 0: hi: 0, btch: 1 usd: 0 [ 14.570913] CPU 1: hi: 0, btch: 1 usd: 0 [ 14.571449] CPU 2: hi: 0, btch: 1 usd: 0 [ 14.571978] CPU 3: hi: 0, btch: 1 usd: 0 [ 14.572507] CPU 4: hi: 0, btch: 1 usd: 0 [ 14.573090] CPU 5: hi: 0, btch: 1 usd: 0 [ 14.573914] CPU 6: hi: 0, btch: 1 usd: 0 [ 14.574869] CPU 7: hi: 0, btch: 1 usd: 0 [ 14.575413] CPU 8: hi: 0, btch: 1 usd: 0 [ 14.576233] CPU 9: hi: 0, btch: 1 usd: 0 [ 14.577054] CPU 10: hi: 0, btch: 1 usd: 0 [ 14.577869] CPU 11: hi: 0, btch: 1 usd: 0 [ 14.578690] CPU 12: hi: 0, btch: 1 usd: 0 [ 14.579510] CPU 13: hi: 0, btch: 1 usd: 0 [ 14.580346] CPU 14: hi: 0, btch: 1 usd: 0 [ 14.581165] CPU 15: hi: 0, btch: 1 usd: 0 [ 14.582044] CPU 16: hi: 0, btch: 1 usd: 0 [ 14.582903] CPU 17: hi: 0, btch: 1 usd: 0 [ 14.583727] CPU 18: hi: 0, btch: 1 usd: 0 [ 14.584544] CPU 19: hi: 0, btch: 1 usd: 0 [ 14.585362] CPU 20: hi: 0, btch: 1 usd: 0 [ 14.586178] CPU 21: hi: 0, btch: 1 usd: 0 [ 14.587103] CPU 22: hi: 0, btch: 1 usd: 0 [ 14.588099] CPU 23: hi: 0, btch: 1 usd: 0 [ 14.588914] CPU 24: hi: 0, btch: 1 usd: 0 [ 14.589735] CPU 25: hi: 0, btch: 1 usd: 0 [ 14.590553] CPU 26: hi: 0, btch: 1 usd: 0 [ 14.591401] CPU 27: hi: 0, btch: 1 usd: 0 [ 14.592215] CPU 28: hi: 0, btch: 1 usd: 0 [ 14.604465] CPU 29: hi: 0, btch: 1 usd: 0 [ 14.605291] CPU 30: hi: 0, btch: 1 usd: 0 [ 14.606113] CPU 31: hi: 0, btch: 1 usd: 0 [ 14.606931] Node 0 DMA32 per-cpu: [ 14.607718] CPU 0: hi: 186, btch: 31 usd: 84 [ 14.608945] CPU 1: hi: 186, btch: 31 usd: 119 [ 14.610359] CPU 2: hi: 186, btch: 31 usd: 158 [ 14.611785] CPU 3: hi: 186, btch: 31 usd: 35 [ 14.612615] CPU 4: hi: 186, btch: 31 usd: 121 [ 14.613463] CPU 5: hi: 186, btch: 31 usd: 155 [ 14.614291] CPU 6: hi: 186, btch: 31 usd: 130 [ 14.615128] CPU 7: hi: 186, btch: 31 usd: 77 [ 14.615944] CPU 8: hi: 186, btch: 31 usd: 159 [ 14.616921] CPU 9: hi: 186, btch: 31 usd: 119 [ 14.617756] CPU 10: hi: 186, btch: 31 usd: 100 [ 14.618649] CPU 11: hi: 186, btch: 31 usd: 37 [ 14.619483] CPU 12: hi: 186, btch: 31 usd: 66 [ 14.620309] CPU 13: hi: 186, btch: 31 usd: 69 [ 14.621345] CPU 14: hi: 186, btch: 31 usd: 182 [ 14.622295] CPU 15: hi: 186, btch: 31 usd: 127 [ 14.623196] CPU 16: hi: 186, btch: 31 usd: 106 [ 14.624029] CPU 17: hi: 186, btch: 31 usd: 90 [ 14.624848] CPU 18: hi: 186, btch: 31 usd: 161 [ 14.625677] CPU 19: hi: 186, btch: 31 usd: 71 [ 14.626503] CPU 20: hi: 186, btch: 31 usd: 86 [ 14.627328] CPU 21: hi: 186, btch: 31 usd: 159 [ 14.628176] CPU 22: hi: 186, btch: 31 usd: 74 [ 14.633389] CPU 23: hi: 186, btch: 31 usd: 111 [ 14.635477] CPU 24: hi: 186, btch: 31 usd: 156 [ 14.636926] CPU 25: hi: 186, btch: 31 usd: 144 [ 14.638054] CPU 26: hi: 186, btch: 31 usd: 87 [ 14.638903] CPU 27: hi: 186, btch: 31 usd: 50 [ 14.639826] CPU 28: hi: 186, btch: 31 usd: 82 [ 14.640694] CPU 29: hi: 186, btch: 31 usd: 166 [ 14.641607] CPU 30: hi: 186, btch: 31 usd: 85 [ 14.642862] CPU 31: hi: 186, btch: 31 usd: 0 [ 14.644891] Node 1 DMA32 per-cpu: [ 14.646254] CPU 0: hi: 186, btch: 31 usd: 126 [ 14.647110] CPU 1: hi: 186, btch: 31 usd: 107 [ 14.647942] CPU 2: hi: 186, btch: 31 usd: 125 [ 14.648788] CPU 3: hi: 186, btch: 31 usd: 42 [ 14.649696] CPU 4: hi: 186, btch: 31 usd: 0 [ 14.650522] CPU 5: hi: 186, btch: 31 usd: 90 [ 14.651351] CPU 6: hi: 186, btch: 31 usd: 132 [ 14.652173] CPU 7: hi: 186, btch: 31 usd: 103 [ 14.653000] CPU 8: hi: 186, btch: 31 usd: 106 [ 14.654050] CPU 9: hi: 186, btch: 31 usd: 133 [ 14.655265] CPU 10: hi: 186, btch: 31 usd: 86 [ 14.656131] CPU 11: hi: 186, btch: 31 usd: 100 [ 14.657017] CPU 12: hi: 186, btch: 31 usd: 131 [ 14.657841] CPU 13: hi: 186, btch: 31 usd: 106 [ 14.659426] CPU 14: hi: 186, btch: 31 usd: 158 [ 14.660518] CPU 15: hi: 186, btch: 31 usd: 172 [ 14.662480] CPU 16: hi: 186, btch: 31 usd: 70 [ 14.663907] CPU 17: hi: 186, btch: 31 usd: 125 [ 14.665075] CPU 18: hi: 186, btch: 31 usd: 99 [ 14.666047] CPU 19: hi: 186, btch: 31 usd: 163 [ 14.667067] CPU 20: hi: 186, btch: 31 usd: 69 [ 14.668054] CPU 21: hi: 186, btch: 31 usd: 96 [ 14.668959] CPU 22: hi: 186, btch: 31 usd: 57 [ 14.669810] CPU 23: hi: 186, btch: 31 usd: 93 [ 14.670675] CPU 24: hi: 186, btch: 31 usd: 0 [ 14.671563] CPU 25: hi: 186, btch: 31 usd: 78 [ 14.672405] CPU 26: hi: 186, btch: 31 usd: 19 [ 14.673262] CPU 27: hi: 186, btch: 31 usd: 112 [ 14.674107] CPU 28: hi: 186, btch: 31 usd: 26 [ 14.675232] CPU 29: hi: 186, btch: 31 usd: 172 [ 14.676856] CPU 30: hi: 186, btch: 31 usd: 143 [ 14.678591] CPU 31: hi: 186, btch: 31 usd: 52 [ 14.679443] Node 2 DMA32 per-cpu: [ 14.680194] CPU 0: hi: 186, btch: 31 usd: 33 [ 14.681016] CPU 1: hi: 186, btch: 31 usd: 9 [ 14.681826] CPU 2: hi: 186, btch: 31 usd: 94 [ 14.682651] CPU 3: hi: 186, btch: 31 usd: 103 [ 14.683526] CPU 4: hi: 186, btch: 31 usd: 119 [ 14.684350] CPU 5: hi: 186, btch: 31 usd: 178 [ 14.685392] CPU 6: hi: 186, btch: 31 usd: 113 [ 14.686369] CPU 7: hi: 186, btch: 31 usd: 73 [ 14.687497] CPU 8: hi: 186, btch: 31 usd: 111 [ 14.688450] CPU 9: hi: 186, btch: 31 usd: 71 [ 14.690070] CPU 10: hi: 186, btch: 31 usd: 138 [ 14.693257] CPU 11: hi: 186, btch: 31 usd: 54 [ 14.694500] CPU 12: hi: 186, btch: 31 usd: 127 [ 14.695718] CPU 13: hi: 186, btch: 31 usd: 19 [ 14.696564] CPU 14: hi: 186, btch: 31 usd: 74 [ 14.697522] CPU 15: hi: 186, btch: 31 usd: 175 [ 14.698350] CPU 16: hi: 186, btch: 31 usd: 174 [ 14.699191] CPU 17: hi: 186, btch: 31 usd: 183 [ 14.700033] CPU 18: hi: 186, btch: 31 usd: 112 [ 14.700846] CPU 19: hi: 186, btch: 31 usd: 167 [ 14.701674] CPU 20: hi: 186, btch: 31 usd: 104 [ 14.702502] CPU 21: hi: 186, btch: 31 usd: 173 [ 14.703345] CPU 22: hi: 186, btch: 31 usd: 142 [ 14.704179] CPU 23: hi: 186, btch: 31 usd: 102 [ 14.704993] CPU 24: hi: 186, btch: 31 usd: 68 [ 14.705828] CPU 25: hi: 186, btch: 31 usd: 43 [ 14.706703] CPU 26: hi: 186, btch: 31 usd: 37 [ 14.707559] CPU 27: hi: 186, btch: 31 usd: 85 [ 14.708720] CPU 28: hi: 186, btch: 31 usd: 109 [ 14.710113] CPU 29: hi: 186, btch: 31 usd: 166 [ 14.711511] CPU 30: hi: 186, btch: 31 usd: 126 [ 14.712356] CPU 31: hi: 186, btch: 31 usd: 0 [ 14.713184] Node 3 DMA32 per-cpu: [ 14.713936] CPU 0: hi: 186, btch: 31 usd: 13 [ 14.714769] CPU 1: hi: 186, btch: 31 usd: 119 [ 14.715628] CPU 2: hi: 186, btch: 31 usd: 7 [ 14.716636] CPU 3: hi: 186, btch: 31 usd: 119 [ 14.717458] CPU 4: hi: 186, btch: 31 usd: 86 [ 14.718311] CPU 5: hi: 186, btch: 31 usd: 176 [ 14.719445] CPU 6: hi: 186, btch: 31 usd: 149 [ 14.720859] CPU 7: hi: 186, btch: 31 usd: 144 [ 14.724217] CPU 8: hi: 186, btch: 31 usd: 130 [ 14.726105] CPU 9: hi: 186, btch: 31 usd: 68 [ 14.727386] CPU 10: hi: 186, btch: 31 usd: 73 [ 14.729419] CPU 11: hi: 186, btch: 31 usd: 120 [ 14.730988] CPU 12: hi: 186, btch: 31 usd: 88 [ 14.731891] CPU 13: hi: 186, btch: 31 usd: 41 [ 14.732736] CPU 14: hi: 186, btch: 31 usd: 183 [ 14.733562] CPU 15: hi: 186, btch: 31 usd: 63 [ 14.734388] CPU 16: hi: 186, btch: 31 usd: 181 [ 14.735216] CPU 17: hi: 186, btch: 31 usd: 170 [ 14.736182] CPU 18: hi: 186, btch: 31 usd: 35 [ 14.737543] CPU 19: hi: 186, btch: 31 usd: 48 [ 14.739037] CPU 20: hi: 186, btch: 31 usd: 85 [ 14.740433] CPU 21: hi: 186, btch: 31 usd: 172 [ 14.741478] CPU 22: hi: 186, btch: 31 usd: 31 [ 14.742444] CPU 23: hi: 186, btch: 31 usd: 76 [ 14.743292] CPU 24: hi: 186, btch: 31 usd: 0 [ 14.744147] CPU 25: hi: 186, btch: 31 usd: 80 [ 14.745051] CPU 26: hi: 186, btch: 31 usd: 47 [ 14.745863] CPU 27: hi: 186, btch: 31 usd: 54 [ 14.746688] CPU 28: hi: 186, btch: 31 usd: 99 [ 14.747647] CPU 29: hi: 186, btch: 31 usd: 176 [ 14.748558] CPU 30: hi: 186, btch: 31 usd: 0 [ 14.749754] CPU 31: hi: 186, btch: 31 usd: 152 [ 14.750863] active_anon:2243 inactive_anon:35 isolated_anon:0 [ 14.750863] active_file:4482 inactive_file:4606 isolated_file:0 [ 14.750863] unevictable:0 dirty:139 writeback:0 unstable:0 [ 14.750863] free:455653 slab_reclaimable:3463 slab_unreclaimable:7535 [ 14.750863] mapped:2080 shmem:44 pagetables:285 bounce:0 [ 14.750863] free_cma:0 [ 14.759589] Node 0 DMA free:14568kB min:44kB low:52kB high:64kB active_anon:124kB inactive_anon:0kB active_file:436kB inactive_file:264kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15992kB managed:15908kB mlocked:0kB dirty:4kB writeback:0kB mapped:208kB shmem:0kB slab_reclaimable:152kB slab_unreclaimable:328kB kernel_stack:16kB pagetables:8kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.766300] lowmem_reserve[]: 0 470 470 470 [ 14.767506] Node 0 DMA32 free:442488kB min:1368kB low:1708kB high:2052kB active_anon:2400kB inactive_anon:12kB active_file:7224kB inactive_file:3812kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:507904kB managed:485120kB mlocked:0kB dirty:152kB writeback:0kB mapped:4584kB shmem:12kB slab_reclaimable:3924kB slab_unreclaimable:7668kB kernel_stack:1600kB pagetables:228kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.774390] lowmem_reserve[]: 0 0 0 0 [ 14.775481] Node 1 DMA32 free:416704kB min:1276kB low:1592kB high:1912kB active_anon:916kB inactive_anon:68kB active_file:3224kB inactive_file:2088kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:449572kB mlocked:0kB dirty:244kB writeback:0kB mapped:1572kB shmem:76kB slab_reclaimable:1920kB slab_unreclaimable:6360kB kernel_stack:1024kB pagetables:284kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.784695] lowmem_reserve[]: 0 0 0 0 [ 14.786414] Node 2 DMA32 free:464496kB min:1464kB low:1828kB high:2196kB active_anon:3712kB inactive_anon:32kB active_file:5172kB inactive_file:10548kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:515108kB mlocked:0kB dirty:152kB writeback:0kB mapped:1000kB shmem:44kB slab_reclaimable:6064kB slab_unreclaimable:8672kB kernel_stack:816kB pagetables:188kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.794710] lowmem_reserve[]: 0 0 0 0 [ 14.796172] Node 3 DMA32 free:484356kB min:1464kB low:1828kB high:2196kB active_anon:1820kB inactive_anon:28kB active_file:1872kB inactive_file:1712kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524156kB managed:514928kB mlocked:0kB dirty:4kB writeback:0kB mapped:956kB shmem:44kB slab_reclaimable:1792kB slab_unreclaimable:7112kB kernel_stack:912kB pagetables:432kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.802398] lowmem_reserve[]: 0 0 0 0 [ 14.803438] Node 0 DMA: 22*4kB (UM) 14*8kB (UEM) 8*16kB (UM) 3*32kB (UEM) 1*64kB (E) 2*128kB (UM) 2*256kB (UE) 2*512kB (UE) 2*1024kB (EM) 3*2048kB (EMR) 1*4096kB (M) = 14568kB [ 14.819021] Node 0 DMA32: 345*4kB (UEM) 302*8kB (UM) 211*16kB (UEM) 83*32kB (UM) 34*64kB (UM) 8*128kB (UEM) 2*256kB (UE) 1*512kB (U) 1*1024kB (E) 3*2048kB (UER) 103*4096kB (M) = 443108kB [ 14.823019] Node 1 DMA32: 366*4kB (UEM) 244*8kB (UEM) 135*16kB (UEM) 59*32kB (UEM) 22*64kB (UEM) 12*128kB (UM) 6*256kB (UEM) 0*512kB 2*1024kB (UE) 1*2048kB (U) 98*4096kB (MR) = 417448kB [ 14.828587] Node 2 DMA32: 350*4kB (UM) 143*8kB (UEM) 79*16kB (UEM) 56*32kB (UEM) 72*64kB (UEM) 7*128kB (EM) 5*256kB (EM) 0*512kB 2*1024kB (UE) 2*2048kB (UM) 109*4096kB (MR) = 464992kB [ 14.832611] Node 3 DMA32: 473*4kB (UEM) 249*8kB (UEM) 110*16kB (UEM) 43*32kB (UM) 12*64kB (UEM) 5*128kB (UEM) 4*256kB (UEM) 1*512kB (M) 2*1024kB (EM) 1*2048kB (M) 115*4096kB (MR) = 485100kB [ 14.836563] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.838380] Node 1 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.840264] Node 2 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.845649] Node 3 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.849683] 9131 total pagecache pages [ 14.850427] 0 pages in swap cache [ 14.851238] Swap cache stats: add 0, delete 0, find 0/0 [ 14.852112] Free swap = 999420kB [ 14.852791] Total swap = 999420kB [ 14.853479] 524157 pages RAM [ 14.854122] 0 pages HighMem/MovableOnly [ 14.854842] 28998 pages reserved After: [ 44.452524] sysrq: SysRq : Show Memory [ 44.452955] Mem-Info: [ 44.453233] active_anon:2307 inactive_anon:36 isolated_anon:0 [ 44.453233] active_file:4120 inactive_file:4623 isolated_file:0 [ 44.453233] unevictable:0 dirty:6 writeback:0 unstable:0 [ 44.453233] slab_reclaimable:3500 slab_unreclaimable:7441 [ 44.453233] mapped:2113 shmem:45 pagetables:292 bounce:0 [ 44.453233] free:456891 free_pcp:12179 free_cma:0 [ 44.456275] Node 0 DMA free:14756kB min:44kB low:52kB high:64kB active_anon:184kB inactive_anon:4kB active_file:256kB inactive_file:72kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15992kB managed:15908kB mlocked:0kB dirty:0kB writeback:0kB mapped:64kB shmem:4kB slab_reclaimable:100kB slab_unreclaimable:452kB kernel_stack:16kB pagetables:44kB unstable:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.460873] lowmem_reserve[]: 0 470 470 470 [ 44.461576] Node 0 DMA32 free:451052kB min:1368kB low:1708kB high:2052kB active_anon:2100kB inactive_anon:28kB active_file:4640kB inactive_file:1292kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:507904kB managed:485120kB mlocked:0kB dirty:12kB writeback:0kB mapped:2584kB shmem:40kB slab_reclaimable:2440kB slab_unreclaimable:8080kB kernel_stack:1712kB pagetables:296kB unstable:0kB bounce:0kB free_pcp:11164kB local_pcp:280kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.468488] lowmem_reserve[]: 0 0 0 0 [ 44.469319] Node 1 DMA32 free:414628kB min:1276kB low:1592kB high:1912kB active_anon:1664kB inactive_anon:12kB active_file:4172kB inactive_file:2104kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:449572kB mlocked:0kB dirty:4kB writeback:0kB mapped:1136kB shmem:20kB slab_reclaimable:3024kB slab_unreclaimable:6836kB kernel_stack:1184kB pagetables:372kB unstable:0kB bounce:0kB free_pcp:11512kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.479676] lowmem_reserve[]: 0 0 0 0 [ 44.482369] Node 2 DMA32 free:473636kB min:1464kB low:1828kB high:2196kB active_anon:4556kB inactive_anon:68kB active_file:3740kB inactive_file:4632kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:515108kB mlocked:0kB dirty:0kB writeback:0kB mapped:2972kB shmem:80kB slab_reclaimable:4832kB slab_unreclaimable:7432kB kernel_stack:736kB pagetables:320kB unstable:0kB bounce:0kB free_pcp:12928kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.495909] lowmem_reserve[]: 0 0 0 0 [ 44.499130] Node 3 DMA32 free:473492kB min:1464kB low:1828kB high:2196kB active_anon:724kB inactive_anon:32kB active_file:3672kB inactive_file:10392kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524156kB managed:514928kB mlocked:0kB dirty:8kB writeback:0kB mapped:1696kB shmem:36kB slab_reclaimable:3604kB slab_unreclaimable:6964kB kernel_stack:720kB pagetables:136kB unstable:0kB bounce:0kB free_pcp:13112kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.511069] lowmem_reserve[]: 0 0 0 0 [ 44.513516] Node 0 DMA: 3*4kB (UE) 5*8kB (UEM) 7*16kB (UEM) 2*32kB (UM) 1*64kB (M) 3*128kB (UEM) 3*256kB (UEM) 2*512kB (UE) 2*1024kB (EM) 3*2048kB (EMR) 1*4096kB (M) = 14756kB [ 44.519682] Node 0 DMA32: 279*4kB (UEM) 156*8kB (UM) 91*16kB (UEM) 46*32kB (UEM) 21*64kB (UEM) 4*128kB (UEM) 4*256kB (EM) 3*512kB (UEM) 1*1024kB (M) 3*2048kB (UMR) 106*4096kB (M) = 451052kB [ 44.527741] Node 1 DMA32: 373*4kB (UM) 342*8kB (UM) 212*16kB (UEM) 107*32kB (UM) 24*64kB (UM) 7*128kB (UEM) 5*256kB (UM) 3*512kB (UEM) 1*1024kB (U) 0*2048kB 97*4096kB (MR) = 414628kB [ 44.532389] Node 2 DMA32: 261*4kB (UEM) 84*8kB (UM) 71*16kB (UM) 30*32kB (UM) 19*64kB (UEM) 9*128kB (UM) 6*256kB (UEM) 2*512kB (EM) 2*1024kB (UM) 2*2048kB (UE) 112*4096kB (MR) = 473636kB [ 44.537268] Node 3 DMA32: 319*4kB (UEM) 243*8kB (UEM) 180*16kB (UM) 96*32kB (UEM) 81*64kB (UEM) 9*128kB (EM) 5*256kB (M) 4*512kB (UEM) 2*1024kB (EM) 1*2048kB (E) 110*4096kB (MR) = 473492kB [ 44.542344] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.545064] Node 1 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.547613] Node 2 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.552028] Node 3 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.559441] 8793 total pagecache pages [ 44.561298] 0 pages in swap cache [ 44.562973] Swap cache stats: add 0, delete 0, find 0/0 [ 44.564722] Free swap = 999420kB [ 44.566151] Total swap = 999420kB [ 44.567440] 524157 pages RAM [ 44.569286] 0 pages HighMem/MovableOnly [ 44.570702] 28998 pages reserved > > Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. > > Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> > --- > include/linux/mm.h | 1 + > mm/page_alloc.c | 32 +++++++++++++++++++++++++------- > 2 files changed, 26 insertions(+), 7 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 028565a..0538de0 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); > * various contexts. > */ > #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ > +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ > > extern void show_free_areas(unsigned int flags); > extern bool skip_free_areas_node(unsigned int flags, int nid); > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a47f0b2..e591f3b 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) > */ > void show_free_areas(unsigned int filter) > { > + unsigned long free_pcp = 0; > int cpu; > struct zone *zone; > > for_each_populated_zone(zone) { > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > - show_node(zone); > - printk("%s per-cpu:\n", zone->name); > + > + if (filter & SHOW_MEM_PERCPU_LISTS) { > + show_node(zone); > + printk("%s per-cpu:\n", zone->name); > + } > > for_each_online_cpu(cpu) { > struct per_cpu_pageset *pageset; > > pageset = per_cpu_ptr(zone->pageset, cpu); > > + free_pcp += pageset->pcp.count; > + > + if (!(filter & SHOW_MEM_PERCPU_LISTS)) > + continue; > + > printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", > cpu, pageset->pcp.high, > pageset->pcp.batch, pageset->pcp.count); > @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > > printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > - " unevictable:%lu" > - " dirty:%lu writeback:%lu unstable:%lu\n" > - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > - " free_cma:%lu\n", > + " free:%lu free_pcp:%lu free_cma:%lu\n", > global_page_state(NR_ACTIVE_ANON), > global_page_state(NR_INACTIVE_ANON), > global_page_state(NR_ISOLATED_ANON), > @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) > global_page_state(NR_FILE_DIRTY), > global_page_state(NR_WRITEBACK), > global_page_state(NR_UNSTABLE_NFS), > - global_page_state(NR_FREE_PAGES), > global_page_state(NR_SLAB_RECLAIMABLE), > global_page_state(NR_SLAB_UNRECLAIMABLE), > global_page_state(NR_FILE_MAPPED), > global_page_state(NR_SHMEM), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > + global_page_state(NR_FREE_PAGES), > + free_pcp, > global_page_state(NR_FREE_CMA_PAGES)); > > for_each_populated_zone(zone) { > @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) > > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > + > + free_pcp = 0; > + for_each_online_cpu(cpu) > + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; > + > show_node(zone); > printk("%s" > " free:%lukB" > @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) > " pagetables:%lukB" > " unstable:%lukB" > " bounce:%lukB" > + " free_pcp:%lukB" > + " local_pcp:%ukB" > " free_cma:%lukB" > " writeback_tmp:%lukB" > " pages_scanned:%lu" > @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) > K(zone_page_state(zone, NR_PAGETABLE)), > K(zone_page_state(zone, NR_UNSTABLE_NFS)), > K(zone_page_state(zone, NR_BOUNCE)), > + K(free_pcp), > + K(this_cpu_read(zone->pageset->pcp.count)), > K(zone_page_state(zone, NR_FREE_CMA_PAGES)), > K(zone_page_state(zone, NR_WRITEBACK_TEMP)), > K(zone_page_state(zone, NR_PAGES_SCANNED)), > -- Konstantin -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-20 14:40 ` Konstantin Khlebnikov 0 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-20 14:40 UTC (permalink / raw) To: linux-mm, Andrew Morton; +Cc: linux-kernel On 20.02.2015 17:39, Konstantin Khlebnikov wrote: > This makes show_mem() much less verbose at huge machines. Instead of > huge and almost useless dump of counters for each per-zone per-cpu > lists this patch prints sum of these counters for each zone (free_pcp) > and size of per-cpu list for current cpu (local_pcp). Before: [ 14.569103] sysrq: SysRq : Show Memory [ 14.569599] Mem-Info: [ 14.569870] Node 0 DMA per-cpu: [ 14.570375] CPU 0: hi: 0, btch: 1 usd: 0 [ 14.570913] CPU 1: hi: 0, btch: 1 usd: 0 [ 14.571449] CPU 2: hi: 0, btch: 1 usd: 0 [ 14.571978] CPU 3: hi: 0, btch: 1 usd: 0 [ 14.572507] CPU 4: hi: 0, btch: 1 usd: 0 [ 14.573090] CPU 5: hi: 0, btch: 1 usd: 0 [ 14.573914] CPU 6: hi: 0, btch: 1 usd: 0 [ 14.574869] CPU 7: hi: 0, btch: 1 usd: 0 [ 14.575413] CPU 8: hi: 0, btch: 1 usd: 0 [ 14.576233] CPU 9: hi: 0, btch: 1 usd: 0 [ 14.577054] CPU 10: hi: 0, btch: 1 usd: 0 [ 14.577869] CPU 11: hi: 0, btch: 1 usd: 0 [ 14.578690] CPU 12: hi: 0, btch: 1 usd: 0 [ 14.579510] CPU 13: hi: 0, btch: 1 usd: 0 [ 14.580346] CPU 14: hi: 0, btch: 1 usd: 0 [ 14.581165] CPU 15: hi: 0, btch: 1 usd: 0 [ 14.582044] CPU 16: hi: 0, btch: 1 usd: 0 [ 14.582903] CPU 17: hi: 0, btch: 1 usd: 0 [ 14.583727] CPU 18: hi: 0, btch: 1 usd: 0 [ 14.584544] CPU 19: hi: 0, btch: 1 usd: 0 [ 14.585362] CPU 20: hi: 0, btch: 1 usd: 0 [ 14.586178] CPU 21: hi: 0, btch: 1 usd: 0 [ 14.587103] CPU 22: hi: 0, btch: 1 usd: 0 [ 14.588099] CPU 23: hi: 0, btch: 1 usd: 0 [ 14.588914] CPU 24: hi: 0, btch: 1 usd: 0 [ 14.589735] CPU 25: hi: 0, btch: 1 usd: 0 [ 14.590553] CPU 26: hi: 0, btch: 1 usd: 0 [ 14.591401] CPU 27: hi: 0, btch: 1 usd: 0 [ 14.592215] CPU 28: hi: 0, btch: 1 usd: 0 [ 14.604465] CPU 29: hi: 0, btch: 1 usd: 0 [ 14.605291] CPU 30: hi: 0, btch: 1 usd: 0 [ 14.606113] CPU 31: hi: 0, btch: 1 usd: 0 [ 14.606931] Node 0 DMA32 per-cpu: [ 14.607718] CPU 0: hi: 186, btch: 31 usd: 84 [ 14.608945] CPU 1: hi: 186, btch: 31 usd: 119 [ 14.610359] CPU 2: hi: 186, btch: 31 usd: 158 [ 14.611785] CPU 3: hi: 186, btch: 31 usd: 35 [ 14.612615] CPU 4: hi: 186, btch: 31 usd: 121 [ 14.613463] CPU 5: hi: 186, btch: 31 usd: 155 [ 14.614291] CPU 6: hi: 186, btch: 31 usd: 130 [ 14.615128] CPU 7: hi: 186, btch: 31 usd: 77 [ 14.615944] CPU 8: hi: 186, btch: 31 usd: 159 [ 14.616921] CPU 9: hi: 186, btch: 31 usd: 119 [ 14.617756] CPU 10: hi: 186, btch: 31 usd: 100 [ 14.618649] CPU 11: hi: 186, btch: 31 usd: 37 [ 14.619483] CPU 12: hi: 186, btch: 31 usd: 66 [ 14.620309] CPU 13: hi: 186, btch: 31 usd: 69 [ 14.621345] CPU 14: hi: 186, btch: 31 usd: 182 [ 14.622295] CPU 15: hi: 186, btch: 31 usd: 127 [ 14.623196] CPU 16: hi: 186, btch: 31 usd: 106 [ 14.624029] CPU 17: hi: 186, btch: 31 usd: 90 [ 14.624848] CPU 18: hi: 186, btch: 31 usd: 161 [ 14.625677] CPU 19: hi: 186, btch: 31 usd: 71 [ 14.626503] CPU 20: hi: 186, btch: 31 usd: 86 [ 14.627328] CPU 21: hi: 186, btch: 31 usd: 159 [ 14.628176] CPU 22: hi: 186, btch: 31 usd: 74 [ 14.633389] CPU 23: hi: 186, btch: 31 usd: 111 [ 14.635477] CPU 24: hi: 186, btch: 31 usd: 156 [ 14.636926] CPU 25: hi: 186, btch: 31 usd: 144 [ 14.638054] CPU 26: hi: 186, btch: 31 usd: 87 [ 14.638903] CPU 27: hi: 186, btch: 31 usd: 50 [ 14.639826] CPU 28: hi: 186, btch: 31 usd: 82 [ 14.640694] CPU 29: hi: 186, btch: 31 usd: 166 [ 14.641607] CPU 30: hi: 186, btch: 31 usd: 85 [ 14.642862] CPU 31: hi: 186, btch: 31 usd: 0 [ 14.644891] Node 1 DMA32 per-cpu: [ 14.646254] CPU 0: hi: 186, btch: 31 usd: 126 [ 14.647110] CPU 1: hi: 186, btch: 31 usd: 107 [ 14.647942] CPU 2: hi: 186, btch: 31 usd: 125 [ 14.648788] CPU 3: hi: 186, btch: 31 usd: 42 [ 14.649696] CPU 4: hi: 186, btch: 31 usd: 0 [ 14.650522] CPU 5: hi: 186, btch: 31 usd: 90 [ 14.651351] CPU 6: hi: 186, btch: 31 usd: 132 [ 14.652173] CPU 7: hi: 186, btch: 31 usd: 103 [ 14.653000] CPU 8: hi: 186, btch: 31 usd: 106 [ 14.654050] CPU 9: hi: 186, btch: 31 usd: 133 [ 14.655265] CPU 10: hi: 186, btch: 31 usd: 86 [ 14.656131] CPU 11: hi: 186, btch: 31 usd: 100 [ 14.657017] CPU 12: hi: 186, btch: 31 usd: 131 [ 14.657841] CPU 13: hi: 186, btch: 31 usd: 106 [ 14.659426] CPU 14: hi: 186, btch: 31 usd: 158 [ 14.660518] CPU 15: hi: 186, btch: 31 usd: 172 [ 14.662480] CPU 16: hi: 186, btch: 31 usd: 70 [ 14.663907] CPU 17: hi: 186, btch: 31 usd: 125 [ 14.665075] CPU 18: hi: 186, btch: 31 usd: 99 [ 14.666047] CPU 19: hi: 186, btch: 31 usd: 163 [ 14.667067] CPU 20: hi: 186, btch: 31 usd: 69 [ 14.668054] CPU 21: hi: 186, btch: 31 usd: 96 [ 14.668959] CPU 22: hi: 186, btch: 31 usd: 57 [ 14.669810] CPU 23: hi: 186, btch: 31 usd: 93 [ 14.670675] CPU 24: hi: 186, btch: 31 usd: 0 [ 14.671563] CPU 25: hi: 186, btch: 31 usd: 78 [ 14.672405] CPU 26: hi: 186, btch: 31 usd: 19 [ 14.673262] CPU 27: hi: 186, btch: 31 usd: 112 [ 14.674107] CPU 28: hi: 186, btch: 31 usd: 26 [ 14.675232] CPU 29: hi: 186, btch: 31 usd: 172 [ 14.676856] CPU 30: hi: 186, btch: 31 usd: 143 [ 14.678591] CPU 31: hi: 186, btch: 31 usd: 52 [ 14.679443] Node 2 DMA32 per-cpu: [ 14.680194] CPU 0: hi: 186, btch: 31 usd: 33 [ 14.681016] CPU 1: hi: 186, btch: 31 usd: 9 [ 14.681826] CPU 2: hi: 186, btch: 31 usd: 94 [ 14.682651] CPU 3: hi: 186, btch: 31 usd: 103 [ 14.683526] CPU 4: hi: 186, btch: 31 usd: 119 [ 14.684350] CPU 5: hi: 186, btch: 31 usd: 178 [ 14.685392] CPU 6: hi: 186, btch: 31 usd: 113 [ 14.686369] CPU 7: hi: 186, btch: 31 usd: 73 [ 14.687497] CPU 8: hi: 186, btch: 31 usd: 111 [ 14.688450] CPU 9: hi: 186, btch: 31 usd: 71 [ 14.690070] CPU 10: hi: 186, btch: 31 usd: 138 [ 14.693257] CPU 11: hi: 186, btch: 31 usd: 54 [ 14.694500] CPU 12: hi: 186, btch: 31 usd: 127 [ 14.695718] CPU 13: hi: 186, btch: 31 usd: 19 [ 14.696564] CPU 14: hi: 186, btch: 31 usd: 74 [ 14.697522] CPU 15: hi: 186, btch: 31 usd: 175 [ 14.698350] CPU 16: hi: 186, btch: 31 usd: 174 [ 14.699191] CPU 17: hi: 186, btch: 31 usd: 183 [ 14.700033] CPU 18: hi: 186, btch: 31 usd: 112 [ 14.700846] CPU 19: hi: 186, btch: 31 usd: 167 [ 14.701674] CPU 20: hi: 186, btch: 31 usd: 104 [ 14.702502] CPU 21: hi: 186, btch: 31 usd: 173 [ 14.703345] CPU 22: hi: 186, btch: 31 usd: 142 [ 14.704179] CPU 23: hi: 186, btch: 31 usd: 102 [ 14.704993] CPU 24: hi: 186, btch: 31 usd: 68 [ 14.705828] CPU 25: hi: 186, btch: 31 usd: 43 [ 14.706703] CPU 26: hi: 186, btch: 31 usd: 37 [ 14.707559] CPU 27: hi: 186, btch: 31 usd: 85 [ 14.708720] CPU 28: hi: 186, btch: 31 usd: 109 [ 14.710113] CPU 29: hi: 186, btch: 31 usd: 166 [ 14.711511] CPU 30: hi: 186, btch: 31 usd: 126 [ 14.712356] CPU 31: hi: 186, btch: 31 usd: 0 [ 14.713184] Node 3 DMA32 per-cpu: [ 14.713936] CPU 0: hi: 186, btch: 31 usd: 13 [ 14.714769] CPU 1: hi: 186, btch: 31 usd: 119 [ 14.715628] CPU 2: hi: 186, btch: 31 usd: 7 [ 14.716636] CPU 3: hi: 186, btch: 31 usd: 119 [ 14.717458] CPU 4: hi: 186, btch: 31 usd: 86 [ 14.718311] CPU 5: hi: 186, btch: 31 usd: 176 [ 14.719445] CPU 6: hi: 186, btch: 31 usd: 149 [ 14.720859] CPU 7: hi: 186, btch: 31 usd: 144 [ 14.724217] CPU 8: hi: 186, btch: 31 usd: 130 [ 14.726105] CPU 9: hi: 186, btch: 31 usd: 68 [ 14.727386] CPU 10: hi: 186, btch: 31 usd: 73 [ 14.729419] CPU 11: hi: 186, btch: 31 usd: 120 [ 14.730988] CPU 12: hi: 186, btch: 31 usd: 88 [ 14.731891] CPU 13: hi: 186, btch: 31 usd: 41 [ 14.732736] CPU 14: hi: 186, btch: 31 usd: 183 [ 14.733562] CPU 15: hi: 186, btch: 31 usd: 63 [ 14.734388] CPU 16: hi: 186, btch: 31 usd: 181 [ 14.735216] CPU 17: hi: 186, btch: 31 usd: 170 [ 14.736182] CPU 18: hi: 186, btch: 31 usd: 35 [ 14.737543] CPU 19: hi: 186, btch: 31 usd: 48 [ 14.739037] CPU 20: hi: 186, btch: 31 usd: 85 [ 14.740433] CPU 21: hi: 186, btch: 31 usd: 172 [ 14.741478] CPU 22: hi: 186, btch: 31 usd: 31 [ 14.742444] CPU 23: hi: 186, btch: 31 usd: 76 [ 14.743292] CPU 24: hi: 186, btch: 31 usd: 0 [ 14.744147] CPU 25: hi: 186, btch: 31 usd: 80 [ 14.745051] CPU 26: hi: 186, btch: 31 usd: 47 [ 14.745863] CPU 27: hi: 186, btch: 31 usd: 54 [ 14.746688] CPU 28: hi: 186, btch: 31 usd: 99 [ 14.747647] CPU 29: hi: 186, btch: 31 usd: 176 [ 14.748558] CPU 30: hi: 186, btch: 31 usd: 0 [ 14.749754] CPU 31: hi: 186, btch: 31 usd: 152 [ 14.750863] active_anon:2243 inactive_anon:35 isolated_anon:0 [ 14.750863] active_file:4482 inactive_file:4606 isolated_file:0 [ 14.750863] unevictable:0 dirty:139 writeback:0 unstable:0 [ 14.750863] free:455653 slab_reclaimable:3463 slab_unreclaimable:7535 [ 14.750863] mapped:2080 shmem:44 pagetables:285 bounce:0 [ 14.750863] free_cma:0 [ 14.759589] Node 0 DMA free:14568kB min:44kB low:52kB high:64kB active_anon:124kB inactive_anon:0kB active_file:436kB inactive_file:264kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15992kB managed:15908kB mlocked:0kB dirty:4kB writeback:0kB mapped:208kB shmem:0kB slab_reclaimable:152kB slab_unreclaimable:328kB kernel_stack:16kB pagetables:8kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.766300] lowmem_reserve[]: 0 470 470 470 [ 14.767506] Node 0 DMA32 free:442488kB min:1368kB low:1708kB high:2052kB active_anon:2400kB inactive_anon:12kB active_file:7224kB inactive_file:3812kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:507904kB managed:485120kB mlocked:0kB dirty:152kB writeback:0kB mapped:4584kB shmem:12kB slab_reclaimable:3924kB slab_unreclaimable:7668kB kernel_stack:1600kB pagetables:228kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.774390] lowmem_reserve[]: 0 0 0 0 [ 14.775481] Node 1 DMA32 free:416704kB min:1276kB low:1592kB high:1912kB active_anon:916kB inactive_anon:68kB active_file:3224kB inactive_file:2088kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:449572kB mlocked:0kB dirty:244kB writeback:0kB mapped:1572kB shmem:76kB slab_reclaimable:1920kB slab_unreclaimable:6360kB kernel_stack:1024kB pagetables:284kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.784695] lowmem_reserve[]: 0 0 0 0 [ 14.786414] Node 2 DMA32 free:464496kB min:1464kB low:1828kB high:2196kB active_anon:3712kB inactive_anon:32kB active_file:5172kB inactive_file:10548kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:515108kB mlocked:0kB dirty:152kB writeback:0kB mapped:1000kB shmem:44kB slab_reclaimable:6064kB slab_unreclaimable:8672kB kernel_stack:816kB pagetables:188kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.794710] lowmem_reserve[]: 0 0 0 0 [ 14.796172] Node 3 DMA32 free:484356kB min:1464kB low:1828kB high:2196kB active_anon:1820kB inactive_anon:28kB active_file:1872kB inactive_file:1712kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524156kB managed:514928kB mlocked:0kB dirty:4kB writeback:0kB mapped:956kB shmem:44kB slab_reclaimable:1792kB slab_unreclaimable:7112kB kernel_stack:912kB pagetables:432kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 14.802398] lowmem_reserve[]: 0 0 0 0 [ 14.803438] Node 0 DMA: 22*4kB (UM) 14*8kB (UEM) 8*16kB (UM) 3*32kB (UEM) 1*64kB (E) 2*128kB (UM) 2*256kB (UE) 2*512kB (UE) 2*1024kB (EM) 3*2048kB (EMR) 1*4096kB (M) = 14568kB [ 14.819021] Node 0 DMA32: 345*4kB (UEM) 302*8kB (UM) 211*16kB (UEM) 83*32kB (UM) 34*64kB (UM) 8*128kB (UEM) 2*256kB (UE) 1*512kB (U) 1*1024kB (E) 3*2048kB (UER) 103*4096kB (M) = 443108kB [ 14.823019] Node 1 DMA32: 366*4kB (UEM) 244*8kB (UEM) 135*16kB (UEM) 59*32kB (UEM) 22*64kB (UEM) 12*128kB (UM) 6*256kB (UEM) 0*512kB 2*1024kB (UE) 1*2048kB (U) 98*4096kB (MR) = 417448kB [ 14.828587] Node 2 DMA32: 350*4kB (UM) 143*8kB (UEM) 79*16kB (UEM) 56*32kB (UEM) 72*64kB (UEM) 7*128kB (EM) 5*256kB (EM) 0*512kB 2*1024kB (UE) 2*2048kB (UM) 109*4096kB (MR) = 464992kB [ 14.832611] Node 3 DMA32: 473*4kB (UEM) 249*8kB (UEM) 110*16kB (UEM) 43*32kB (UM) 12*64kB (UEM) 5*128kB (UEM) 4*256kB (UEM) 1*512kB (M) 2*1024kB (EM) 1*2048kB (M) 115*4096kB (MR) = 485100kB [ 14.836563] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.838380] Node 1 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.840264] Node 2 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.845649] Node 3 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 14.849683] 9131 total pagecache pages [ 14.850427] 0 pages in swap cache [ 14.851238] Swap cache stats: add 0, delete 0, find 0/0 [ 14.852112] Free swap = 999420kB [ 14.852791] Total swap = 999420kB [ 14.853479] 524157 pages RAM [ 14.854122] 0 pages HighMem/MovableOnly [ 14.854842] 28998 pages reserved After: [ 44.452524] sysrq: SysRq : Show Memory [ 44.452955] Mem-Info: [ 44.453233] active_anon:2307 inactive_anon:36 isolated_anon:0 [ 44.453233] active_file:4120 inactive_file:4623 isolated_file:0 [ 44.453233] unevictable:0 dirty:6 writeback:0 unstable:0 [ 44.453233] slab_reclaimable:3500 slab_unreclaimable:7441 [ 44.453233] mapped:2113 shmem:45 pagetables:292 bounce:0 [ 44.453233] free:456891 free_pcp:12179 free_cma:0 [ 44.456275] Node 0 DMA free:14756kB min:44kB low:52kB high:64kB active_anon:184kB inactive_anon:4kB active_file:256kB inactive_file:72kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15992kB managed:15908kB mlocked:0kB dirty:0kB writeback:0kB mapped:64kB shmem:4kB slab_reclaimable:100kB slab_unreclaimable:452kB kernel_stack:16kB pagetables:44kB unstable:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.460873] lowmem_reserve[]: 0 470 470 470 [ 44.461576] Node 0 DMA32 free:451052kB min:1368kB low:1708kB high:2052kB active_anon:2100kB inactive_anon:28kB active_file:4640kB inactive_file:1292kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:507904kB managed:485120kB mlocked:0kB dirty:12kB writeback:0kB mapped:2584kB shmem:40kB slab_reclaimable:2440kB slab_unreclaimable:8080kB kernel_stack:1712kB pagetables:296kB unstable:0kB bounce:0kB free_pcp:11164kB local_pcp:280kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.468488] lowmem_reserve[]: 0 0 0 0 [ 44.469319] Node 1 DMA32 free:414628kB min:1276kB low:1592kB high:1912kB active_anon:1664kB inactive_anon:12kB active_file:4172kB inactive_file:2104kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:449572kB mlocked:0kB dirty:4kB writeback:0kB mapped:1136kB shmem:20kB slab_reclaimable:3024kB slab_unreclaimable:6836kB kernel_stack:1184kB pagetables:372kB unstable:0kB bounce:0kB free_pcp:11512kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.479676] lowmem_reserve[]: 0 0 0 0 [ 44.482369] Node 2 DMA32 free:473636kB min:1464kB low:1828kB high:2196kB active_anon:4556kB inactive_anon:68kB active_file:3740kB inactive_file:4632kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524288kB managed:515108kB mlocked:0kB dirty:0kB writeback:0kB mapped:2972kB shmem:80kB slab_reclaimable:4832kB slab_unreclaimable:7432kB kernel_stack:736kB pagetables:320kB unstable:0kB bounce:0kB free_pcp:12928kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.495909] lowmem_reserve[]: 0 0 0 0 [ 44.499130] Node 3 DMA32 free:473492kB min:1464kB low:1828kB high:2196kB active_anon:724kB inactive_anon:32kB active_file:3672kB inactive_file:10392kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:524156kB managed:514928kB mlocked:0kB dirty:8kB writeback:0kB mapped:1696kB shmem:36kB slab_reclaimable:3604kB slab_unreclaimable:6964kB kernel_stack:720kB pagetables:136kB unstable:0kB bounce:0kB free_pcp:13112kB local_pcp:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 44.511069] lowmem_reserve[]: 0 0 0 0 [ 44.513516] Node 0 DMA: 3*4kB (UE) 5*8kB (UEM) 7*16kB (UEM) 2*32kB (UM) 1*64kB (M) 3*128kB (UEM) 3*256kB (UEM) 2*512kB (UE) 2*1024kB (EM) 3*2048kB (EMR) 1*4096kB (M) = 14756kB [ 44.519682] Node 0 DMA32: 279*4kB (UEM) 156*8kB (UM) 91*16kB (UEM) 46*32kB (UEM) 21*64kB (UEM) 4*128kB (UEM) 4*256kB (EM) 3*512kB (UEM) 1*1024kB (M) 3*2048kB (UMR) 106*4096kB (M) = 451052kB [ 44.527741] Node 1 DMA32: 373*4kB (UM) 342*8kB (UM) 212*16kB (UEM) 107*32kB (UM) 24*64kB (UM) 7*128kB (UEM) 5*256kB (UM) 3*512kB (UEM) 1*1024kB (U) 0*2048kB 97*4096kB (MR) = 414628kB [ 44.532389] Node 2 DMA32: 261*4kB (UEM) 84*8kB (UM) 71*16kB (UM) 30*32kB (UM) 19*64kB (UEM) 9*128kB (UM) 6*256kB (UEM) 2*512kB (EM) 2*1024kB (UM) 2*2048kB (UE) 112*4096kB (MR) = 473636kB [ 44.537268] Node 3 DMA32: 319*4kB (UEM) 243*8kB (UEM) 180*16kB (UM) 96*32kB (UEM) 81*64kB (UEM) 9*128kB (EM) 5*256kB (M) 4*512kB (UEM) 2*1024kB (EM) 1*2048kB (E) 110*4096kB (MR) = 473492kB [ 44.542344] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.545064] Node 1 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.547613] Node 2 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.552028] Node 3 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB [ 44.559441] 8793 total pagecache pages [ 44.561298] 0 pages in swap cache [ 44.562973] Swap cache stats: add 0, delete 0, find 0/0 [ 44.564722] Free swap = 999420kB [ 44.566151] Total swap = 999420kB [ 44.567440] 524157 pages RAM [ 44.569286] 0 pages HighMem/MovableOnly [ 44.570702] 28998 pages reserved > > Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. > > Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> > --- > include/linux/mm.h | 1 + > mm/page_alloc.c | 32 +++++++++++++++++++++++++------- > 2 files changed, 26 insertions(+), 7 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 028565a..0538de0 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); > * various contexts. > */ > #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ > +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ > > extern void show_free_areas(unsigned int flags); > extern bool skip_free_areas_node(unsigned int flags, int nid); > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a47f0b2..e591f3b 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) > */ > void show_free_areas(unsigned int filter) > { > + unsigned long free_pcp = 0; > int cpu; > struct zone *zone; > > for_each_populated_zone(zone) { > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > - show_node(zone); > - printk("%s per-cpu:\n", zone->name); > + > + if (filter & SHOW_MEM_PERCPU_LISTS) { > + show_node(zone); > + printk("%s per-cpu:\n", zone->name); > + } > > for_each_online_cpu(cpu) { > struct per_cpu_pageset *pageset; > > pageset = per_cpu_ptr(zone->pageset, cpu); > > + free_pcp += pageset->pcp.count; > + > + if (!(filter & SHOW_MEM_PERCPU_LISTS)) > + continue; > + > printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", > cpu, pageset->pcp.high, > pageset->pcp.batch, pageset->pcp.count); > @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > > printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > - " unevictable:%lu" > - " dirty:%lu writeback:%lu unstable:%lu\n" > - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > - " free_cma:%lu\n", > + " free:%lu free_pcp:%lu free_cma:%lu\n", > global_page_state(NR_ACTIVE_ANON), > global_page_state(NR_INACTIVE_ANON), > global_page_state(NR_ISOLATED_ANON), > @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) > global_page_state(NR_FILE_DIRTY), > global_page_state(NR_WRITEBACK), > global_page_state(NR_UNSTABLE_NFS), > - global_page_state(NR_FREE_PAGES), > global_page_state(NR_SLAB_RECLAIMABLE), > global_page_state(NR_SLAB_UNRECLAIMABLE), > global_page_state(NR_FILE_MAPPED), > global_page_state(NR_SHMEM), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > + global_page_state(NR_FREE_PAGES), > + free_pcp, > global_page_state(NR_FREE_CMA_PAGES)); > > for_each_populated_zone(zone) { > @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) > > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > + > + free_pcp = 0; > + for_each_online_cpu(cpu) > + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; > + > show_node(zone); > printk("%s" > " free:%lukB" > @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) > " pagetables:%lukB" > " unstable:%lukB" > " bounce:%lukB" > + " free_pcp:%lukB" > + " local_pcp:%ukB" > " free_cma:%lukB" > " writeback_tmp:%lukB" > " pages_scanned:%lu" > @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) > K(zone_page_state(zone, NR_PAGETABLE)), > K(zone_page_state(zone, NR_UNSTABLE_NFS)), > K(zone_page_state(zone, NR_BOUNCE)), > + K(free_pcp), > + K(this_cpu_read(zone->pageset->pcp.count)), > K(zone_page_state(zone, NR_FREE_CMA_PAGES)), > K(zone_page_state(zone, NR_WRITEBACK_TEMP)), > K(zone_page_state(zone, NR_PAGES_SCANNED)), > -- Konstantin ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-20 14:39 ` Konstantin Khlebnikov @ 2015-02-20 21:45 ` Andrew Morton -1 siblings, 0 replies; 22+ messages in thread From: Andrew Morton @ 2015-02-20 21:45 UTC (permalink / raw) To: Konstantin Khlebnikov; +Cc: linux-mm, linux-kernel On Fri, 20 Feb 2015 17:39:42 +0300 Konstantin Khlebnikov <khlebnikov@yandex-team.ru> wrote: > This makes show_mem() much less verbose at huge machines. Instead of > huge and almost useless dump of counters for each per-zone per-cpu > lists this patch prints sum of these counters for each zone (free_pcp) > and size of per-cpu list for current cpu (local_pcp). > > Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. Forgot to update the comment: --- a/mm/page_alloc.c~mm-hide-per-cpu-lists-in-output-of-show_mem-fix +++ a/mm/page_alloc.c @@ -3243,8 +3243,11 @@ static void show_migration_types(unsigne * Show free area list (used inside shift_scroll-lock stuff) * We also calculate the percentage fragmentation. We do this by counting the * memory on each free list with the exception of the first item on the list. - * Suppresses nodes that are not allowed by current's cpuset if - * SHOW_MEM_FILTER_NODES is passed. + * + * Bits in @filter: + * SHOW_MEM_FILTER_NODES: suppress nodes that are not allowed by current's + * cpuset. + * SHOW_MEM_PERCPU_LISTS: display full per-node per-cpu pcp lists */ void show_free_areas(unsigned int filter) { Is there really any point in having SHOW_MEM_PERCPU_LISTS? There isn't presently a way of setting it(?). -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-20 21:45 ` Andrew Morton 0 siblings, 0 replies; 22+ messages in thread From: Andrew Morton @ 2015-02-20 21:45 UTC (permalink / raw) To: Konstantin Khlebnikov; +Cc: linux-mm, linux-kernel On Fri, 20 Feb 2015 17:39:42 +0300 Konstantin Khlebnikov <khlebnikov@yandex-team.ru> wrote: > This makes show_mem() much less verbose at huge machines. Instead of > huge and almost useless dump of counters for each per-zone per-cpu > lists this patch prints sum of these counters for each zone (free_pcp) > and size of per-cpu list for current cpu (local_pcp). > > Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. Forgot to update the comment: --- a/mm/page_alloc.c~mm-hide-per-cpu-lists-in-output-of-show_mem-fix +++ a/mm/page_alloc.c @@ -3243,8 +3243,11 @@ static void show_migration_types(unsigne * Show free area list (used inside shift_scroll-lock stuff) * We also calculate the percentage fragmentation. We do this by counting the * memory on each free list with the exception of the first item on the list. - * Suppresses nodes that are not allowed by current's cpuset if - * SHOW_MEM_FILTER_NODES is passed. + * + * Bits in @filter: + * SHOW_MEM_FILTER_NODES: suppress nodes that are not allowed by current's + * cpuset. + * SHOW_MEM_PERCPU_LISTS: display full per-node per-cpu pcp lists */ void show_free_areas(unsigned int filter) { Is there really any point in having SHOW_MEM_PERCPU_LISTS? There isn't presently a way of setting it(?). ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-20 14:39 ` Konstantin Khlebnikov @ 2015-02-23 14:37 ` Michal Hocko -1 siblings, 0 replies; 22+ messages in thread From: Michal Hocko @ 2015-02-23 14:37 UTC (permalink / raw) To: Konstantin Khlebnikov; +Cc: linux-mm, Andrew Morton, linux-kernel On Fri 20-02-15 17:39:42, Konstantin Khlebnikov wrote: > This makes show_mem() much less verbose at huge machines. Instead of > huge and almost useless dump of counters for each per-zone per-cpu > lists this patch prints sum of these counters for each zone (free_pcp) > and size of per-cpu list for current cpu (local_pcp). I like this! I do not remember when I found this information useful while debugging either an allocation failure warning or OOM killer report. > Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. Nobody seems to be using this flag so why bother? > Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Acked-by: Michal Hocko <mhocko@suse.cz> > --- > include/linux/mm.h | 1 + > mm/page_alloc.c | 32 +++++++++++++++++++++++++------- > 2 files changed, 26 insertions(+), 7 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 028565a..0538de0 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); > * various contexts. > */ > #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ > +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ > > extern void show_free_areas(unsigned int flags); > extern bool skip_free_areas_node(unsigned int flags, int nid); > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a47f0b2..e591f3b 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) > */ > void show_free_areas(unsigned int filter) > { > + unsigned long free_pcp = 0; > int cpu; > struct zone *zone; > > for_each_populated_zone(zone) { > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > - show_node(zone); > - printk("%s per-cpu:\n", zone->name); > + > + if (filter & SHOW_MEM_PERCPU_LISTS) { > + show_node(zone); > + printk("%s per-cpu:\n", zone->name); > + } > > for_each_online_cpu(cpu) { > struct per_cpu_pageset *pageset; > > pageset = per_cpu_ptr(zone->pageset, cpu); > > + free_pcp += pageset->pcp.count; > + > + if (!(filter & SHOW_MEM_PERCPU_LISTS)) > + continue; > + > printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", > cpu, pageset->pcp.high, > pageset->pcp.batch, pageset->pcp.count); > @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > > printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > - " unevictable:%lu" > - " dirty:%lu writeback:%lu unstable:%lu\n" > - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > - " free_cma:%lu\n", > + " free:%lu free_pcp:%lu free_cma:%lu\n", > global_page_state(NR_ACTIVE_ANON), > global_page_state(NR_INACTIVE_ANON), > global_page_state(NR_ISOLATED_ANON), > @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) > global_page_state(NR_FILE_DIRTY), > global_page_state(NR_WRITEBACK), > global_page_state(NR_UNSTABLE_NFS), > - global_page_state(NR_FREE_PAGES), > global_page_state(NR_SLAB_RECLAIMABLE), > global_page_state(NR_SLAB_UNRECLAIMABLE), > global_page_state(NR_FILE_MAPPED), > global_page_state(NR_SHMEM), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > + global_page_state(NR_FREE_PAGES), > + free_pcp, > global_page_state(NR_FREE_CMA_PAGES)); > > for_each_populated_zone(zone) { > @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) > > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > + > + free_pcp = 0; > + for_each_online_cpu(cpu) > + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; > + > show_node(zone); > printk("%s" > " free:%lukB" > @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) > " pagetables:%lukB" > " unstable:%lukB" > " bounce:%lukB" > + " free_pcp:%lukB" > + " local_pcp:%ukB" > " free_cma:%lukB" > " writeback_tmp:%lukB" > " pages_scanned:%lu" > @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) > K(zone_page_state(zone, NR_PAGETABLE)), > K(zone_page_state(zone, NR_UNSTABLE_NFS)), > K(zone_page_state(zone, NR_BOUNCE)), > + K(free_pcp), > + K(this_cpu_read(zone->pageset->pcp.count)), > K(zone_page_state(zone, NR_FREE_CMA_PAGES)), > K(zone_page_state(zone, NR_WRITEBACK_TEMP)), > K(zone_page_state(zone, NR_PAGES_SCANNED)), > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-23 14:37 ` Michal Hocko 0 siblings, 0 replies; 22+ messages in thread From: Michal Hocko @ 2015-02-23 14:37 UTC (permalink / raw) To: Konstantin Khlebnikov; +Cc: linux-mm, Andrew Morton, linux-kernel On Fri 20-02-15 17:39:42, Konstantin Khlebnikov wrote: > This makes show_mem() much less verbose at huge machines. Instead of > huge and almost useless dump of counters for each per-zone per-cpu > lists this patch prints sum of these counters for each zone (free_pcp) > and size of per-cpu list for current cpu (local_pcp). I like this! I do not remember when I found this information useful while debugging either an allocation failure warning or OOM killer report. > Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. Nobody seems to be using this flag so why bother? > Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Acked-by: Michal Hocko <mhocko@suse.cz> > --- > include/linux/mm.h | 1 + > mm/page_alloc.c | 32 +++++++++++++++++++++++++------- > 2 files changed, 26 insertions(+), 7 deletions(-) > > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 028565a..0538de0 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); > * various contexts. > */ > #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ > +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ > > extern void show_free_areas(unsigned int flags); > extern bool skip_free_areas_node(unsigned int flags, int nid); > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a47f0b2..e591f3b 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) > */ > void show_free_areas(unsigned int filter) > { > + unsigned long free_pcp = 0; > int cpu; > struct zone *zone; > > for_each_populated_zone(zone) { > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > - show_node(zone); > - printk("%s per-cpu:\n", zone->name); > + > + if (filter & SHOW_MEM_PERCPU_LISTS) { > + show_node(zone); > + printk("%s per-cpu:\n", zone->name); > + } > > for_each_online_cpu(cpu) { > struct per_cpu_pageset *pageset; > > pageset = per_cpu_ptr(zone->pageset, cpu); > > + free_pcp += pageset->pcp.count; > + > + if (!(filter & SHOW_MEM_PERCPU_LISTS)) > + continue; > + > printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", > cpu, pageset->pcp.high, > pageset->pcp.batch, pageset->pcp.count); > @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > > printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > - " unevictable:%lu" > - " dirty:%lu writeback:%lu unstable:%lu\n" > - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > - " free_cma:%lu\n", > + " free:%lu free_pcp:%lu free_cma:%lu\n", > global_page_state(NR_ACTIVE_ANON), > global_page_state(NR_INACTIVE_ANON), > global_page_state(NR_ISOLATED_ANON), > @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) > global_page_state(NR_FILE_DIRTY), > global_page_state(NR_WRITEBACK), > global_page_state(NR_UNSTABLE_NFS), > - global_page_state(NR_FREE_PAGES), > global_page_state(NR_SLAB_RECLAIMABLE), > global_page_state(NR_SLAB_UNRECLAIMABLE), > global_page_state(NR_FILE_MAPPED), > global_page_state(NR_SHMEM), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > + global_page_state(NR_FREE_PAGES), > + free_pcp, > global_page_state(NR_FREE_CMA_PAGES)); > > for_each_populated_zone(zone) { > @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) > > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > + > + free_pcp = 0; > + for_each_online_cpu(cpu) > + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; > + > show_node(zone); > printk("%s" > " free:%lukB" > @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) > " pagetables:%lukB" > " unstable:%lukB" > " bounce:%lukB" > + " free_pcp:%lukB" > + " local_pcp:%ukB" > " free_cma:%lukB" > " writeback_tmp:%lukB" > " pages_scanned:%lu" > @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) > K(zone_page_state(zone, NR_PAGETABLE)), > K(zone_page_state(zone, NR_UNSTABLE_NFS)), > K(zone_page_state(zone, NR_BOUNCE)), > + K(free_pcp), > + K(this_cpu_read(zone->pageset->pcp.count)), > K(zone_page_state(zone, NR_FREE_CMA_PAGES)), > K(zone_page_state(zone, NR_WRITEBACK_TEMP)), > K(zone_page_state(zone, NR_PAGES_SCANNED)), > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> -- Michal Hocko SUSE Labs ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-23 14:37 ` Michal Hocko @ 2015-02-24 9:03 ` Konstantin Khlebnikov -1 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-24 9:03 UTC (permalink / raw) To: Michal Hocko Cc: Konstantin Khlebnikov, linux-mm@kvack.org, Andrew Morton, Linux Kernel Mailing List On Mon, Feb 23, 2015 at 5:37 PM, Michal Hocko <mhocko@suse.cz> wrote: > On Fri 20-02-15 17:39:42, Konstantin Khlebnikov wrote: >> This makes show_mem() much less verbose at huge machines. Instead of >> huge and almost useless dump of counters for each per-zone per-cpu >> lists this patch prints sum of these counters for each zone (free_pcp) >> and size of per-cpu list for current cpu (local_pcp). > > I like this! I do not remember when I found this information useful > while debugging either an allocation failure warning or OOM killer > report. > >> Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. > > Nobody seems to be using this flag so why bother? Yes. But this might be important for architectures which has asymmetrical memory topology, I've heard about unicorns like that. > >> Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> > > Acked-by: Michal Hocko <mhocko@suse.cz> > >> --- >> include/linux/mm.h | 1 + >> mm/page_alloc.c | 32 +++++++++++++++++++++++++------- >> 2 files changed, 26 insertions(+), 7 deletions(-) >> >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index 028565a..0538de0 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); >> * various contexts. >> */ >> #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ >> +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ >> >> extern void show_free_areas(unsigned int flags); >> extern bool skip_free_areas_node(unsigned int flags, int nid); >> diff --git a/mm/page_alloc.c b/mm/page_alloc.c >> index a47f0b2..e591f3b 100644 >> --- a/mm/page_alloc.c >> +++ b/mm/page_alloc.c >> @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) >> */ >> void show_free_areas(unsigned int filter) >> { >> + unsigned long free_pcp = 0; >> int cpu; >> struct zone *zone; >> >> for_each_populated_zone(zone) { >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> - show_node(zone); >> - printk("%s per-cpu:\n", zone->name); >> + >> + if (filter & SHOW_MEM_PERCPU_LISTS) { >> + show_node(zone); >> + printk("%s per-cpu:\n", zone->name); >> + } >> >> for_each_online_cpu(cpu) { >> struct per_cpu_pageset *pageset; >> >> pageset = per_cpu_ptr(zone->pageset, cpu); >> >> + free_pcp += pageset->pcp.count; >> + >> + if (!(filter & SHOW_MEM_PERCPU_LISTS)) >> + continue; >> + >> printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", >> cpu, pageset->pcp.high, >> pageset->pcp.batch, pageset->pcp.count); >> @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) >> >> printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" >> " active_file:%lu inactive_file:%lu isolated_file:%lu\n" >> - " unevictable:%lu" >> - " dirty:%lu writeback:%lu unstable:%lu\n" >> - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" >> + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" >> - " free_cma:%lu\n", >> + " free:%lu free_pcp:%lu free_cma:%lu\n", >> global_page_state(NR_ACTIVE_ANON), >> global_page_state(NR_INACTIVE_ANON), >> global_page_state(NR_ISOLATED_ANON), >> @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) >> global_page_state(NR_FILE_DIRTY), >> global_page_state(NR_WRITEBACK), >> global_page_state(NR_UNSTABLE_NFS), >> - global_page_state(NR_FREE_PAGES), >> global_page_state(NR_SLAB_RECLAIMABLE), >> global_page_state(NR_SLAB_UNRECLAIMABLE), >> global_page_state(NR_FILE_MAPPED), >> global_page_state(NR_SHMEM), >> global_page_state(NR_PAGETABLE), >> global_page_state(NR_BOUNCE), >> + global_page_state(NR_FREE_PAGES), >> + free_pcp, >> global_page_state(NR_FREE_CMA_PAGES)); >> >> for_each_populated_zone(zone) { >> @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) >> >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> + >> + free_pcp = 0; >> + for_each_online_cpu(cpu) >> + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; >> + >> show_node(zone); >> printk("%s" >> " free:%lukB" >> @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) >> " pagetables:%lukB" >> " unstable:%lukB" >> " bounce:%lukB" >> + " free_pcp:%lukB" >> + " local_pcp:%ukB" >> " free_cma:%lukB" >> " writeback_tmp:%lukB" >> " pages_scanned:%lu" >> @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) >> K(zone_page_state(zone, NR_PAGETABLE)), >> K(zone_page_state(zone, NR_UNSTABLE_NFS)), >> K(zone_page_state(zone, NR_BOUNCE)), >> + K(free_pcp), >> + K(this_cpu_read(zone->pageset->pcp.count)), >> K(zone_page_state(zone, NR_FREE_CMA_PAGES)), >> K(zone_page_state(zone, NR_WRITEBACK_TEMP)), >> K(zone_page_state(zone, NR_PAGES_SCANNED)), >> >> -- >> To unsubscribe, send a message with 'unsubscribe linux-mm' in >> the body to majordomo@kvack.org. For more info on Linux MM, >> see: http://www.linux-mm.org/ . >> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> > > -- > Michal Hocko > SUSE Labs > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-24 9:03 ` Konstantin Khlebnikov 0 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-24 9:03 UTC (permalink / raw) To: Michal Hocko Cc: Konstantin Khlebnikov, linux-mm@kvack.org, Andrew Morton, Linux Kernel Mailing List On Mon, Feb 23, 2015 at 5:37 PM, Michal Hocko <mhocko@suse.cz> wrote: > On Fri 20-02-15 17:39:42, Konstantin Khlebnikov wrote: >> This makes show_mem() much less verbose at huge machines. Instead of >> huge and almost useless dump of counters for each per-zone per-cpu >> lists this patch prints sum of these counters for each zone (free_pcp) >> and size of per-cpu list for current cpu (local_pcp). > > I like this! I do not remember when I found this information useful > while debugging either an allocation failure warning or OOM killer > report. > >> Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. > > Nobody seems to be using this flag so why bother? Yes. But this might be important for architectures which has asymmetrical memory topology, I've heard about unicorns like that. > >> Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> > > Acked-by: Michal Hocko <mhocko@suse.cz> > >> --- >> include/linux/mm.h | 1 + >> mm/page_alloc.c | 32 +++++++++++++++++++++++++------- >> 2 files changed, 26 insertions(+), 7 deletions(-) >> >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index 028565a..0538de0 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); >> * various contexts. >> */ >> #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ >> +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ >> >> extern void show_free_areas(unsigned int flags); >> extern bool skip_free_areas_node(unsigned int flags, int nid); >> diff --git a/mm/page_alloc.c b/mm/page_alloc.c >> index a47f0b2..e591f3b 100644 >> --- a/mm/page_alloc.c >> +++ b/mm/page_alloc.c >> @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) >> */ >> void show_free_areas(unsigned int filter) >> { >> + unsigned long free_pcp = 0; >> int cpu; >> struct zone *zone; >> >> for_each_populated_zone(zone) { >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> - show_node(zone); >> - printk("%s per-cpu:\n", zone->name); >> + >> + if (filter & SHOW_MEM_PERCPU_LISTS) { >> + show_node(zone); >> + printk("%s per-cpu:\n", zone->name); >> + } >> >> for_each_online_cpu(cpu) { >> struct per_cpu_pageset *pageset; >> >> pageset = per_cpu_ptr(zone->pageset, cpu); >> >> + free_pcp += pageset->pcp.count; >> + >> + if (!(filter & SHOW_MEM_PERCPU_LISTS)) >> + continue; >> + >> printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", >> cpu, pageset->pcp.high, >> pageset->pcp.batch, pageset->pcp.count); >> @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) >> >> printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" >> " active_file:%lu inactive_file:%lu isolated_file:%lu\n" >> - " unevictable:%lu" >> - " dirty:%lu writeback:%lu unstable:%lu\n" >> - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" >> + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" >> - " free_cma:%lu\n", >> + " free:%lu free_pcp:%lu free_cma:%lu\n", >> global_page_state(NR_ACTIVE_ANON), >> global_page_state(NR_INACTIVE_ANON), >> global_page_state(NR_ISOLATED_ANON), >> @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) >> global_page_state(NR_FILE_DIRTY), >> global_page_state(NR_WRITEBACK), >> global_page_state(NR_UNSTABLE_NFS), >> - global_page_state(NR_FREE_PAGES), >> global_page_state(NR_SLAB_RECLAIMABLE), >> global_page_state(NR_SLAB_UNRECLAIMABLE), >> global_page_state(NR_FILE_MAPPED), >> global_page_state(NR_SHMEM), >> global_page_state(NR_PAGETABLE), >> global_page_state(NR_BOUNCE), >> + global_page_state(NR_FREE_PAGES), >> + free_pcp, >> global_page_state(NR_FREE_CMA_PAGES)); >> >> for_each_populated_zone(zone) { >> @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) >> >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> + >> + free_pcp = 0; >> + for_each_online_cpu(cpu) >> + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; >> + >> show_node(zone); >> printk("%s" >> " free:%lukB" >> @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) >> " pagetables:%lukB" >> " unstable:%lukB" >> " bounce:%lukB" >> + " free_pcp:%lukB" >> + " local_pcp:%ukB" >> " free_cma:%lukB" >> " writeback_tmp:%lukB" >> " pages_scanned:%lu" >> @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) >> K(zone_page_state(zone, NR_PAGETABLE)), >> K(zone_page_state(zone, NR_UNSTABLE_NFS)), >> K(zone_page_state(zone, NR_BOUNCE)), >> + K(free_pcp), >> + K(this_cpu_read(zone->pageset->pcp.count)), >> K(zone_page_state(zone, NR_FREE_CMA_PAGES)), >> K(zone_page_state(zone, NR_WRITEBACK_TEMP)), >> K(zone_page_state(zone, NR_PAGES_SCANNED)), >> >> -- >> To unsubscribe, send a message with 'unsubscribe linux-mm' in >> the body to majordomo@kvack.org. For more info on Linux MM, >> see: http://www.linux-mm.org/ . >> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> > > -- > Michal Hocko > SUSE Labs > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-24 9:03 ` Konstantin Khlebnikov @ 2015-02-25 21:44 ` Andrew Morton -1 siblings, 0 replies; 22+ messages in thread From: Andrew Morton @ 2015-02-25 21:44 UTC (permalink / raw) To: Konstantin Khlebnikov Cc: Michal Hocko, Konstantin Khlebnikov, linux-mm@kvack.org, Linux Kernel Mailing List On Tue, 24 Feb 2015 13:03:01 +0400 Konstantin Khlebnikov <koct9i@gmail.com> wrote: > On Mon, Feb 23, 2015 at 5:37 PM, Michal Hocko <mhocko@suse.cz> wrote: > > On Fri 20-02-15 17:39:42, Konstantin Khlebnikov wrote: > >> This makes show_mem() much less verbose at huge machines. Instead of > >> huge and almost useless dump of counters for each per-zone per-cpu > >> lists this patch prints sum of these counters for each zone (free_pcp) > >> and size of per-cpu list for current cpu (local_pcp). > > > > I like this! I do not remember when I found this information useful > > while debugging either an allocation failure warning or OOM killer > > report. > > > >> Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. > > > > Nobody seems to be using this flag so why bother? > > Yes. But this might be important for architectures which has asymmetrical > memory topology, I've heard about unicorns like that. Please provide more details about this (why important? How would it be used) and I'll add it to the changelog. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-25 21:44 ` Andrew Morton 0 siblings, 0 replies; 22+ messages in thread From: Andrew Morton @ 2015-02-25 21:44 UTC (permalink / raw) To: Konstantin Khlebnikov Cc: Michal Hocko, Konstantin Khlebnikov, linux-mm@kvack.org, Linux Kernel Mailing List On Tue, 24 Feb 2015 13:03:01 +0400 Konstantin Khlebnikov <koct9i@gmail.com> wrote: > On Mon, Feb 23, 2015 at 5:37 PM, Michal Hocko <mhocko@suse.cz> wrote: > > On Fri 20-02-15 17:39:42, Konstantin Khlebnikov wrote: > >> This makes show_mem() much less verbose at huge machines. Instead of > >> huge and almost useless dump of counters for each per-zone per-cpu > >> lists this patch prints sum of these counters for each zone (free_pcp) > >> and size of per-cpu list for current cpu (local_pcp). > > > > I like this! I do not remember when I found this information useful > > while debugging either an allocation failure warning or OOM killer > > report. > > > >> Flag SHOW_MEM_PERCPU_LISTS reverts old verbose mode. > > > > Nobody seems to be using this flag so why bother? > > Yes. But this might be important for architectures which has asymmetrical > memory topology, I've heard about unicorns like that. Please provide more details about this (why important? How would it be used) and I'll add it to the changelog. ^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH] mm: completely remove dumping per-cpu lists from show_mem() 2015-02-25 21:44 ` Andrew Morton @ 2015-02-26 6:14 ` Konstantin Khlebnikov -1 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-26 6:14 UTC (permalink / raw) To: linux-mm, Andrew Morton, linux-kernel; +Cc: Michal Hocko It seems nobody needs this. Signed-off-by: Konstantin Khlebnikov <koct9i@gmail.com> --- include/linux/mm.h | 1 - mm/page_alloc.c | 22 ++-------------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 9c21b42..6571dd78 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1126,7 +1126,6 @@ extern void pagefault_out_of_memory(void); * various contexts. */ #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ -#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ extern void show_free_areas(unsigned int flags); extern bool skip_free_areas_node(unsigned int flags, int nid); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a120bce..8ddcb0e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3254,7 +3254,6 @@ static void show_migration_types(unsigned char type) * Bits in @filter: * SHOW_MEM_FILTER_NODES: suppress nodes that are not allowed by current's * cpuset. - * SHOW_MEM_PERCPU_LISTS: display full per-node per-cpu pcp lists */ void show_free_areas(unsigned int filter) { @@ -3266,25 +3265,8 @@ void show_free_areas(unsigned int filter) if (skip_free_areas_node(filter, zone_to_nid(zone))) continue; - if (filter & SHOW_MEM_PERCPU_LISTS) { - show_node(zone); - printk("%s per-cpu:\n", zone->name); - } - - for_each_online_cpu(cpu) { - struct per_cpu_pageset *pageset; - - pageset = per_cpu_ptr(zone->pageset, cpu); - - free_pcp += pageset->pcp.count; - - if (!(filter & SHOW_MEM_PERCPU_LISTS)) - continue; - - printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", - cpu, pageset->pcp.high, - pageset->pcp.batch, pageset->pcp.count); - } + for_each_online_cpu(cpu) + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; } printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH] mm: completely remove dumping per-cpu lists from show_mem() @ 2015-02-26 6:14 ` Konstantin Khlebnikov 0 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-26 6:14 UTC (permalink / raw) To: linux-mm, Andrew Morton, linux-kernel; +Cc: Michal Hocko It seems nobody needs this. Signed-off-by: Konstantin Khlebnikov <koct9i@gmail.com> --- include/linux/mm.h | 1 - mm/page_alloc.c | 22 ++-------------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 9c21b42..6571dd78 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1126,7 +1126,6 @@ extern void pagefault_out_of_memory(void); * various contexts. */ #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ -#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ extern void show_free_areas(unsigned int flags); extern bool skip_free_areas_node(unsigned int flags, int nid); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a120bce..8ddcb0e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3254,7 +3254,6 @@ static void show_migration_types(unsigned char type) * Bits in @filter: * SHOW_MEM_FILTER_NODES: suppress nodes that are not allowed by current's * cpuset. - * SHOW_MEM_PERCPU_LISTS: display full per-node per-cpu pcp lists */ void show_free_areas(unsigned int filter) { @@ -3266,25 +3265,8 @@ void show_free_areas(unsigned int filter) if (skip_free_areas_node(filter, zone_to_nid(zone))) continue; - if (filter & SHOW_MEM_PERCPU_LISTS) { - show_node(zone); - printk("%s per-cpu:\n", zone->name); - } - - for_each_online_cpu(cpu) { - struct per_cpu_pageset *pageset; - - pageset = per_cpu_ptr(zone->pageset, cpu); - - free_pcp += pageset->pcp.count; - - if (!(filter & SHOW_MEM_PERCPU_LISTS)) - continue; - - printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", - cpu, pageset->pcp.high, - pageset->pcp.batch, pageset->pcp.count); - } + for_each_online_cpu(cpu) + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; } printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" ^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: completely remove dumping per-cpu lists from show_mem() 2015-02-26 6:14 ` Konstantin Khlebnikov @ 2015-02-26 23:14 ` Dave Hansen -1 siblings, 0 replies; 22+ messages in thread From: Dave Hansen @ 2015-02-26 23:14 UTC (permalink / raw) To: Konstantin Khlebnikov, linux-mm, Andrew Morton, linux-kernel; +Cc: Michal Hocko On 02/25/2015 10:14 PM, Konstantin Khlebnikov wrote: > It seems nobody needs this. Yay! I was just digging through an OOM on a system with 288 logical CPUs. It sucked. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: completely remove dumping per-cpu lists from show_mem() @ 2015-02-26 23:14 ` Dave Hansen 0 siblings, 0 replies; 22+ messages in thread From: Dave Hansen @ 2015-02-26 23:14 UTC (permalink / raw) To: Konstantin Khlebnikov, linux-mm, Andrew Morton, linux-kernel; +Cc: Michal Hocko On 02/25/2015 10:14 PM, Konstantin Khlebnikov wrote: > It seems nobody needs this. Yay! I was just digging through an OOM on a system with 288 logical CPUs. It sucked. ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-20 14:39 ` Konstantin Khlebnikov @ 2015-02-24 20:41 ` David Rientjes -1 siblings, 0 replies; 22+ messages in thread From: David Rientjes @ 2015-02-24 20:41 UTC (permalink / raw) To: Konstantin Khlebnikov; +Cc: linux-mm, Andrew Morton, linux-kernel On Fri, 20 Feb 2015, Konstantin Khlebnikov wrote: > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 028565a..0538de0 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); > * various contexts. > */ > #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ > +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ > > extern void show_free_areas(unsigned int flags); > extern bool skip_free_areas_node(unsigned int flags, int nid); I, like others, think this should probably be left out until someone actually needs to use it. > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a47f0b2..e591f3b 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) > */ > void show_free_areas(unsigned int filter) > { > + unsigned long free_pcp = 0; > int cpu; > struct zone *zone; > > for_each_populated_zone(zone) { > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > - show_node(zone); > - printk("%s per-cpu:\n", zone->name); > + > + if (filter & SHOW_MEM_PERCPU_LISTS) { > + show_node(zone); > + printk("%s per-cpu:\n", zone->name); > + } > > for_each_online_cpu(cpu) { > struct per_cpu_pageset *pageset; > > pageset = per_cpu_ptr(zone->pageset, cpu); > > + free_pcp += pageset->pcp.count; > + > + if (!(filter & SHOW_MEM_PERCPU_LISTS)) > + continue; > + > printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", > cpu, pageset->pcp.high, > pageset->pcp.batch, pageset->pcp.count); > @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > > printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > - " unevictable:%lu" > - " dirty:%lu writeback:%lu unstable:%lu\n" > - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > - " free_cma:%lu\n", > + " free:%lu free_pcp:%lu free_cma:%lu\n", Why is "free:" itself moved? It is unlikely, but I could imagine that this might break something that is parsing the kernel log and it would be better to just leave it where it is and add "free_pcp:" after "free_cma:" since this is extending the message. > global_page_state(NR_ACTIVE_ANON), > global_page_state(NR_INACTIVE_ANON), > global_page_state(NR_ISOLATED_ANON), > @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) > global_page_state(NR_FILE_DIRTY), > global_page_state(NR_WRITEBACK), > global_page_state(NR_UNSTABLE_NFS), > - global_page_state(NR_FREE_PAGES), > global_page_state(NR_SLAB_RECLAIMABLE), > global_page_state(NR_SLAB_UNRECLAIMABLE), > global_page_state(NR_FILE_MAPPED), > global_page_state(NR_SHMEM), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > + global_page_state(NR_FREE_PAGES), > + free_pcp, > global_page_state(NR_FREE_CMA_PAGES)); > > for_each_populated_zone(zone) { > @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) > > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > + > + free_pcp = 0; > + for_each_online_cpu(cpu) > + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; > + > show_node(zone); > printk("%s" > " free:%lukB" > @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) > " pagetables:%lukB" > " unstable:%lukB" > " bounce:%lukB" > + " free_pcp:%lukB" > + " local_pcp:%ukB" > " free_cma:%lukB" > " writeback_tmp:%lukB" > " pages_scanned:%lu" > @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) > K(zone_page_state(zone, NR_PAGETABLE)), > K(zone_page_state(zone, NR_UNSTABLE_NFS)), > K(zone_page_state(zone, NR_BOUNCE)), > + K(free_pcp), > + K(this_cpu_read(zone->pageset->pcp.count)), > K(zone_page_state(zone, NR_FREE_CMA_PAGES)), > K(zone_page_state(zone, NR_WRITEBACK_TEMP)), > K(zone_page_state(zone, NR_PAGES_SCANNED)), > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-24 20:41 ` David Rientjes 0 siblings, 0 replies; 22+ messages in thread From: David Rientjes @ 2015-02-24 20:41 UTC (permalink / raw) To: Konstantin Khlebnikov; +Cc: linux-mm, Andrew Morton, linux-kernel On Fri, 20 Feb 2015, Konstantin Khlebnikov wrote: > diff --git a/include/linux/mm.h b/include/linux/mm.h > index 028565a..0538de0 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); > * various contexts. > */ > #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ > +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ > > extern void show_free_areas(unsigned int flags); > extern bool skip_free_areas_node(unsigned int flags, int nid); I, like others, think this should probably be left out until someone actually needs to use it. > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index a47f0b2..e591f3b 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) > */ > void show_free_areas(unsigned int filter) > { > + unsigned long free_pcp = 0; > int cpu; > struct zone *zone; > > for_each_populated_zone(zone) { > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > - show_node(zone); > - printk("%s per-cpu:\n", zone->name); > + > + if (filter & SHOW_MEM_PERCPU_LISTS) { > + show_node(zone); > + printk("%s per-cpu:\n", zone->name); > + } > > for_each_online_cpu(cpu) { > struct per_cpu_pageset *pageset; > > pageset = per_cpu_ptr(zone->pageset, cpu); > > + free_pcp += pageset->pcp.count; > + > + if (!(filter & SHOW_MEM_PERCPU_LISTS)) > + continue; > + > printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", > cpu, pageset->pcp.high, > pageset->pcp.batch, pageset->pcp.count); > @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > > printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > - " unevictable:%lu" > - " dirty:%lu writeback:%lu unstable:%lu\n" > - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > - " free_cma:%lu\n", > + " free:%lu free_pcp:%lu free_cma:%lu\n", Why is "free:" itself moved? It is unlikely, but I could imagine that this might break something that is parsing the kernel log and it would be better to just leave it where it is and add "free_pcp:" after "free_cma:" since this is extending the message. > global_page_state(NR_ACTIVE_ANON), > global_page_state(NR_INACTIVE_ANON), > global_page_state(NR_ISOLATED_ANON), > @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) > global_page_state(NR_FILE_DIRTY), > global_page_state(NR_WRITEBACK), > global_page_state(NR_UNSTABLE_NFS), > - global_page_state(NR_FREE_PAGES), > global_page_state(NR_SLAB_RECLAIMABLE), > global_page_state(NR_SLAB_UNRECLAIMABLE), > global_page_state(NR_FILE_MAPPED), > global_page_state(NR_SHMEM), > global_page_state(NR_PAGETABLE), > global_page_state(NR_BOUNCE), > + global_page_state(NR_FREE_PAGES), > + free_pcp, > global_page_state(NR_FREE_CMA_PAGES)); > > for_each_populated_zone(zone) { > @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) > > if (skip_free_areas_node(filter, zone_to_nid(zone))) > continue; > + > + free_pcp = 0; > + for_each_online_cpu(cpu) > + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; > + > show_node(zone); > printk("%s" > " free:%lukB" > @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) > " pagetables:%lukB" > " unstable:%lukB" > " bounce:%lukB" > + " free_pcp:%lukB" > + " local_pcp:%ukB" > " free_cma:%lukB" > " writeback_tmp:%lukB" > " pages_scanned:%lu" > @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) > K(zone_page_state(zone, NR_PAGETABLE)), > K(zone_page_state(zone, NR_UNSTABLE_NFS)), > K(zone_page_state(zone, NR_BOUNCE)), > + K(free_pcp), > + K(this_cpu_read(zone->pageset->pcp.count)), > K(zone_page_state(zone, NR_FREE_CMA_PAGES)), > K(zone_page_state(zone, NR_WRITEBACK_TEMP)), > K(zone_page_state(zone, NR_PAGES_SCANNED)), > ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-24 20:41 ` David Rientjes @ 2015-02-24 22:05 ` Konstantin Khlebnikov -1 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-24 22:05 UTC (permalink / raw) To: David Rientjes Cc: Konstantin Khlebnikov, linux-mm@kvack.org, Andrew Morton, Linux Kernel Mailing List On Tue, Feb 24, 2015 at 11:41 PM, David Rientjes <rientjes@google.com> wrote: > On Fri, 20 Feb 2015, Konstantin Khlebnikov wrote: > >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index 028565a..0538de0 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); >> * various contexts. >> */ >> #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ >> +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ >> >> extern void show_free_areas(unsigned int flags); >> extern bool skip_free_areas_node(unsigned int flags, int nid); > > I, like others, think this should probably be left out until someone > actually needs to use it. Not a problem, this is just a few lines of code. We can get rid of it at any time. > >> diff --git a/mm/page_alloc.c b/mm/page_alloc.c >> index a47f0b2..e591f3b 100644 >> --- a/mm/page_alloc.c >> +++ b/mm/page_alloc.c >> @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) >> */ >> void show_free_areas(unsigned int filter) >> { >> + unsigned long free_pcp = 0; >> int cpu; >> struct zone *zone; >> >> for_each_populated_zone(zone) { >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> - show_node(zone); >> - printk("%s per-cpu:\n", zone->name); >> + >> + if (filter & SHOW_MEM_PERCPU_LISTS) { >> + show_node(zone); >> + printk("%s per-cpu:\n", zone->name); >> + } >> >> for_each_online_cpu(cpu) { >> struct per_cpu_pageset *pageset; >> >> pageset = per_cpu_ptr(zone->pageset, cpu); >> >> + free_pcp += pageset->pcp.count; >> + >> + if (!(filter & SHOW_MEM_PERCPU_LISTS)) >> + continue; >> + >> printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", >> cpu, pageset->pcp.high, >> pageset->pcp.batch, pageset->pcp.count); >> @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) >> >> printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" >> " active_file:%lu inactive_file:%lu isolated_file:%lu\n" >> - " unevictable:%lu" >> - " dirty:%lu writeback:%lu unstable:%lu\n" >> - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" >> + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" >> - " free_cma:%lu\n", >> + " free:%lu free_pcp:%lu free_cma:%lu\n", > > Why is "free:" itself moved? It is unlikely, but I could imagine that > this might break something that is parsing the kernel log and it would be > better to just leave it where it is and add "free_pcp:" after "free_cma:" > since this is extending the message. I think it looks better at the beginning of new line, like this: [ 44.452955] Mem-Info: [ 44.453233] active_anon:2307 inactive_anon:36 isolated_anon:0 [ 44.453233] active_file:4120 inactive_file:4623 isolated_file:0 [ 44.453233] unevictable:0 dirty:6 writeback:0 unstable:0 [ 44.453233] slab_reclaimable:3500 slab_unreclaimable:7441 [ 44.453233] mapped:2113 shmem:45 pagetables:292 bounce:0 [ 44.453233] free:456891 free_pcp:12179 free_cma:0 In this order fields at each line have something in common. I'll spend some some time playing with this code and oom log, maybe I'll try to turn whole output into table or something. > >> global_page_state(NR_ACTIVE_ANON), >> global_page_state(NR_INACTIVE_ANON), >> global_page_state(NR_ISOLATED_ANON), >> @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) >> global_page_state(NR_FILE_DIRTY), >> global_page_state(NR_WRITEBACK), >> global_page_state(NR_UNSTABLE_NFS), >> - global_page_state(NR_FREE_PAGES), >> global_page_state(NR_SLAB_RECLAIMABLE), >> global_page_state(NR_SLAB_UNRECLAIMABLE), >> global_page_state(NR_FILE_MAPPED), >> global_page_state(NR_SHMEM), >> global_page_state(NR_PAGETABLE), >> global_page_state(NR_BOUNCE), >> + global_page_state(NR_FREE_PAGES), >> + free_pcp, >> global_page_state(NR_FREE_CMA_PAGES)); >> >> for_each_populated_zone(zone) { >> @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) >> >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> + >> + free_pcp = 0; >> + for_each_online_cpu(cpu) >> + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; >> + >> show_node(zone); >> printk("%s" >> " free:%lukB" >> @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) >> " pagetables:%lukB" >> " unstable:%lukB" >> " bounce:%lukB" >> + " free_pcp:%lukB" >> + " local_pcp:%ukB" >> " free_cma:%lukB" >> " writeback_tmp:%lukB" >> " pages_scanned:%lu" >> @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) >> K(zone_page_state(zone, NR_PAGETABLE)), >> K(zone_page_state(zone, NR_UNSTABLE_NFS)), >> K(zone_page_state(zone, NR_BOUNCE)), >> + K(free_pcp), >> + K(this_cpu_read(zone->pageset->pcp.count)), >> K(zone_page_state(zone, NR_FREE_CMA_PAGES)), >> K(zone_page_state(zone, NR_WRITEBACK_TEMP)), >> K(zone_page_state(zone, NR_PAGES_SCANNED)), >> > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-24 22:05 ` Konstantin Khlebnikov 0 siblings, 0 replies; 22+ messages in thread From: Konstantin Khlebnikov @ 2015-02-24 22:05 UTC (permalink / raw) To: David Rientjes Cc: Konstantin Khlebnikov, linux-mm@kvack.org, Andrew Morton, Linux Kernel Mailing List On Tue, Feb 24, 2015 at 11:41 PM, David Rientjes <rientjes@google.com> wrote: > On Fri, 20 Feb 2015, Konstantin Khlebnikov wrote: > >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index 028565a..0538de0 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -1126,6 +1126,7 @@ extern void pagefault_out_of_memory(void); >> * various contexts. >> */ >> #define SHOW_MEM_FILTER_NODES (0x0001u) /* disallowed nodes */ >> +#define SHOW_MEM_PERCPU_LISTS (0x0002u) /* per-zone per-cpu */ >> >> extern void show_free_areas(unsigned int flags); >> extern bool skip_free_areas_node(unsigned int flags, int nid); > > I, like others, think this should probably be left out until someone > actually needs to use it. Not a problem, this is just a few lines of code. We can get rid of it at any time. > >> diff --git a/mm/page_alloc.c b/mm/page_alloc.c >> index a47f0b2..e591f3b 100644 >> --- a/mm/page_alloc.c >> +++ b/mm/page_alloc.c >> @@ -3198,20 +3198,29 @@ static void show_migration_types(unsigned char type) >> */ >> void show_free_areas(unsigned int filter) >> { >> + unsigned long free_pcp = 0; >> int cpu; >> struct zone *zone; >> >> for_each_populated_zone(zone) { >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> - show_node(zone); >> - printk("%s per-cpu:\n", zone->name); >> + >> + if (filter & SHOW_MEM_PERCPU_LISTS) { >> + show_node(zone); >> + printk("%s per-cpu:\n", zone->name); >> + } >> >> for_each_online_cpu(cpu) { >> struct per_cpu_pageset *pageset; >> >> pageset = per_cpu_ptr(zone->pageset, cpu); >> >> + free_pcp += pageset->pcp.count; >> + >> + if (!(filter & SHOW_MEM_PERCPU_LISTS)) >> + continue; >> + >> printk("CPU %4d: hi:%5d, btch:%4d usd:%4d\n", >> cpu, pageset->pcp.high, >> pageset->pcp.batch, pageset->pcp.count); >> @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) >> >> printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" >> " active_file:%lu inactive_file:%lu isolated_file:%lu\n" >> - " unevictable:%lu" >> - " dirty:%lu writeback:%lu unstable:%lu\n" >> - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" >> + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" >> " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" >> - " free_cma:%lu\n", >> + " free:%lu free_pcp:%lu free_cma:%lu\n", > > Why is "free:" itself moved? It is unlikely, but I could imagine that > this might break something that is parsing the kernel log and it would be > better to just leave it where it is and add "free_pcp:" after "free_cma:" > since this is extending the message. I think it looks better at the beginning of new line, like this: [ 44.452955] Mem-Info: [ 44.453233] active_anon:2307 inactive_anon:36 isolated_anon:0 [ 44.453233] active_file:4120 inactive_file:4623 isolated_file:0 [ 44.453233] unevictable:0 dirty:6 writeback:0 unstable:0 [ 44.453233] slab_reclaimable:3500 slab_unreclaimable:7441 [ 44.453233] mapped:2113 shmem:45 pagetables:292 bounce:0 [ 44.453233] free:456891 free_pcp:12179 free_cma:0 In this order fields at each line have something in common. I'll spend some some time playing with this code and oom log, maybe I'll try to turn whole output into table or something. > >> global_page_state(NR_ACTIVE_ANON), >> global_page_state(NR_INACTIVE_ANON), >> global_page_state(NR_ISOLATED_ANON), >> @@ -3235,13 +3243,14 @@ void show_free_areas(unsigned int filter) >> global_page_state(NR_FILE_DIRTY), >> global_page_state(NR_WRITEBACK), >> global_page_state(NR_UNSTABLE_NFS), >> - global_page_state(NR_FREE_PAGES), >> global_page_state(NR_SLAB_RECLAIMABLE), >> global_page_state(NR_SLAB_UNRECLAIMABLE), >> global_page_state(NR_FILE_MAPPED), >> global_page_state(NR_SHMEM), >> global_page_state(NR_PAGETABLE), >> global_page_state(NR_BOUNCE), >> + global_page_state(NR_FREE_PAGES), >> + free_pcp, >> global_page_state(NR_FREE_CMA_PAGES)); >> >> for_each_populated_zone(zone) { >> @@ -3249,6 +3258,11 @@ void show_free_areas(unsigned int filter) >> >> if (skip_free_areas_node(filter, zone_to_nid(zone))) >> continue; >> + >> + free_pcp = 0; >> + for_each_online_cpu(cpu) >> + free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; >> + >> show_node(zone); >> printk("%s" >> " free:%lukB" >> @@ -3275,6 +3289,8 @@ void show_free_areas(unsigned int filter) >> " pagetables:%lukB" >> " unstable:%lukB" >> " bounce:%lukB" >> + " free_pcp:%lukB" >> + " local_pcp:%ukB" >> " free_cma:%lukB" >> " writeback_tmp:%lukB" >> " pages_scanned:%lu" >> @@ -3306,6 +3322,8 @@ void show_free_areas(unsigned int filter) >> K(zone_page_state(zone, NR_PAGETABLE)), >> K(zone_page_state(zone, NR_UNSTABLE_NFS)), >> K(zone_page_state(zone, NR_BOUNCE)), >> + K(free_pcp), >> + K(this_cpu_read(zone->pageset->pcp.count)), >> K(zone_page_state(zone, NR_FREE_CMA_PAGES)), >> K(zone_page_state(zone, NR_WRITEBACK_TEMP)), >> K(zone_page_state(zone, NR_PAGES_SCANNED)), >> > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() 2015-02-24 22:05 ` Konstantin Khlebnikov @ 2015-02-24 22:31 ` David Rientjes -1 siblings, 0 replies; 22+ messages in thread From: David Rientjes @ 2015-02-24 22:31 UTC (permalink / raw) To: Konstantin Khlebnikov Cc: Konstantin Khlebnikov, linux-mm@kvack.org, Andrew Morton, Linux Kernel Mailing List On Wed, 25 Feb 2015, Konstantin Khlebnikov wrote: > >> @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > >> > >> printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > >> " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > >> - " unevictable:%lu" > >> - " dirty:%lu writeback:%lu unstable:%lu\n" > >> - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > >> + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > >> + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > >> " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > >> - " free_cma:%lu\n", > >> + " free:%lu free_pcp:%lu free_cma:%lu\n", > > > > Why is "free:" itself moved? It is unlikely, but I could imagine that > > this might break something that is parsing the kernel log and it would be > > better to just leave it where it is and add "free_pcp:" after "free_cma:" > > since this is extending the message. > > I think it looks better at the beginning of new line, like this: > > [ 44.452955] Mem-Info: > [ 44.453233] active_anon:2307 inactive_anon:36 isolated_anon:0 > [ 44.453233] active_file:4120 inactive_file:4623 isolated_file:0 > [ 44.453233] unevictable:0 dirty:6 writeback:0 unstable:0 > [ 44.453233] slab_reclaimable:3500 slab_unreclaimable:7441 > [ 44.453233] mapped:2113 shmem:45 pagetables:292 bounce:0 > [ 44.453233] free:456891 free_pcp:12179 free_cma:0 > > In this order fields at each line have something in common. > > I'll spend some some time playing with this code and oom log, > maybe I'll try to turn whole output into table or something. > The problem is that oom logs are usually parsed only from the kernel log, there's no other userspace trigger that we can use to identify when the kernel has killed something unless we wait() on every possible victim. It's typical for systems software to parse this information and unless there is a compelling reason other than "looks better", I think messages should only be extended rather than rearranged. Admittedly, scraping the kernel log for oom kill events could certainly be done better with a userspace notification, but we currently lack that support in the kernel and there might be parsers out there in the wild that would break because of this. I agree removing the pcp counters is good for this output, though, so I'd love to see that patch without this change. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH] mm: hide per-cpu lists in output of show_mem() @ 2015-02-24 22:31 ` David Rientjes 0 siblings, 0 replies; 22+ messages in thread From: David Rientjes @ 2015-02-24 22:31 UTC (permalink / raw) To: Konstantin Khlebnikov Cc: Konstantin Khlebnikov, linux-mm@kvack.org, Andrew Morton, Linux Kernel Mailing List On Wed, 25 Feb 2015, Konstantin Khlebnikov wrote: > >> @@ -3220,11 +3229,10 @@ void show_free_areas(unsigned int filter) > >> > >> printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" > >> " active_file:%lu inactive_file:%lu isolated_file:%lu\n" > >> - " unevictable:%lu" > >> - " dirty:%lu writeback:%lu unstable:%lu\n" > >> - " free:%lu slab_reclaimable:%lu slab_unreclaimable:%lu\n" > >> + " unevictable:%lu dirty:%lu writeback:%lu unstable:%lu\n" > >> + " slab_reclaimable:%lu slab_unreclaimable:%lu\n" > >> " mapped:%lu shmem:%lu pagetables:%lu bounce:%lu\n" > >> - " free_cma:%lu\n", > >> + " free:%lu free_pcp:%lu free_cma:%lu\n", > > > > Why is "free:" itself moved? It is unlikely, but I could imagine that > > this might break something that is parsing the kernel log and it would be > > better to just leave it where it is and add "free_pcp:" after "free_cma:" > > since this is extending the message. > > I think it looks better at the beginning of new line, like this: > > [ 44.452955] Mem-Info: > [ 44.453233] active_anon:2307 inactive_anon:36 isolated_anon:0 > [ 44.453233] active_file:4120 inactive_file:4623 isolated_file:0 > [ 44.453233] unevictable:0 dirty:6 writeback:0 unstable:0 > [ 44.453233] slab_reclaimable:3500 slab_unreclaimable:7441 > [ 44.453233] mapped:2113 shmem:45 pagetables:292 bounce:0 > [ 44.453233] free:456891 free_pcp:12179 free_cma:0 > > In this order fields at each line have something in common. > > I'll spend some some time playing with this code and oom log, > maybe I'll try to turn whole output into table or something. > The problem is that oom logs are usually parsed only from the kernel log, there's no other userspace trigger that we can use to identify when the kernel has killed something unless we wait() on every possible victim. It's typical for systems software to parse this information and unless there is a compelling reason other than "looks better", I think messages should only be extended rather than rearranged. Admittedly, scraping the kernel log for oom kill events could certainly be done better with a userspace notification, but we currently lack that support in the kernel and there might be parsers out there in the wild that would break because of this. I agree removing the pcp counters is good for this output, though, so I'd love to see that patch without this change. ^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2015-02-26 23:14 UTC | newest] Thread overview: 22+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-02-20 14:39 [PATCH] mm: hide per-cpu lists in output of show_mem() Konstantin Khlebnikov 2015-02-20 14:39 ` Konstantin Khlebnikov 2015-02-20 14:40 ` Konstantin Khlebnikov 2015-02-20 14:40 ` Konstantin Khlebnikov 2015-02-20 21:45 ` Andrew Morton 2015-02-20 21:45 ` Andrew Morton 2015-02-23 14:37 ` Michal Hocko 2015-02-23 14:37 ` Michal Hocko 2015-02-24 9:03 ` Konstantin Khlebnikov 2015-02-24 9:03 ` Konstantin Khlebnikov 2015-02-25 21:44 ` Andrew Morton 2015-02-25 21:44 ` Andrew Morton 2015-02-26 6:14 ` [PATCH] mm: completely remove dumping per-cpu lists from show_mem() Konstantin Khlebnikov 2015-02-26 6:14 ` Konstantin Khlebnikov 2015-02-26 23:14 ` Dave Hansen 2015-02-26 23:14 ` Dave Hansen 2015-02-24 20:41 ` [PATCH] mm: hide per-cpu lists in output of show_mem() David Rientjes 2015-02-24 20:41 ` David Rientjes 2015-02-24 22:05 ` Konstantin Khlebnikov 2015-02-24 22:05 ` Konstantin Khlebnikov 2015-02-24 22:31 ` David Rientjes 2015-02-24 22:31 ` David Rientjes
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.