diff options
Diffstat (limited to 'mm/memory_hotplug.c')
-rw-r--r-- | mm/memory_hotplug.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 89fee2dcb039..6837a1014372 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
27 | #include <linux/migrate.h> | 27 | #include <linux/migrate.h> |
28 | #include <linux/page-isolation.h> | 28 | #include <linux/page-isolation.h> |
29 | #include <linux/pfn.h> | ||
29 | 30 | ||
30 | #include <asm/tlbflush.h> | 31 | #include <asm/tlbflush.h> |
31 | 32 | ||
@@ -323,11 +324,11 @@ int __remove_pages(struct zone *zone, unsigned long phys_start_pfn, | |||
323 | BUG_ON(phys_start_pfn & ~PAGE_SECTION_MASK); | 324 | BUG_ON(phys_start_pfn & ~PAGE_SECTION_MASK); |
324 | BUG_ON(nr_pages % PAGES_PER_SECTION); | 325 | BUG_ON(nr_pages % PAGES_PER_SECTION); |
325 | 326 | ||
326 | release_mem_region(phys_start_pfn << PAGE_SHIFT, nr_pages * PAGE_SIZE); | ||
327 | |||
328 | sections_to_remove = nr_pages / PAGES_PER_SECTION; | 327 | sections_to_remove = nr_pages / PAGES_PER_SECTION; |
329 | for (i = 0; i < sections_to_remove; i++) { | 328 | for (i = 0; i < sections_to_remove; i++) { |
330 | unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION; | 329 | unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION; |
330 | release_mem_region(pfn << PAGE_SHIFT, | ||
331 | PAGES_PER_SECTION << PAGE_SHIFT); | ||
331 | ret = __remove_section(zone, __pfn_to_section(pfn)); | 332 | ret = __remove_section(zone, __pfn_to_section(pfn)); |
332 | if (ret) | 333 | if (ret) |
333 | break; | 334 | break; |
@@ -657,8 +658,9 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) | |||
657 | * We can skip free pages. And we can only deal with pages on | 658 | * We can skip free pages. And we can only deal with pages on |
658 | * LRU. | 659 | * LRU. |
659 | */ | 660 | */ |
660 | ret = isolate_lru_page(page, &source); | 661 | ret = isolate_lru_page(page); |
661 | if (!ret) { /* Success */ | 662 | if (!ret) { /* Success */ |
663 | list_add_tail(&page->lru, &source); | ||
662 | move_pages--; | 664 | move_pages--; |
663 | } else { | 665 | } else { |
664 | /* Becasue we don't have big zone->lock. we should | 666 | /* Becasue we don't have big zone->lock. we should |
@@ -849,10 +851,19 @@ failed_removal: | |||
849 | 851 | ||
850 | return ret; | 852 | return ret; |
851 | } | 853 | } |
854 | |||
855 | int remove_memory(u64 start, u64 size) | ||
856 | { | ||
857 | unsigned long start_pfn, end_pfn; | ||
858 | |||
859 | start_pfn = PFN_DOWN(start); | ||
860 | end_pfn = start_pfn + PFN_DOWN(size); | ||
861 | return offline_pages(start_pfn, end_pfn, 120 * HZ); | ||
862 | } | ||
852 | #else | 863 | #else |
853 | int remove_memory(u64 start, u64 size) | 864 | int remove_memory(u64 start, u64 size) |
854 | { | 865 | { |
855 | return -EINVAL; | 866 | return -EINVAL; |
856 | } | 867 | } |
857 | EXPORT_SYMBOL_GPL(remove_memory); | ||
858 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | 868 | #endif /* CONFIG_MEMORY_HOTREMOVE */ |
869 | EXPORT_SYMBOL_GPL(remove_memory); | ||