diff options
author | Yasunori Goto <y-goto@jp.fujitsu.com> | 2006-06-27 05:53:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-27 20:32:35 -0400 |
commit | bc02af93dd2bbddce1b55e0a493f833a1b7cf140 (patch) | |
tree | bda7998531b9c612c5597be9158f082d1cb5ab26 /arch/x86_64/mm/init.c | |
parent | dd56a8e36f91f63c0a31e8a118d87b7cf01526b8 (diff) |
[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>
Diffstat (limited to 'arch/x86_64/mm/init.c')
-rw-r--r-- | arch/x86_64/mm/init.c | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 02add1d1dfa8..51fbf3eddf13 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -506,8 +506,6 @@ void __init clear_kernel_mapping(unsigned long address, unsigned long size) | |||
506 | /* | 506 | /* |
507 | * Memory hotplug specific functions | 507 | * Memory hotplug specific functions |
508 | */ | 508 | */ |
509 | #if defined(CONFIG_ACPI_HOTPLUG_MEMORY) || defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE) | ||
510 | |||
511 | void online_page(struct page *page) | 509 | void online_page(struct page *page) |
512 | { | 510 | { |
513 | ClearPageReserved(page); | 511 | ClearPageReserved(page); |
@@ -517,31 +515,17 @@ void online_page(struct page *page) | |||
517 | num_physpages++; | 515 | num_physpages++; |
518 | } | 516 | } |
519 | 517 | ||
520 | #ifndef CONFIG_MEMORY_HOTPLUG | 518 | #ifdef CONFIG_MEMORY_HOTPLUG |
521 | /* | 519 | /* |
522 | * Memory Hotadd without sparsemem. The mem_maps have been allocated in advance, | 520 | * XXX: memory_add_physaddr_to_nid() is to find node id from physical address |
523 | * just online the pages. | 521 | * via probe interface of sysfs. If acpi notifies hot-add event, then it |
522 | * can tell node id by searching dsdt. But, probe interface doesn't have | ||
523 | * node id. So, return 0 as node id at this time. | ||
524 | */ | 524 | */ |
525 | int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages) | 525 | #ifdef CONFIG_NUMA |
526 | int memory_add_physaddr_to_nid(u64 start) | ||
526 | { | 527 | { |
527 | int err = -EIO; | 528 | return 0; |
528 | unsigned long pfn; | ||
529 | unsigned long total = 0, mem = 0; | ||
530 | for (pfn = start_pfn; pfn < start_pfn + nr_pages; pfn++) { | ||
531 | if (pfn_valid(pfn)) { | ||
532 | online_page(pfn_to_page(pfn)); | ||
533 | err = 0; | ||
534 | mem++; | ||
535 | } | ||
536 | total++; | ||
537 | } | ||
538 | if (!err) { | ||
539 | z->spanned_pages += total; | ||
540 | z->present_pages += mem; | ||
541 | z->zone_pgdat->node_spanned_pages += total; | ||
542 | z->zone_pgdat->node_present_pages += mem; | ||
543 | } | ||
544 | return err; | ||
545 | } | 529 | } |
546 | #endif | 530 | #endif |
547 | 531 | ||
@@ -549,9 +533,9 @@ int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages) | |||
549 | * Memory is added always to NORMAL zone. This means you will never get | 533 | * Memory is added always to NORMAL zone. This means you will never get |
550 | * additional DMA/DMA32 memory. | 534 | * additional DMA/DMA32 memory. |
551 | */ | 535 | */ |
552 | int add_memory(u64 start, u64 size) | 536 | int arch_add_memory(int nid, u64 start, u64 size) |
553 | { | 537 | { |
554 | struct pglist_data *pgdat = NODE_DATA(0); | 538 | struct pglist_data *pgdat = NODE_DATA(nid); |
555 | struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2; | 539 | struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2; |
556 | unsigned long start_pfn = start >> PAGE_SHIFT; | 540 | unsigned long start_pfn = start >> PAGE_SHIFT; |
557 | unsigned long nr_pages = size >> PAGE_SHIFT; | 541 | unsigned long nr_pages = size >> PAGE_SHIFT; |
@@ -568,7 +552,7 @@ error: | |||
568 | printk("%s: Problem encountered in __add_pages!\n", __func__); | 552 | printk("%s: Problem encountered in __add_pages!\n", __func__); |
569 | return ret; | 553 | return ret; |
570 | } | 554 | } |
571 | EXPORT_SYMBOL_GPL(add_memory); | 555 | EXPORT_SYMBOL_GPL(arch_add_memory); |
572 | 556 | ||
573 | int remove_memory(u64 start, u64 size) | 557 | int remove_memory(u64 start, u64 size) |
574 | { | 558 | { |
@@ -576,7 +560,33 @@ int remove_memory(u64 start, u64 size) | |||
576 | } | 560 | } |
577 | EXPORT_SYMBOL_GPL(remove_memory); | 561 | EXPORT_SYMBOL_GPL(remove_memory); |
578 | 562 | ||
579 | #endif | 563 | #else /* CONFIG_MEMORY_HOTPLUG */ |
564 | /* | ||
565 | * Memory Hotadd without sparsemem. The mem_maps have been allocated in advance, | ||
566 | * just online the pages. | ||
567 | */ | ||
568 | int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages) | ||
569 | { | ||
570 | int err = -EIO; | ||
571 | unsigned long pfn; | ||
572 | unsigned long total = 0, mem = 0; | ||
573 | for (pfn = start_pfn; pfn < start_pfn + nr_pages; pfn++) { | ||
574 | if (pfn_valid(pfn)) { | ||
575 | online_page(pfn_to_page(pfn)); | ||
576 | err = 0; | ||
577 | mem++; | ||
578 | } | ||
579 | total++; | ||
580 | } | ||
581 | if (!err) { | ||
582 | z->spanned_pages += total; | ||
583 | z->present_pages += mem; | ||
584 | z->zone_pgdat->node_spanned_pages += total; | ||
585 | z->zone_pgdat->node_present_pages += mem; | ||
586 | } | ||
587 | return err; | ||
588 | } | ||
589 | #endif /* CONFIG_MEMORY_HOTPLUG */ | ||
580 | 590 | ||
581 | static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules, | 591 | static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules, |
582 | kcore_vsyscall; | 592 | kcore_vsyscall; |