diff options
Diffstat (limited to 'mm/memory_hotplug.c')
-rw-r--r-- | mm/memory_hotplug.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 2047465cd27c..030ce8a5bb0e 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/page-isolation.h> | 27 | #include <linux/page-isolation.h> |
28 | #include <linux/pfn.h> | 28 | #include <linux/pfn.h> |
29 | #include <linux/suspend.h> | 29 | #include <linux/suspend.h> |
30 | #include <linux/mm_inline.h> | ||
30 | 31 | ||
31 | #include <asm/tlbflush.h> | 32 | #include <asm/tlbflush.h> |
32 | 33 | ||
@@ -71,7 +72,9 @@ static void get_page_bootmem(unsigned long info, struct page *page, int type) | |||
71 | atomic_inc(&page->_count); | 72 | atomic_inc(&page->_count); |
72 | } | 73 | } |
73 | 74 | ||
74 | void put_page_bootmem(struct page *page) | 75 | /* reference to __meminit __free_pages_bootmem is valid |
76 | * so use __ref to tell modpost not to generate a warning */ | ||
77 | void __ref put_page_bootmem(struct page *page) | ||
75 | { | 78 | { |
76 | int type; | 79 | int type; |
77 | 80 | ||
@@ -672,6 +675,9 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) | |||
672 | if (!ret) { /* Success */ | 675 | if (!ret) { /* Success */ |
673 | list_add_tail(&page->lru, &source); | 676 | list_add_tail(&page->lru, &source); |
674 | move_pages--; | 677 | move_pages--; |
678 | inc_zone_page_state(page, NR_ISOLATED_ANON + | ||
679 | page_is_file_cache(page)); | ||
680 | |||
675 | } else { | 681 | } else { |
676 | /* Becasue we don't have big zone->lock. we should | 682 | /* Becasue we don't have big zone->lock. we should |
677 | check this again here. */ | 683 | check this again here. */ |
@@ -694,7 +700,7 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) | |||
694 | if (list_empty(&source)) | 700 | if (list_empty(&source)) |
695 | goto out; | 701 | goto out; |
696 | /* this function returns # of failed pages */ | 702 | /* this function returns # of failed pages */ |
697 | ret = migrate_pages(&source, hotremove_migrate_alloc, 0); | 703 | ret = migrate_pages(&source, hotremove_migrate_alloc, 0, 1); |
698 | 704 | ||
699 | out: | 705 | out: |
700 | return ret; | 706 | return ret; |
@@ -747,7 +753,7 @@ check_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) | |||
747 | return offlined; | 753 | return offlined; |
748 | } | 754 | } |
749 | 755 | ||
750 | int offline_pages(unsigned long start_pfn, | 756 | static int offline_pages(unsigned long start_pfn, |
751 | unsigned long end_pfn, unsigned long timeout) | 757 | unsigned long end_pfn, unsigned long timeout) |
752 | { | 758 | { |
753 | unsigned long pfn, nr_pages, expire; | 759 | unsigned long pfn, nr_pages, expire; |
@@ -849,6 +855,10 @@ repeat: | |||
849 | 855 | ||
850 | setup_per_zone_wmarks(); | 856 | setup_per_zone_wmarks(); |
851 | calculate_zone_inactive_ratio(zone); | 857 | calculate_zone_inactive_ratio(zone); |
858 | if (!node_present_pages(node)) { | ||
859 | node_clear_state(node, N_HIGH_MEMORY); | ||
860 | kswapd_stop(node); | ||
861 | } | ||
852 | 862 | ||
853 | vm_total_pages = nr_free_pagecache_pages(); | 863 | vm_total_pages = nr_free_pagecache_pages(); |
854 | writeback_set_ratelimit(); | 864 | writeback_set_ratelimit(); |