mirror of
https://github.com/genesi/linux-legacy.git
synced 2026-05-19 02:12:43 +00:00
[PATCH] pgdat allocation for new node add (specify node id)
Change the name of old add_memory() to arch_add_memory. And use node id to
get pgdat for the node at NODE_DATA().
Note: Powerpc's old add_memory() is defined as __devinit. However,
add_memory() is usually called only after bootup.
I suppose it may be redundant. But, I'm not well known about powerpc.
So, I keep it. (But, __meminit is better at least.)
Signed-off-by: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: Dave Hansen <haveblue@us.ibm.com>
Cc: "Brown, Len" <len.brown@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
dd56a8e36f
commit
bc02af93dd
@@ -654,7 +654,7 @@ void __init mem_init(void)
|
||||
*/
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
int add_memory(u64 start, u64 size)
|
||||
int arch_add_memory(int nid, u64 start, u64 size)
|
||||
{
|
||||
struct pglist_data *pgdata = &contig_page_data;
|
||||
struct zone *zone = pgdata->node_zones + MAX_NR_ZONES-1;
|
||||
|
||||
@@ -652,7 +652,7 @@ void online_page(struct page *page)
|
||||
num_physpages++;
|
||||
}
|
||||
|
||||
int add_memory(u64 start, u64 size)
|
||||
int arch_add_memory(int nid, u64 start, u64 size)
|
||||
{
|
||||
pg_data_t *pgdat;
|
||||
struct zone *zone;
|
||||
@@ -660,7 +660,7 @@ int add_memory(u64 start, u64 size)
|
||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||
int ret;
|
||||
|
||||
pgdat = NODE_DATA(0);
|
||||
pgdat = NODE_DATA(nid);
|
||||
|
||||
zone = pgdat->node_zones + ZONE_NORMAL;
|
||||
ret = __add_pages(zone, start_pfn, nr_pages);
|
||||
@@ -671,7 +671,6 @@ int add_memory(u64 start, u64 size)
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(add_memory);
|
||||
|
||||
int remove_memory(u64 start, u64 size)
|
||||
{
|
||||
|
||||
@@ -114,15 +114,20 @@ void online_page(struct page *page)
|
||||
num_physpages++;
|
||||
}
|
||||
|
||||
int __devinit add_memory(u64 start, u64 size)
|
||||
#ifdef CONFIG_NUMA
|
||||
int memory_add_physaddr_to_nid(u64 start)
|
||||
{
|
||||
return hot_add_scn_to_nid(start);
|
||||
}
|
||||
#endif
|
||||
|
||||
int __devinit arch_add_memory(int nid, u64 start, u64 size)
|
||||
{
|
||||
struct pglist_data *pgdata;
|
||||
struct zone *zone;
|
||||
int nid;
|
||||
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||
|
||||
nid = hot_add_scn_to_nid(start);
|
||||
pgdata = NODE_DATA(nid);
|
||||
|
||||
start = (unsigned long)__va(start);
|
||||
|
||||
@@ -506,8 +506,6 @@ void __init clear_kernel_mapping(unsigned long address, unsigned long size)
|
||||
/*
|
||||
* Memory hotplug specific functions
|
||||
*/
|
||||
#if defined(CONFIG_ACPI_HOTPLUG_MEMORY) || defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)
|
||||
|
||||
void online_page(struct page *page)
|
||||
{
|
||||
ClearPageReserved(page);
|
||||
@@ -517,7 +515,52 @@ void online_page(struct page *page)
|
||||
num_physpages++;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_MEMORY_HOTPLUG
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
/*
|
||||
* XXX: memory_add_physaddr_to_nid() is to find node id from physical address
|
||||
* via probe interface of sysfs. If acpi notifies hot-add event, then it
|
||||
* can tell node id by searching dsdt. But, probe interface doesn't have
|
||||
* node id. So, return 0 as node id at this time.
|
||||
*/
|
||||
#ifdef CONFIG_NUMA
|
||||
int memory_add_physaddr_to_nid(u64 start)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Memory is added always to NORMAL zone. This means you will never get
|
||||
* additional DMA/DMA32 memory.
|
||||
*/
|
||||
int arch_add_memory(int nid, u64 start, u64 size)
|
||||
{
|
||||
struct pglist_data *pgdat = NODE_DATA(nid);
|
||||
struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2;
|
||||
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||
int ret;
|
||||
|
||||
ret = __add_pages(zone, start_pfn, nr_pages);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
init_memory_mapping(start, (start + size -1));
|
||||
|
||||
return ret;
|
||||
error:
|
||||
printk("%s: Problem encountered in __add_pages!\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arch_add_memory);
|
||||
|
||||
int remove_memory(u64 start, u64 size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(remove_memory);
|
||||
|
||||
#else /* CONFIG_MEMORY_HOTPLUG */
|
||||
/*
|
||||
* Memory Hotadd without sparsemem. The mem_maps have been allocated in advance,
|
||||
* just online the pages.
|
||||
@@ -543,40 +586,7 @@ int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages)
|
||||
}
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Memory is added always to NORMAL zone. This means you will never get
|
||||
* additional DMA/DMA32 memory.
|
||||
*/
|
||||
int add_memory(u64 start, u64 size)
|
||||
{
|
||||
struct pglist_data *pgdat = NODE_DATA(0);
|
||||
struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2;
|
||||
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||
int ret;
|
||||
|
||||
ret = __add_pages(zone, start_pfn, nr_pages);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
init_memory_mapping(start, (start + size -1));
|
||||
|
||||
return ret;
|
||||
error:
|
||||
printk("%s: Problem encountered in __add_pages!\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(add_memory);
|
||||
|
||||
int remove_memory(u64 start, u64 size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(remove_memory);
|
||||
|
||||
#endif
|
||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||
|
||||
static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules,
|
||||
kcore_vsyscall;
|
||||
|
||||
Reference in New Issue
Block a user