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 7dda4f790f00..44e7de6ce694 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c | |||
| @@ -248,26 +248,23 @@ static bool pages_correctly_reserved(unsigned long start_pfn, | |||
| 248 | static int | 248 | static int |
| 249 | memory_block_action(unsigned long phys_index, unsigned long action) | 249 | memory_block_action(unsigned long phys_index, unsigned long action) |
| 250 | { | 250 | { |
| 251 | unsigned long start_pfn, start_paddr; | 251 | unsigned long start_pfn; |
| 252 | unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; | 252 | unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; |
| 253 | struct page *first_page; | 253 | struct page *first_page; |
| 254 | int ret; | 254 | int ret; |
| 255 | 255 | ||
| 256 | first_page = pfn_to_page(phys_index << PFN_SECTION_SHIFT); | 256 | first_page = pfn_to_page(phys_index << PFN_SECTION_SHIFT); |
| 257 | start_pfn = page_to_pfn(first_page); | ||
| 257 | 258 | ||
| 258 | switch (action) { | 259 | switch (action) { |
| 259 | case MEM_ONLINE: | 260 | case MEM_ONLINE: |
| 260 | start_pfn = page_to_pfn(first_page); | ||
| 261 | |||
| 262 | if (!pages_correctly_reserved(start_pfn, nr_pages)) | 261 | if (!pages_correctly_reserved(start_pfn, nr_pages)) |
| 263 | return -EBUSY; | 262 | return -EBUSY; |
| 264 | 263 | ||
| 265 | ret = online_pages(start_pfn, nr_pages); | 264 | ret = online_pages(start_pfn, nr_pages); |
| 266 | break; | 265 | break; |
| 267 | case MEM_OFFLINE: | 266 | case MEM_OFFLINE: |
| 268 | start_paddr = page_to_pfn(first_page) << PAGE_SHIFT; | 267 | ret = offline_pages(start_pfn, nr_pages); |
| 269 | ret = remove_memory(start_paddr, | ||
| 270 | nr_pages << PAGE_SHIFT); | ||
| 271 | break; | 268 | break; |
| 272 | default: | 269 | default: |
| 273 | WARN(1, KERN_WARNING "%s(%ld, %ld) unknown action: " | 270 | WARN(1, KERN_WARNING "%s(%ld, %ld) unknown action: " |
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 910550f3b70e..e64fe80eba96 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, | |||
| 233 | extern int mem_online_node(int nid); | 233 | extern int mem_online_node(int nid); |
| 234 | extern int add_memory(int nid, u64 start, u64 size); | 234 | extern int add_memory(int nid, u64 start, u64 size); |
| 235 | extern int arch_add_memory(int nid, u64 start, u64 size); | 235 | extern int arch_add_memory(int nid, u64 start, u64 size); |
| 236 | extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); | ||
| 236 | extern int remove_memory(u64 start, u64 size); | 237 | extern int remove_memory(u64 start, u64 size); |
| 237 | extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, | 238 | extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, |
| 238 | int nr_pages); | 239 | int nr_pages); |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index ce690a911f1b..dfc0a6134c7c 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) | |||
| 874 | return offlined; | 874 | return offlined; |
| 875 | } | 875 | } |
| 876 | 876 | ||
| 877 | static int __ref offline_pages(unsigned long start_pfn, | 877 | static int __ref __offline_pages(unsigned long start_pfn, |
| 878 | unsigned long end_pfn, unsigned long timeout) | 878 | unsigned long end_pfn, unsigned long timeout) |
| 879 | { | 879 | { |
| 880 | unsigned long pfn, nr_pages, expire; | 880 | unsigned long pfn, nr_pages, expire; |
| @@ -1007,15 +1007,24 @@ out: | |||
| 1007 | return ret; | 1007 | return ret; |
| 1008 | } | 1008 | } |
| 1009 | 1009 | ||
| 1010 | int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | ||
| 1011 | { | ||
| 1012 | return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ); | ||
| 1013 | } | ||
| 1014 | |||
| 1010 | int remove_memory(u64 start, u64 size) | 1015 | int remove_memory(u64 start, u64 size) |
| 1011 | { | 1016 | { |
| 1012 | unsigned long start_pfn, end_pfn; | 1017 | unsigned long start_pfn, end_pfn; |
| 1013 | 1018 | ||
| 1014 | start_pfn = PFN_DOWN(start); | 1019 | start_pfn = PFN_DOWN(start); |
| 1015 | end_pfn = start_pfn + PFN_DOWN(size); | 1020 | end_pfn = start_pfn + PFN_DOWN(size); |
| 1016 | return offline_pages(start_pfn, end_pfn, 120 * HZ); | 1021 | return __offline_pages(start_pfn, end_pfn, 120 * HZ); |
| 1017 | } | 1022 | } |
| 1018 | #else | 1023 | #else |
| 1024 | int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | ||
| 1025 | { | ||
| 1026 | return -EINVAL; | ||
| 1027 | } | ||
| 1019 | int remove_memory(u64 start, u64 size) | 1028 | int remove_memory(u64 start, u64 size) |
| 1020 | { | 1029 | { |
| 1021 | return -EINVAL; | 1030 | return -EINVAL; |
