[PATCH] memory hotplug prep: fixup bad_range()
When doing memory hotplug operations, the size of existing zones can obviously change. This means that zone->zone_{start_pfn,spanned_pages} can change. There are currently no locks that protect these structure members. However, they are rarely accessed at runtime. Outside of swsusp, the only place that I can find is bad_range(). So, split bad_range() up into two pieces: one that needs to be locked and anther that doesn't. Signed-off-by: Dave Hansen <haveblue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
4ca644d970
commit
c6a57e19e4
1 changed files with 21 additions and 5 deletions
|
@ -78,21 +78,37 @@ int min_free_kbytes = 1024;
|
||||||
unsigned long __initdata nr_kernel_pages;
|
unsigned long __initdata nr_kernel_pages;
|
||||||
unsigned long __initdata nr_all_pages;
|
unsigned long __initdata nr_all_pages;
|
||||||
|
|
||||||
/*
|
static int page_outside_zone_boundaries(struct zone *zone, struct page *page)
|
||||||
* Temporary debugging check for pages not lying within a given zone.
|
|
||||||
*/
|
|
||||||
static int bad_range(struct zone *zone, struct page *page)
|
|
||||||
{
|
{
|
||||||
if (page_to_pfn(page) >= zone->zone_start_pfn + zone->spanned_pages)
|
if (page_to_pfn(page) >= zone->zone_start_pfn + zone->spanned_pages)
|
||||||
return 1;
|
return 1;
|
||||||
if (page_to_pfn(page) < zone->zone_start_pfn)
|
if (page_to_pfn(page) < zone->zone_start_pfn)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int page_is_consistent(struct zone *zone, struct page *page)
|
||||||
|
{
|
||||||
#ifdef CONFIG_HOLES_IN_ZONE
|
#ifdef CONFIG_HOLES_IN_ZONE
|
||||||
if (!pfn_valid(page_to_pfn(page)))
|
if (!pfn_valid(page_to_pfn(page)))
|
||||||
return 1;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
if (zone != page_zone(page))
|
if (zone != page_zone(page))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Temporary debugging check for pages not lying within a given zone.
|
||||||
|
*/
|
||||||
|
static int bad_range(struct zone *zone, struct page *page)
|
||||||
|
{
|
||||||
|
if (page_outside_zone_boundaries(zone, page))
|
||||||
return 1;
|
return 1;
|
||||||
|
if (!page_is_consistent(zone, page))
|
||||||
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue