diff options
| -rw-r--r-- | drivers/base/memory.c | 9 | ||||
| -rw-r--r-- | include/linux/memory_hotplug.h | 1 | ||||
| -rw-r--r-- | mm/memory_hotplug.c | 13 | 
3 files changed, 15 insertions, 8 deletions
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 7dda4f790f0..44e7de6ce69 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -248,26 +248,23 @@ static bool pages_correctly_reserved(unsigned long start_pfn,  static int  memory_block_action(unsigned long phys_index, unsigned long action)  { -	unsigned long start_pfn, start_paddr; +	unsigned long start_pfn;  	unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block;  	struct page *first_page;  	int ret;  	first_page = pfn_to_page(phys_index << PFN_SECTION_SHIFT); +	start_pfn = page_to_pfn(first_page);  	switch (action) {  		case MEM_ONLINE: -			start_pfn = page_to_pfn(first_page); -  			if (!pages_correctly_reserved(start_pfn, nr_pages))  				return -EBUSY;  			ret = online_pages(start_pfn, nr_pages);  			break;  		case MEM_OFFLINE: -			start_paddr = page_to_pfn(first_page) << PAGE_SHIFT; -			ret = remove_memory(start_paddr, -					    nr_pages << PAGE_SHIFT); +			ret = offline_pages(start_pfn, nr_pages);  			break;  		default:  			WARN(1, KERN_WARNING "%s(%ld, %ld) unknown action: " diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 910550f3b70..e64fe80eba9 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -233,6 +233,7 @@ static inline int is_mem_section_removable(unsigned long pfn,  extern int mem_online_node(int nid);  extern int add_memory(int nid, u64 start, u64 size);  extern int arch_add_memory(int nid, u64 start, u64 size); +extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);  extern int remove_memory(u64 start, u64 size);  extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,  								int nr_pages); diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index ce690a911f1..dfc0a6134c7 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -874,7 +874,7 @@ check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn)  	return offlined;  } -static int __ref offline_pages(unsigned long start_pfn, +static int __ref __offline_pages(unsigned long start_pfn,  		  unsigned long end_pfn, unsigned long timeout)  {  	unsigned long pfn, nr_pages, expire; @@ -1007,15 +1007,24 @@ out:  	return ret;  } +int offline_pages(unsigned long start_pfn, unsigned long nr_pages) +{ +	return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ); +} +  int remove_memory(u64 start, u64 size)  {  	unsigned long start_pfn, end_pfn;  	start_pfn = PFN_DOWN(start);  	end_pfn = start_pfn + PFN_DOWN(size); -	return offline_pages(start_pfn, end_pfn, 120 * HZ); +	return __offline_pages(start_pfn, end_pfn, 120 * HZ);  }  #else +int offline_pages(unsigned long start_pfn, unsigned long nr_pages) +{ +	return -EINVAL; +}  int remove_memory(u64 start, u64 size)  {  	return -EINVAL;  |