mm: __count_immobile_pages(): make sure the node is online
page_zone() requires an online node otherwise we are accessing NULL NODE_DATA. This is not an issue at the moment because node_zones are located at the structure beginning but this might change in the future so better be careful about that. Signed-off-by: Michal Hocko <mhocko@suse.cz> Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Acked-by: Mel Gorman <mgorman@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
687875fb7d
commit
656a070629
|
@ -5413,15 +5413,22 @@ __count_immobile_pages(struct zone *zone, struct page *page, int count)
|
|||
|
||||
bool is_pageblock_removable_nolock(struct page *page)
|
||||
{
|
||||
struct zone *zone = page_zone(page);
|
||||
unsigned long pfn = page_to_pfn(page);
|
||||
struct zone *zone;
|
||||
unsigned long pfn;
|
||||
|
||||
/*
|
||||
* We have to be careful here because we are iterating over memory
|
||||
* sections which are not zone aware so we might end up outside of
|
||||
* the zone but still within the section.
|
||||
* We have to take care about the node as well. If the node is offline
|
||||
* its NODE_DATA will be NULL - see page_zone.
|
||||
*/
|
||||
if (!zone || zone->zone_start_pfn > pfn ||
|
||||
if (!node_online(page_to_nid(page)))
|
||||
return false;
|
||||
|
||||
zone = page_zone(page);
|
||||
pfn = page_to_pfn(page);
|
||||
if (zone->zone_start_pfn > pfn ||
|
||||
zone->zone_start_pfn + zone->spanned_pages <= pfn)
|
||||
return false;
|
||||
|
||||
|
|
Loading…
Reference in New Issue