aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>2007-10-16 04:26:14 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:43:02 -0400
commit48e94196a533dbee17c252bf80d0310fb8c8c2eb (patch)
tree9b29060b0e2600dc7da645fd436dc94c25d1fb36
parentde33b821f34dc9e2fabf81a8ba464f3ef039bd00 (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.c3
-rw-r--r--arch/powerpc/mm/mem.c45
-rw-r--r--arch/sh/mm/init.c6
-rw-r--r--arch/sparc64/mm/init.c5
-rw-r--r--arch/x86/mm/init_32.c5
-rw-r--r--arch/x86/mm/init_64.c6
-rw-r--r--include/linux/memory_hotplug.h12
-rw-r--r--mm/memory_hotplug.c6
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
722int remove_memory(u64 start, u64 size) 722int 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}
736EXPORT_SYMBOL_GPL(remove_memory); 736EXPORT_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 */
136int __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
171overlap:
172 printk("%s(): memory range to be removed overlaps "
173 "multiple zones!!!\n", __func__);
174in_rmo:
175 return -1;
176}
177#endif /* CONFIG_MEMORY_HOTPLUG */ 132#endif /* CONFIG_MEMORY_HOTPLUG */
178 133
179void show_mem(void) 134void 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}
295EXPORT_SYMBOL_GPL(arch_add_memory); 295EXPORT_SYMBOL_GPL(arch_add_memory);
296 296
297int remove_memory(u64 start, u64 size)
298{
299 return -EINVAL;
300}
301EXPORT_SYMBOL_GPL(remove_memory);
302
303#ifdef CONFIG_NUMA 297#ifdef CONFIG_NUMA
304int memory_add_physaddr_to_nid(u64 addr) 298int 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
1964int 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
738int remove_memory(u64 start, u64 size)
739{
740 return -EINVAL;
741}
742EXPORT_SYMBOL_GPL(remove_memory);
743#endif 738#endif
744 739
745struct kmem_cache *pmd_cache; 740struct 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}
475EXPORT_SYMBOL_GPL(arch_add_memory); 475EXPORT_SYMBOL_GPL(arch_add_memory);
476 476
477int remove_memory(u64 start, u64 size)
478{
479 return -EINVAL;
480}
481EXPORT_SYMBOL_GPL(remove_memory);
482
483#if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA) 477#if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA)
484int memory_add_physaddr_to_nid(u64 start) 478int 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);
58extern void online_page(struct page *page); 58extern 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 */
60extern int online_pages(unsigned long, unsigned long); 60extern int online_pages(unsigned long, unsigned long);
61#ifdef CONFIG_MEMORY_HOTREMOVE
62extern int offline_pages(unsigned long, unsigned long, unsigned long);
63extern void __offline_isolated_pages(unsigned long, unsigned long); 61extern void __offline_isolated_pages(unsigned long, unsigned long);
64#endif 62extern 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 */
66extern int __add_pages(struct zone *zone, unsigned long start_pfn, 65extern 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 */
174static 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
182extern int add_memory(int nid, u64 start, u64 size); 174extern int add_memory(int nid, u64 start, u64 size);
183extern int arch_add_memory(int nid, u64 start, u64 size); 175extern 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
559int remove_memory(u64 start, u64 size)
560{
561 return -EINVAL;
562}
563EXPORT_SYMBOL_GPL(remove_memory);
558#endif /* CONFIG_MEMORY_HOTREMOVE */ 564#endif /* CONFIG_MEMORY_HOTREMOVE */