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>
This commit is contained in:
Родитель
de33b821f3
Коммит
48e94196a5
|
@ -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 @@ out:
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
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)
|
||||||
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 @@ error:
|
||||||
}
|
}
|
||||||
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);
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
#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 @@ failed_removal:
|
||||||
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 */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче