diff options
Diffstat (limited to 'mm/memory_hotplug.c')
| -rw-r--r-- | mm/memory_hotplug.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index dfc0a6134c7c..7d0797475a47 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -1014,11 +1014,42 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | |||
| 1014 | 1014 | ||
| 1015 | int remove_memory(u64 start, u64 size) | 1015 | int remove_memory(u64 start, u64 size) |
| 1016 | { | 1016 | { |
| 1017 | struct memory_block *mem = NULL; | ||
| 1018 | struct mem_section *section; | ||
| 1017 | unsigned long start_pfn, end_pfn; | 1019 | unsigned long start_pfn, end_pfn; |
| 1020 | unsigned long pfn, section_nr; | ||
| 1021 | int ret; | ||
| 1018 | 1022 | ||
| 1019 | start_pfn = PFN_DOWN(start); | 1023 | start_pfn = PFN_DOWN(start); |
| 1020 | end_pfn = start_pfn + PFN_DOWN(size); | 1024 | end_pfn = start_pfn + PFN_DOWN(size); |
| 1021 | return __offline_pages(start_pfn, end_pfn, 120 * HZ); | 1025 | |
| 1026 | for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) { | ||
| 1027 | section_nr = pfn_to_section_nr(pfn); | ||
| 1028 | if (!present_section_nr(section_nr)) | ||
| 1029 | continue; | ||
| 1030 | |||
| 1031 | section = __nr_to_section(section_nr); | ||
| 1032 | /* same memblock? */ | ||
| 1033 | if (mem) | ||
| 1034 | if ((section_nr >= mem->start_section_nr) && | ||
| 1035 | (section_nr <= mem->end_section_nr)) | ||
| 1036 | continue; | ||
| 1037 | |||
| 1038 | mem = find_memory_block_hinted(section, mem); | ||
| 1039 | if (!mem) | ||
| 1040 | continue; | ||
| 1041 | |||
| 1042 | ret = offline_memory_block(mem); | ||
| 1043 | if (ret) { | ||
| 1044 | kobject_put(&mem->dev.kobj); | ||
| 1045 | return ret; | ||
| 1046 | } | ||
| 1047 | } | ||
| 1048 | |||
| 1049 | if (mem) | ||
| 1050 | kobject_put(&mem->dev.kobj); | ||
| 1051 | |||
| 1052 | return 0; | ||
| 1022 | } | 1053 | } |
| 1023 | #else | 1054 | #else |
| 1024 | int offline_pages(unsigned long start_pfn, unsigned long nr_pages) | 1055 | int offline_pages(unsigned long start_pfn, unsigned long nr_pages) |
