[PATCH] mm: show free pages per each migrate type

From: Neil Zhang
Date: Tue Apr 07 2015 - 21:53:24 EST


show detailed free pages per each migrate type in show_free_areas.

Signed-off-by: Neil Zhang <neilzhang1123@xxxxxxxxxxx>
---
mm/internal.h | 2 ++
mm/page_alloc.c | 55 ++++++++++++++++++++++++++-----------------------------
mm/vmstat.c | 13 -------------
3 files changed, 28 insertions(+), 42 deletions(-)

diff --git a/mm/internal.h b/mm/internal.h
index a96da5b..5cb3079 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -14,6 +14,8 @@
#include <linux/fs.h>
#include <linux/mm.h>

+extern char * const migratetype_names[MIGRATE_TYPES];
+
void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
unsigned long floor, unsigned long ceiling);

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 40e2942..2d70892 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3170,32 +3170,18 @@ out:

#define K(x) ((x) << (PAGE_SHIFT-10))

-static void show_migration_types(unsigned char type)
-{
- static const char types[MIGRATE_TYPES] = {
- [MIGRATE_UNMOVABLE] = 'U',
- [MIGRATE_RECLAIMABLE] = 'E',
- [MIGRATE_MOVABLE] = 'M',
- [MIGRATE_RESERVE] = 'R',
+char * const migratetype_names[MIGRATE_TYPES] = {
+ "Unmovable",
+ "Reclaimable",
+ "Movable",
+ "Reserve",
#ifdef CONFIG_CMA
- [MIGRATE_CMA] = 'C',
+ "CMA",
#endif
#ifdef CONFIG_MEMORY_ISOLATION
- [MIGRATE_ISOLATE] = 'I',
+ "Isolate",
#endif
- };
- char tmp[MIGRATE_TYPES + 1];
- char *p = tmp;
- int i;
-
- for (i = 0; i < MIGRATE_TYPES; i++) {
- if (type & (1 << i))
- *p++ = types[i];
- }
-
- *p = '\0';
- printk("(%s) ", tmp);
-}
+};

/*
* Show free area list (used inside shift_scroll-lock stuff)
@@ -3327,7 +3313,7 @@ void show_free_areas(unsigned int filter)

for_each_populated_zone(zone) {
unsigned long nr[MAX_ORDER], flags, order, total = 0;
- unsigned char types[MAX_ORDER];
+ unsigned long nr_free[MAX_ORDER][MIGRATE_TYPES], mtype;

if (skip_free_areas_node(filter, zone_to_nid(zone)))
continue;
@@ -3337,24 +3323,35 @@ void show_free_areas(unsigned int filter)
spin_lock_irqsave(&zone->lock, flags);
for (order = 0; order < MAX_ORDER; order++) {
struct free_area *area = &zone->free_area[order];
+ struct list_head *curr;
int type;

nr[order] = area->nr_free;
total += nr[order] << order;

- types[order] = 0;
for (type = 0; type < MIGRATE_TYPES; type++) {
+ nr_free[order][type] = 0;
if (!list_empty(&area->free_list[type]))
- types[order] |= 1 << type;
+ list_for_each(curr, &area->free_list[type])
+ nr_free[order][type]++;
}
}
spin_unlock_irqrestore(&zone->lock, flags);
- for (order = 0; order < MAX_ORDER; order++) {
+ for (order = 0; order < MAX_ORDER; order++)
printk("%lu*%lukB ", nr[order], K(1UL) << order);
- if (nr[order])
- show_migration_types(types[order]);
- }
printk("= %lukB\n", K(total));
+
+ printk("%12s: ", "orders");
+ for (order = 0; order < MAX_ORDER; order++)
+ printk("%6lu ", order);
+ printk("\n");
+
+ for (mtype = 0; mtype < MIGRATE_TYPES; mtype++) {
+ printk("%12s: ", migratetype_names[mtype]);
+ for (order = 0; order < MAX_ORDER; order++)
+ printk("%6lu ", nr_free[order][mtype]);
+ printk("\n");
+ }
}

hugetlb_show_meminfo();
diff --git a/mm/vmstat.c b/mm/vmstat.c
index 4f5cd97..699eeb3 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -897,19 +897,6 @@ static void walk_zones_in_node(struct seq_file *m, pg_data_t *pgdat,
#endif

#ifdef CONFIG_PROC_FS
-static char * const migratetype_names[MIGRATE_TYPES] = {
- "Unmovable",
- "Reclaimable",
- "Movable",
- "Reserve",
-#ifdef CONFIG_CMA
- "CMA",
-#endif
-#ifdef CONFIG_MEMORY_ISOLATION
- "Isolate",
-#endif
-};
-
static void frag_show_print(struct seq_file *m, pg_data_t *pgdat,
struct zone *zone)
{
--
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/