From df429ac039360005299d56247647ca77098d660e Mon Sep 17 00:00:00 2001 From: Reza Arbab Date: Tue, 26 Jul 2016 15:22:23 -0700 Subject: memory-hotplug: more general validation of zone during online When memory is onlined, we are only able to rezone from ZONE_MOVABLE to ZONE_KERNEL, or from (ZONE_MOVABLE - 1) to ZONE_MOVABLE. To be more flexible, use the following criteria instead; to online memory from zone X into zone Y, * Any zones between X and Y must be unused. * If X is lower than Y, the onlined memory must lie at the end of X. * If X is higher than Y, the onlined memory must lie at the start of X. Add zone_can_shift() to make this determination. Link: http://lkml.kernel.org/r/1462816419-4479-3-git-send-email-arbab@linux.vnet.ibm.com Signed-off-by: Reza Arbab Reviewd-by: Yasuaki Ishimatsu Cc: Greg Kroah-Hartman Cc: Daniel Kiper Cc: Dan Williams Cc: Vlastimil Babka Cc: Tang Chen Cc: Joonsoo Kim Cc: David Vrabel Cc: Vitaly Kuznetsov Cc: David Rientjes Cc: Andrew Banman Cc: Chen Yucong Cc: Yasunori Goto Cc: Zhang Zhen Cc: Shaohua Li Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- include/linux/memory_hotplug.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'include/linux/memory_hotplug.h') diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 5145620ba48a..01033fadea47 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -284,5 +284,7 @@ extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms, unsigned long map_offset); extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map, unsigned long pnum); +extern int zone_can_shift(unsigned long pfn, unsigned long nr_pages, + enum zone_type target); #endif /* __LINUX_MEMORY_HOTPLUG_H */ -- cgit v1.2.3