LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [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
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ 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	[flat|nested] 11+ messages in thread

* Re: [PATCH] mm: hide per-cpu lists in output of show_mem()
  2015-02-20 14:39 [PATCH] mm: hide per-cpu lists in output of show_mem() Konstantin Khlebnikov
@ 2015-02-20 14:40 ` Konstantin Khlebnikov
  2015-02-20 21:45 ` Andrew Morton
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 11+ 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] 11+ messages in thread

* Re: [PATCH] mm: hide per-cpu lists in output of show_mem()
  2015-02-20 14:39 [PATCH] mm: hide per-cpu lists in output of show_mem() Konstantin Khlebnikov
  2015-02-20 14:40 ` Konstantin Khlebnikov
@ 2015-02-20 21:45 ` Andrew Morton
  2015-02-23 14:37 ` Michal Hocko
  2015-02-24 20:41 ` [PATCH] mm: hide per-cpu lists in output of show_mem() David Rientjes
  3 siblings, 0 replies; 11+ 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] 11+ messages in thread

* Re: [PATCH] mm: hide per-cpu lists in output of show_mem()
  2015-02-20 14:39 [PATCH] mm: hide per-cpu lists in output of show_mem() Konstantin Khlebnikov
  2015-02-20 14:40 ` Konstantin Khlebnikov
  2015-02-20 21:45 ` Andrew Morton
@ 2015-02-23 14:37 ` Michal Hocko
  2015-02-24  9:03   ` Konstantin Khlebnikov
  2015-02-24 20:41 ` [PATCH] mm: hide per-cpu lists in output of show_mem() David Rientjes
  3 siblings, 1 reply; 11+ 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] 11+ 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
  2015-02-25 21:44     ` Andrew Morton
  0 siblings, 1 reply; 11+ messages in thread
From: Konstantin Khlebnikov @ 2015-02-24  9:03 UTC (permalink / raw)
  To: Michal Hocko
  Cc: Konstantin Khlebnikov, linux-mm, 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] 11+ messages in thread

* Re: [PATCH] mm: hide per-cpu lists in output of show_mem()
  2015-02-20 14:39 [PATCH] mm: hide per-cpu lists in output of show_mem() Konstantin Khlebnikov
                   ` (2 preceding siblings ...)
  2015-02-23 14:37 ` Michal Hocko
@ 2015-02-24 20:41 ` David Rientjes
  2015-02-24 22:05   ` Konstantin Khlebnikov
  3 siblings, 1 reply; 11+ 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] 11+ messages in thread

* Re: [PATCH] mm: hide per-cpu lists in output of show_mem()
  2015-02-24 20:41 ` [PATCH] mm: hide per-cpu lists in output of show_mem() David Rientjes
@ 2015-02-24 22:05   ` Konstantin Khlebnikov
  2015-02-24 22:31     ` David Rientjes
  0 siblings, 1 reply; 11+ messages in thread
From: Konstantin Khlebnikov @ 2015-02-24 22:05 UTC (permalink / raw)
  To: David Rientjes
  Cc: Konstantin Khlebnikov, linux-mm, 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] 11+ 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
  0 siblings, 0 replies; 11+ messages in thread
From: David Rientjes @ 2015-02-24 22:31 UTC (permalink / raw)
  To: Konstantin Khlebnikov
  Cc: Konstantin Khlebnikov, linux-mm, 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] 11+ 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
  2015-02-26  6:14       ` [PATCH] mm: completely remove dumping per-cpu lists from show_mem() Konstantin Khlebnikov
  0 siblings, 1 reply; 11+ messages in thread
From: Andrew Morton @ 2015-02-25 21:44 UTC (permalink / raw)
  To: Konstantin Khlebnikov
  Cc: Michal Hocko, Konstantin Khlebnikov, linux-mm, 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] 11+ 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
  2015-02-26 23:14         ` Dave Hansen
  0 siblings, 1 reply; 11+ 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	[flat|nested] 11+ messages in thread

* Re: [PATCH] mm: completely remove dumping per-cpu lists from show_mem()
  2015-02-26  6:14       ` [PATCH] mm: completely remove dumping per-cpu lists from show_mem() Konstantin Khlebnikov
@ 2015-02-26 23:14         ` Dave Hansen
  0 siblings, 0 replies; 11+ 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] 11+ messages in thread

end of thread, other threads:[~2015-02-26 23:14 UTC | newest]

Thread overview: 11+ 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:40 ` Konstantin Khlebnikov
2015-02-20 21:45 ` Andrew Morton
2015-02-23 14:37 ` Michal Hocko
2015-02-24  9:03   ` Konstantin Khlebnikov
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 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 22:05   ` Konstantin Khlebnikov
2015-02-24 22:31     ` David Rientjes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).