diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2007-10-16 04:26:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 12:43:02 -0400 |
commit | 48e94196a533dbee17c252bf80d0310fb8c8c2eb (patch) | |
tree | 9b29060b0e2600dc7da645fd436dc94c25d1fb36 | |
parent | de33b821f34dc9e2fabf81a8ba464f3ef039bd00 (diff) |
fix memory hot remove not configured case.
Now, arch dependent code around CONFIG_MEMORY_HOTREMOVE is a mess.
This patch cleans up them. This is against 2.6.23-rc6-mm1.
- fix compile failure on ia64/ CONFIG_MEMORY_HOTPLUG && !CONFIG_MEMORY_HOTREMOVE case.
- For !CONFIG_MEMORY_HOTREMOVE, add generic no-op remove_memory(),
which returns -EINVAL.
- removed remove_pages() only used in powerpc.
- removed no-op remove_memory() in i386, sh, sparc64, x86_64.
- only powerpc returns -ENOSYS at memory hot remove(no-op). changes it
to return -EINVAL.
Note:
Currently, only ia64 supports CONFIG_MEMORY_HOTREMOVE. I welcome other
archs if there are requirements and testers.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | arch/ia64/mm/init.c | 3 | ||||
-rw-r--r-- | arch/powerpc/mm/mem.c | 45 | ||||
-rw-r--r-- | arch/sh/mm/init.c | 6 | ||||
-rw-r--r-- | arch/sparc64/mm/init.c | 5 | ||||
-rw-r--r-- | arch/x86/mm/init_32.c | 5 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 6 | ||||
-rw-r--r-- | include/linux/memory_hotplug.h | 12 | ||||
-rw-r--r-- | mm/memory_hotplug.c | 6 |
8 files changed, 10 insertions, 78 deletions
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 947ec0c73234..3e10152abbf0 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -718,7 +718,7 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
718 | 718 | ||
719 | return ret; | 719 | return ret; |
720 | } | 720 | } |
721 | 721 | #ifdef CONFIG_MEMORY_HOTREMOVE | |
722 | int remove_memory(u64 start, u64 size) | 722 | int remove_memory(u64 start, u64 size) |
723 | { | 723 | { |
724 | unsigned long start_pfn, end_pfn; | 724 | unsigned long start_pfn, end_pfn; |
@@ -734,4 +734,5 @@ out: | |||
734 | return ret; | 734 | return ret; |
735 | } | 735 | } |
736 | EXPORT_SYMBOL_GPL(remove_memory); | 736 | EXPORT_SYMBOL_GPL(remove_memory); |
737 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | ||
737 | #endif | 738 | #endif |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 32dcfc9b0082..81eb96ec13b2 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -129,51 +129,6 @@ int __devinit arch_add_memory(int nid, u64 start, u64 size) | |||
129 | return __add_pages(zone, start_pfn, nr_pages); | 129 | return __add_pages(zone, start_pfn, nr_pages); |
130 | } | 130 | } |
131 | 131 | ||
132 | /* | ||
133 | * First pass at this code will check to determine if the remove | ||
134 | * request is within the RMO. Do not allow removal within the RMO. | ||
135 | */ | ||
136 | int __devinit remove_memory(u64 start, u64 size) | ||
137 | { | ||
138 | struct zone *zone; | ||
139 | unsigned long start_pfn, end_pfn, nr_pages; | ||
140 | |||
141 | start_pfn = start >> PAGE_SHIFT; | ||
142 | nr_pages = size >> PAGE_SHIFT; | ||
143 | end_pfn = start_pfn + nr_pages; | ||
144 | |||
145 | printk("%s(): Attempting to remove memoy in range " | ||
146 | "%lx to %lx\n", __func__, start, start+size); | ||
147 | /* | ||
148 | * check for range within RMO | ||
149 | */ | ||
150 | zone = page_zone(pfn_to_page(start_pfn)); | ||
151 | |||
152 | printk("%s(): memory will be removed from " | ||
153 | "the %s zone\n", __func__, zone->name); | ||
154 | |||
155 | /* | ||
156 | * not handling removing memory ranges that | ||
157 | * overlap multiple zones yet | ||
158 | */ | ||
159 | if (end_pfn > (zone->zone_start_pfn + zone->spanned_pages)) | ||
160 | goto overlap; | ||
161 | |||
162 | /* make sure it is NOT in RMO */ | ||
163 | if ((start < lmb.rmo_size) || ((start+size) < lmb.rmo_size)) { | ||
164 | printk("%s(): range to be removed must NOT be in RMO!\n", | ||
165 | __func__); | ||
166 | goto in_rmo; | ||
167 | } | ||
168 | |||
169 | return __remove_pages(zone, start_pfn, nr_pages); | ||
170 | |||
171 | overlap: | ||
172 | printk("%s(): memory range to be removed overlaps " | ||
173 | "multiple zones!!!\n", __func__); | ||
174 | in_rmo: | ||
175 | return -1; | ||
176 | } | ||
177 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 132 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
178 | 133 | ||
179 | void show_mem(void) | 134 | void show_mem(void) |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 82b68c789a5f..d5e160da64b2 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -294,12 +294,6 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
294 | } | 294 | } |
295 | EXPORT_SYMBOL_GPL(arch_add_memory); | 295 | EXPORT_SYMBOL_GPL(arch_add_memory); |
296 | 296 | ||
297 | int remove_memory(u64 start, u64 size) | ||
298 | { | ||
299 | return -EINVAL; | ||
300 | } | ||
301 | EXPORT_SYMBOL_GPL(remove_memory); | ||
302 | |||
303 | #ifdef CONFIG_NUMA | 297 | #ifdef CONFIG_NUMA |
304 | int memory_add_physaddr_to_nid(u64 addr) | 298 | int memory_add_physaddr_to_nid(u64 addr) |
305 | { | 299 | { |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 69538d1aa0ad..100c4456ed1e 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -1961,9 +1961,4 @@ void online_page(struct page *page) | |||
1961 | num_physpages++; | 1961 | num_physpages++; |
1962 | } | 1962 | } |
1963 | 1963 | ||
1964 | int remove_memory(u64 start, u64 size) | ||
1965 | { | ||
1966 | return -EINVAL; | ||
1967 | } | ||
1968 | |||
1969 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 1964 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 730a5b177b1f..dda4e83649a0 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -735,11 +735,6 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
735 | return __add_pages(zone, start_pfn, nr_pages); | 735 | return __add_pages(zone, start_pfn, nr_pages); |
736 | } | 736 | } |
737 | 737 | ||
738 | int remove_memory(u64 start, u64 size) | ||
739 | { | ||
740 | return -EINVAL; | ||
741 | } | ||
742 | EXPORT_SYMBOL_GPL(remove_memory); | ||
743 | #endif | 738 | #endif |
744 | 739 | ||
745 | struct kmem_cache *pmd_cache; | 740 | struct kmem_cache *pmd_cache; |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 7d4fc633a9c9..1e3862e41065 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -474,12 +474,6 @@ error: | |||
474 | } | 474 | } |
475 | EXPORT_SYMBOL_GPL(arch_add_memory); | 475 | EXPORT_SYMBOL_GPL(arch_add_memory); |
476 | 476 | ||
477 | int remove_memory(u64 start, u64 size) | ||
478 | { | ||
479 | return -EINVAL; | ||
480 | } | ||
481 | EXPORT_SYMBOL_GPL(remove_memory); | ||
482 | |||
483 | #if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA) | 477 | #if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA) |
484 | int memory_add_physaddr_to_nid(u64 start) | 478 | int memory_add_physaddr_to_nid(u64 start) |
485 | { | 479 | { |
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 665951ef0390..8fee7a45736b 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h | |||
@@ -58,10 +58,9 @@ extern int add_one_highpage(struct page *page, int pfn, int bad_ppro); | |||
58 | extern void online_page(struct page *page); | 58 | extern void online_page(struct page *page); |
59 | /* VM interface that may be used by firmware interface */ | 59 | /* VM interface that may be used by firmware interface */ |
60 | extern int online_pages(unsigned long, unsigned long); | 60 | extern int online_pages(unsigned long, unsigned long); |
61 | #ifdef CONFIG_MEMORY_HOTREMOVE | ||
62 | extern int offline_pages(unsigned long, unsigned long, unsigned long); | ||
63 | extern void __offline_isolated_pages(unsigned long, unsigned long); | 61 | extern void __offline_isolated_pages(unsigned long, unsigned long); |
64 | #endif | 62 | extern int offline_pages(unsigned long, unsigned long, unsigned long); |
63 | |||
65 | /* reasonably generic interface to expand the physical pages in a zone */ | 64 | /* reasonably generic interface to expand the physical pages in a zone */ |
66 | extern int __add_pages(struct zone *zone, unsigned long start_pfn, | 65 | extern int __add_pages(struct zone *zone, unsigned long start_pfn, |
67 | unsigned long nr_pages); | 66 | unsigned long nr_pages); |
@@ -171,13 +170,6 @@ static inline int mhp_notimplemented(const char *func) | |||
171 | } | 170 | } |
172 | 171 | ||
173 | #endif /* ! CONFIG_MEMORY_HOTPLUG */ | 172 | #endif /* ! CONFIG_MEMORY_HOTPLUG */ |
174 | static inline int __remove_pages(struct zone *zone, unsigned long start_pfn, | ||
175 | unsigned long nr_pages) | ||
176 | { | ||
177 | printk(KERN_WARNING "%s() called, not yet supported\n", __FUNCTION__); | ||
178 | dump_stack(); | ||
179 | return -ENOSYS; | ||
180 | } | ||
181 | 173 | ||
182 | extern int add_memory(int nid, u64 start, u64 size); | 174 | extern int add_memory(int nid, u64 start, u64 size); |
183 | extern int arch_add_memory(int nid, u64 start, u64 size); | 175 | extern int arch_add_memory(int nid, u64 start, u64 size); |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index c4e1b958efde..091b9c6c2529 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -555,4 +555,10 @@ failed_removal: | |||
555 | undo_isolate_page_range(start_pfn, end_pfn); | 555 | undo_isolate_page_range(start_pfn, end_pfn); |
556 | return ret; | 556 | return ret; |
557 | } | 557 | } |
558 | #else | ||
559 | int remove_memory(u64 start, u64 size) | ||
560 | { | ||
561 | return -EINVAL; | ||
562 | } | ||
563 | EXPORT_SYMBOL_GPL(remove_memory); | ||
558 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | 564 | #endif /* CONFIG_MEMORY_HOTREMOVE */ |