Commit 48e94196 authored by KAMEZAWA Hiroyuki's avatar KAMEZAWA Hiroyuki Committed by Linus Torvalds

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: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent de33b821
...@@ -718,7 +718,7 @@ int arch_add_memory(int nid, u64 start, u64 size) ...@@ -718,7 +718,7 @@ int arch_add_memory(int nid, u64 start, u64 size)
return ret; return ret;
} }
#ifdef CONFIG_MEMORY_HOTREMOVE
int remove_memory(u64 start, u64 size) int remove_memory(u64 start, u64 size)
{ {
unsigned long start_pfn, end_pfn; unsigned long start_pfn, end_pfn;
...@@ -734,4 +734,5 @@ int remove_memory(u64 start, u64 size) ...@@ -734,4 +734,5 @@ int remove_memory(u64 start, u64 size)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(remove_memory); EXPORT_SYMBOL_GPL(remove_memory);
#endif /* CONFIG_MEMORY_HOTREMOVE */
#endif #endif
...@@ -129,51 +129,6 @@ int __devinit arch_add_memory(int nid, u64 start, u64 size) ...@@ -129,51 +129,6 @@ int __devinit arch_add_memory(int nid, u64 start, u64 size)
return __add_pages(zone, start_pfn, nr_pages); return __add_pages(zone, start_pfn, nr_pages);
} }
/*
* First pass at this code will check to determine if the remove
* request is within the RMO. Do not allow removal within the RMO.
*/
int __devinit remove_memory(u64 start, u64 size)
{
struct zone *zone;
unsigned long start_pfn, end_pfn, nr_pages;
start_pfn = start >> PAGE_SHIFT;
nr_pages = size >> PAGE_SHIFT;
end_pfn = start_pfn + nr_pages;
printk("%s(): Attempting to remove memoy in range "
"%lx to %lx\n", __func__, start, start+size);
/*
* check for range within RMO
*/
zone = page_zone(pfn_to_page(start_pfn));
printk("%s(): memory will be removed from "
"the %s zone\n", __func__, zone->name);
/*
* not handling removing memory ranges that
* overlap multiple zones yet
*/
if (end_pfn > (zone->zone_start_pfn + zone->spanned_pages))
goto overlap;
/* make sure it is NOT in RMO */
if ((start < lmb.rmo_size) || ((start+size) < lmb.rmo_size)) {
printk("%s(): range to be removed must NOT be in RMO!\n",
__func__);
goto in_rmo;
}
return __remove_pages(zone, start_pfn, nr_pages);
overlap:
printk("%s(): memory range to be removed overlaps "
"multiple zones!!!\n", __func__);
in_rmo:
return -1;
}
#endif /* CONFIG_MEMORY_HOTPLUG */ #endif /* CONFIG_MEMORY_HOTPLUG */
void show_mem(void) void show_mem(void)
......
...@@ -294,12 +294,6 @@ int arch_add_memory(int nid, u64 start, u64 size) ...@@ -294,12 +294,6 @@ int arch_add_memory(int nid, u64 start, u64 size)
} }
EXPORT_SYMBOL_GPL(arch_add_memory); EXPORT_SYMBOL_GPL(arch_add_memory);
int remove_memory(u64 start, u64 size)
{
return -EINVAL;
}
EXPORT_SYMBOL_GPL(remove_memory);
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
int memory_add_physaddr_to_nid(u64 addr) int memory_add_physaddr_to_nid(u64 addr)
{ {
......
...@@ -1961,9 +1961,4 @@ void online_page(struct page *page) ...@@ -1961,9 +1961,4 @@ void online_page(struct page *page)
num_physpages++; num_physpages++;
} }
int remove_memory(u64 start, u64 size)
{
return -EINVAL;
}
#endif /* CONFIG_MEMORY_HOTPLUG */ #endif /* CONFIG_MEMORY_HOTPLUG */
...@@ -735,11 +735,6 @@ int arch_add_memory(int nid, u64 start, u64 size) ...@@ -735,11 +735,6 @@ int arch_add_memory(int nid, u64 start, u64 size)
return __add_pages(zone, start_pfn, nr_pages); return __add_pages(zone, start_pfn, nr_pages);
} }
int remove_memory(u64 start, u64 size)
{
return -EINVAL;
}
EXPORT_SYMBOL_GPL(remove_memory);
#endif #endif
struct kmem_cache *pmd_cache; struct kmem_cache *pmd_cache;
......
...@@ -474,12 +474,6 @@ int arch_add_memory(int nid, u64 start, u64 size) ...@@ -474,12 +474,6 @@ int arch_add_memory(int nid, u64 start, u64 size)
} }
EXPORT_SYMBOL_GPL(arch_add_memory); EXPORT_SYMBOL_GPL(arch_add_memory);
int remove_memory(u64 start, u64 size)
{
return -EINVAL;
}
EXPORT_SYMBOL_GPL(remove_memory);
#if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA) #if !defined(CONFIG_ACPI_NUMA) && defined(CONFIG_NUMA)
int memory_add_physaddr_to_nid(u64 start) int memory_add_physaddr_to_nid(u64 start)
{ {
......
...@@ -58,10 +58,9 @@ extern int add_one_highpage(struct page *page, int pfn, int bad_ppro); ...@@ -58,10 +58,9 @@ extern int add_one_highpage(struct page *page, int pfn, int bad_ppro);
extern void online_page(struct page *page); extern void online_page(struct page *page);
/* VM interface that may be used by firmware interface */ /* VM interface that may be used by firmware interface */
extern int online_pages(unsigned long, unsigned long); extern int online_pages(unsigned long, unsigned long);
#ifdef CONFIG_MEMORY_HOTREMOVE
extern int offline_pages(unsigned long, unsigned long, unsigned long);
extern void __offline_isolated_pages(unsigned long, unsigned long); extern void __offline_isolated_pages(unsigned long, unsigned long);
#endif extern int offline_pages(unsigned long, unsigned long, unsigned long);
/* reasonably generic interface to expand the physical pages in a zone */ /* reasonably generic interface to expand the physical pages in a zone */
extern int __add_pages(struct zone *zone, unsigned long start_pfn, extern int __add_pages(struct zone *zone, unsigned long start_pfn,
unsigned long nr_pages); unsigned long nr_pages);
...@@ -171,13 +170,6 @@ static inline int mhp_notimplemented(const char *func) ...@@ -171,13 +170,6 @@ static inline int mhp_notimplemented(const char *func)
} }
#endif /* ! CONFIG_MEMORY_HOTPLUG */ #endif /* ! CONFIG_MEMORY_HOTPLUG */
static inline int __remove_pages(struct zone *zone, unsigned long start_pfn,
unsigned long nr_pages)
{
printk(KERN_WARNING "%s() called, not yet supported\n", __FUNCTION__);
dump_stack();
return -ENOSYS;
}
extern int add_memory(int nid, u64 start, u64 size); extern int add_memory(int nid, u64 start, u64 size);
extern int arch_add_memory(int nid, u64 start, u64 size); extern int arch_add_memory(int nid, u64 start, u64 size);
......
...@@ -555,4 +555,10 @@ int offline_pages(unsigned long start_pfn, ...@@ -555,4 +555,10 @@ int offline_pages(unsigned long start_pfn,
undo_isolate_page_range(start_pfn, end_pfn); undo_isolate_page_range(start_pfn, end_pfn);
return ret; return ret;
} }
#else
int remove_memory(u64 start, u64 size)
{
return -EINVAL;
}
EXPORT_SYMBOL_GPL(remove_memory);
#endif /* CONFIG_MEMORY_HOTREMOVE */ #endif /* CONFIG_MEMORY_HOTREMOVE */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment