memory hotplug: fix page_zone() calculation in test_pages_isolated()
Subsystems (2)
PATCH 1/1 memory hotplug: fix page_zone() calculation in test_pages_isolated()
My last bugfix here (adding zone->lock) introduced a new problem: Using page_zone(pfn_to_page(pfn)) to get the zone after the for() loop is wrong. pfn will then be >= end_pfn, which may be in a different zone or not present at all. This may lead to an addressing exception in page_zone() or spin_lock_irqsave().
Now I use __first_valid_page() again after the loop to find a valid page for page_zone().
--- mm/page_isolation.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
mm/page_isolation.c +3 -2
@@ -130,10 +130,11 @@ int test_pages_isolated(unsigned long stif (page &&get_pageblock_migratetype (page) !=MIGRATE_ISOLATE )break ; } -if (pfn < end_pfn) + page =__first_valid_page (start_pfn, end_pfn - start_pfn); +if ((pfn < end_pfn) || !page)return -EBUSY ;/* Check all pages are free or Marked as ISOLATED */ - zone =page_zone (pfn_to_page (pfn)); + zone =page_zone (page);spin_lock_irqsave (&zone->lock, flags); ret =__test_page_isolated_in_pageblock (start_pfn, end_pfn);spin_unlock_irqrestore (&zone->lock, flags);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Looks like you beat me to it, and with a nicer fix too.
Quoted 8 lines · Gerald Schaefer
From: Gerald Schaefer <[email protected]>
My last bugfix here (adding
zone->lock) introduced a new problem: Using page_zone(pfn_to_page(pfn)) to get the zone after thefor()loop is wrong. pfn will then be >=end_pfn, which may be in a different zone or not present at all. This may lead to an addressing exception inpage_zone()orspin_lock_irqsave().
Quoted 4 lines
Now I use
__first_valid_page()again after the loop to find a valid page forpage_zone().Signed-off-by Gerald Schaefer <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 8 lines · On Wed, 29 Oct 2008 15:25:30 +0100 Gerald Schaefer…
From: Gerald Schaefer <[email protected]>
My last bugfix here (adding
zone->lock) introduced a new problem: Using page_zone(pfn_to_page(pfn)) to get the zone after thefor()loop is wrong. pfn will then be >=end_pfn, which may be in a different zone or not present at all. This may lead to an addressing exception inpage_zone()orspin_lock_irqsave().
Quoted 5 lines
Now I use
__first_valid_page()again after the loop to find a valid page forpage_zone().Signed-off-by Gerald Schaefer <[email protected]>
Thanks.
Quoted 14 lines
--- mm/page_isolation.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)Index:
linux-2.6/mm/page_isolation.c
===================================================================mm/page_isolation.c +0
-0@@ -130,10 +130,11 @@ int test_pages_isolated(unsigned long stif (page &&get_pageblock_migratetype (page) !=MIGRATE_ISOLATE )break ; }
mm/page_isolation.c int test_pages_isolated(unsigned long st · line 140
Quoted 10 lines
mm/page_isolation.c +3
-2-if (pfn < end_pfn) + page =__first_valid_page (start_pfn, end_pfn - start_pfn); +if ((pfn < end_pfn) || !page)return -EBUSY ;/* Check all pages are free or Marked as ISOLATED */ - zone =page_zone (pfn_to_page (pfn)); + zone =page_zone (page);spin_lock_irqsave (&zone->lock, flags); ret =__test_page_isolated_in_pageblock (start_pfn, end_pfn);spin_unlock_irqrestore (&zone->lock, flags);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>