|
@@ -506,8 +506,6 @@ void __init clear_kernel_mapping(unsigned long address, unsigned long size)
|
|
/*
|
|
/*
|
|
* Memory hotplug specific functions
|
|
* Memory hotplug specific functions
|
|
*/
|
|
*/
|
|
-#if defined(CONFIG_ACPI_HOTPLUG_MEMORY) || defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)
|
|
|
|
-
|
|
|
|
void online_page(struct page *page)
|
|
void online_page(struct page *page)
|
|
{
|
|
{
|
|
ClearPageReserved(page);
|
|
ClearPageReserved(page);
|
|
@@ -517,31 +515,17 @@ void online_page(struct page *page)
|
|
num_physpages++;
|
|
num_physpages++;
|
|
}
|
|
}
|
|
|
|
|
|
-#ifndef CONFIG_MEMORY_HOTPLUG
|
|
|
|
|
|
+#ifdef CONFIG_MEMORY_HOTPLUG
|
|
/*
|
|
/*
|
|
- * Memory Hotadd without sparsemem. The mem_maps have been allocated in advance,
|
|
|
|
- * just online the pages.
|
|
|
|
|
|
+ * 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.
|
|
*/
|
|
*/
|
|
-int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages)
|
|
|
|
|
|
+#ifdef CONFIG_NUMA
|
|
|
|
+int memory_add_physaddr_to_nid(u64 start)
|
|
{
|
|
{
|
|
- int err = -EIO;
|
|
|
|
- unsigned long pfn;
|
|
|
|
- unsigned long total = 0, mem = 0;
|
|
|
|
- for (pfn = start_pfn; pfn < start_pfn + nr_pages; pfn++) {
|
|
|
|
- if (pfn_valid(pfn)) {
|
|
|
|
- online_page(pfn_to_page(pfn));
|
|
|
|
- err = 0;
|
|
|
|
- mem++;
|
|
|
|
- }
|
|
|
|
- total++;
|
|
|
|
- }
|
|
|
|
- if (!err) {
|
|
|
|
- z->spanned_pages += total;
|
|
|
|
- z->present_pages += mem;
|
|
|
|
- z->zone_pgdat->node_spanned_pages += total;
|
|
|
|
- z->zone_pgdat->node_present_pages += mem;
|
|
|
|
- }
|
|
|
|
- return err;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -549,9 +533,9 @@ int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages)
|
|
* Memory is added always to NORMAL zone. This means you will never get
|
|
* Memory is added always to NORMAL zone. This means you will never get
|
|
* additional DMA/DMA32 memory.
|
|
* additional DMA/DMA32 memory.
|
|
*/
|
|
*/
|
|
-int add_memory(u64 start, u64 size)
|
|
|
|
|
|
+int arch_add_memory(int nid, u64 start, u64 size)
|
|
{
|
|
{
|
|
- struct pglist_data *pgdat = NODE_DATA(0);
|
|
|
|
|
|
+ struct pglist_data *pgdat = NODE_DATA(nid);
|
|
struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2;
|
|
struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2;
|
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
|
@@ -568,7 +552,7 @@ error:
|
|
printk("%s: Problem encountered in __add_pages!\n", __func__);
|
|
printk("%s: Problem encountered in __add_pages!\n", __func__);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(add_memory);
|
|
|
|
|
|
+EXPORT_SYMBOL_GPL(arch_add_memory);
|
|
|
|
|
|
int remove_memory(u64 start, u64 size)
|
|
int remove_memory(u64 start, u64 size)
|
|
{
|
|
{
|
|
@@ -576,7 +560,33 @@ int remove_memory(u64 start, u64 size)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(remove_memory);
|
|
EXPORT_SYMBOL_GPL(remove_memory);
|
|
|
|
|
|
-#endif
|
|
|
|
|
|
+#else /* CONFIG_MEMORY_HOTPLUG */
|
|
|
|
+/*
|
|
|
|
+ * Memory Hotadd without sparsemem. The mem_maps have been allocated in advance,
|
|
|
|
+ * just online the pages.
|
|
|
|
+ */
|
|
|
|
+int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages)
|
|
|
|
+{
|
|
|
|
+ int err = -EIO;
|
|
|
|
+ unsigned long pfn;
|
|
|
|
+ unsigned long total = 0, mem = 0;
|
|
|
|
+ for (pfn = start_pfn; pfn < start_pfn + nr_pages; pfn++) {
|
|
|
|
+ if (pfn_valid(pfn)) {
|
|
|
|
+ online_page(pfn_to_page(pfn));
|
|
|
|
+ err = 0;
|
|
|
|
+ mem++;
|
|
|
|
+ }
|
|
|
|
+ total++;
|
|
|
|
+ }
|
|
|
|
+ if (!err) {
|
|
|
|
+ z->spanned_pages += total;
|
|
|
|
+ z->present_pages += mem;
|
|
|
|
+ z->zone_pgdat->node_spanned_pages += total;
|
|
|
|
+ z->zone_pgdat->node_present_pages += mem;
|
|
|
|
+ }
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+#endif /* CONFIG_MEMORY_HOTPLUG */
|
|
|
|
|
|
static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules,
|
|
static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules,
|
|
kcore_vsyscall;
|
|
kcore_vsyscall;
|