From bcb63fdf4f40adb7d8d4ab3ef9e7492e9c189432 Mon Sep 17 00:00:00 2001 From: Mel Gorman Date: Wed, 23 Jul 2008 21:26:52 -0700 Subject: [PATCH] --- yaml --- r: 105259 b: refs/heads/master c: 68ad8df42e12037c3894c9706ab428bf5cd6426b h: refs/heads/master i: 105257: 29441cb58bfdb9743ca83bcb74ddf91b18c9ee56 105255: e8d0f4c6bd92cd7f269e24c493b1479411bf163e v: v3 --- [refs] | 2 +- trunk/mm/internal.h | 5 +++++ trunk/mm/mm_init.c | 45 +++++++++++++++++++++++++++++++++++++++++++ trunk/mm/page_alloc.c | 1 + 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 46e0793e1b72..881b9a77398d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2dbb51c49f4fecb8330e43247a0edfbc4b2b8974 +refs/heads/master: 68ad8df42e12037c3894c9706ab428bf5cd6426b diff --git a/trunk/mm/internal.h b/trunk/mm/internal.h index 5d17f3efac41..50807e12490e 100644 --- a/trunk/mm/internal.h +++ b/trunk/mm/internal.h @@ -81,6 +81,7 @@ do { \ extern void mminit_verify_pageflags_layout(void); extern void mminit_verify_page_links(struct page *page, enum zone_type zone, unsigned long nid, unsigned long pfn); +extern void mminit_verify_zonelist(void); #else @@ -97,6 +98,10 @@ static inline void mminit_verify_page_links(struct page *page, enum zone_type zone, unsigned long nid, unsigned long pfn) { } + +static inline void mminit_verify_zonelist(void) +{ +} #endif /* CONFIG_DEBUG_MEMORY_INIT */ /* mminit_validate_memmodel_limits is independent of CONFIG_DEBUG_MEMORY_INIT */ diff --git a/trunk/mm/mm_init.c b/trunk/mm/mm_init.c index e16990d629e6..ce445ca097e7 100644 --- a/trunk/mm/mm_init.c +++ b/trunk/mm/mm_init.c @@ -11,6 +11,51 @@ int __meminitdata mminit_loglevel; +/* The zonelists are simply reported, validation is manual. */ +void mminit_verify_zonelist(void) +{ + int nid; + + if (mminit_loglevel < MMINIT_VERIFY) + return; + + for_each_online_node(nid) { + pg_data_t *pgdat = NODE_DATA(nid); + struct zone *zone; + struct zoneref *z; + struct zonelist *zonelist; + int i, listid, zoneid; + + BUG_ON(MAX_ZONELISTS > 2); + for (i = 0; i < MAX_ZONELISTS * MAX_NR_ZONES; i++) { + + /* Identify the zone and nodelist */ + zoneid = i % MAX_NR_ZONES; + listid = i / MAX_NR_ZONES; + zonelist = &pgdat->node_zonelists[listid]; + zone = &pgdat->node_zones[zoneid]; + if (!populated_zone(zone)) + continue; + + /* Print information about the zonelist */ + printk(KERN_DEBUG "mminit::zonelist %s %d:%s = ", + listid > 0 ? "thisnode" : "general", nid, + zone->name); + + /* Iterate the zonelist */ + for_each_zone_zonelist(zone, z, zonelist, zoneid) { +#ifdef CONFIG_NUMA + printk(KERN_CONT "%d:%s ", + zone->node, zone->name); +#else + printk(KERN_CONT "0:%s ", zone->name); +#endif /* CONFIG_NUMA */ + } + printk(KERN_CONT "\n"); + } + } +} + void __init mminit_verify_pageflags_layout(void) { int shift, width; diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index 0adb66e711e6..9ece07ce65b0 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -2352,6 +2352,7 @@ void build_all_zonelists(void) if (system_state == SYSTEM_BOOTING) { __build_all_zonelists(NULL); + mminit_verify_zonelist(); cpuset_init_current_mems_allowed(); } else { /* we have to stop all cpus to guarantee there is no user