[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1219255911.8960.41.camel@nimitz>
Date: Wed, 20 Aug 2008 11:11:51 -0700
From: Dave Hansen <dave@...ux.vnet.ibm.com>
To: Adam Litke <agl@...ibm.com>
Cc: linux-mm <linux-mm@...ck.org>,
linux-kernel <linux-kernel@...r.kernel.org>,
Andrew Morton <akpm@...ux-foundation.org>,
nacc <nacc@...ux.vnet.ibm.com>, mel@....ul.ie,
apw <apw@...dowen.org>, agl <agl@...ux.vnet.ibm.com>
Subject: Re: [BUG] Make setup_zone_migrate_reserve() aware of overlapping
nodes
On Wed, 2008-08-20 at 12:08 -0500, Adam Litke wrote:
> I have gotten to the root cause of the hugetlb badness I reported back
> on August 15th. My system has the following memory topology (note the
> overlapping node):
>
> Node 0 Memory: 0x8000000-0x44000000
> Node 1 Memory: 0x0-0x8000000 0x44000000-0x80000000
>
> setup_zone_migrate_reserve() scans the address range 0x0-0x8000000
> looking for a pageblock to move onto the MIGRATE_RESERVE list. Finding
> no candidates, it happily continues the scan into 0x8000000-0x44000000.
> When a pageblock is found, the pages are moved to the MIGRATE_RESERVE
> list on the wrong zone. Oops.
This eventually gets down into move_freepages() via:
->setup_zone_migrate_reserve()
->move_freepages_block()
->move_freepages()
right?
It looks like there have been bugs in this area before in
move_freepages(). Should there be a more stringent check in *there*?
Maybe a warning?
>
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -2512,6 +2512,10 @@ static void setup_zone_migrate_reserve(struct
> zone *zone)
> pageblock_order;
>
> for (pfn = start_pfn; pfn < end_pfn; pfn += pageblock_nr_pages) {
> + /* Watch out for overlapping nodes */
> + if (!early_pfn_in_nid(pfn, zone->node))
> + continue;
zone->node doesn't exist on !CONFIG_NUMA. :(
You probably want:
if (!early_pfn_in_nid(pfn, zone_to_nid(zone)))
continue;
Are you sure you need the "early_" variant here? We're not using
early_pfn_valid() right below it. I guess you could also use:
if (!page_to_nid(page) != zone_to_nid(zone))
continue;
-- Dave
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists