Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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)
	return ret;
	return ret;
}
}
EXPORT_SYMBOL_GPL(remove_memory);
EXPORT_SYMBOL_GPL(remove_memory);
#endif /* CONFIG_MEMORY_HOTREMOVE */
#endif
#endif
+0 −45
Original line number Original line Diff line number Diff line
@@ -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)
+0 −6
Original line number Original line Diff line number Diff line
@@ -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)
{
{
+0 −5
Original line number Original line Diff line number Diff line
@@ -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 */
+0 −5
Original line number Original line Diff line number Diff line
@@ -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;
Loading