|
@@ -761,7 +761,7 @@ void __init paging_init(void)
|
|
* After memory hotplug the variables max_pfn, max_low_pfn and high_memory need
|
|
* After memory hotplug the variables max_pfn, max_low_pfn and high_memory need
|
|
* updating.
|
|
* updating.
|
|
*/
|
|
*/
|
|
-static void update_end_of_memory_vars(u64 start, u64 size)
|
|
|
|
|
|
+static void update_end_of_memory_vars(u64 start, u64 size)
|
|
{
|
|
{
|
|
unsigned long end_pfn = PFN_UP(start + size);
|
|
unsigned long end_pfn = PFN_UP(start + size);
|
|
|
|
|
|
@@ -772,22 +772,30 @@ static void update_end_of_memory_vars(u64 start, u64 size)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-int arch_add_memory(int nid, u64 start, u64 size, bool want_memblock)
|
|
|
|
|
|
+int add_pages(int nid, unsigned long start_pfn,
|
|
|
|
+ unsigned long nr_pages, bool want_memblock)
|
|
{
|
|
{
|
|
- unsigned long start_pfn = start >> PAGE_SHIFT;
|
|
|
|
- unsigned long nr_pages = size >> PAGE_SHIFT;
|
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- init_memory_mapping(start, start + size);
|
|
|
|
-
|
|
|
|
ret = __add_pages(nid, start_pfn, nr_pages, want_memblock);
|
|
ret = __add_pages(nid, start_pfn, nr_pages, want_memblock);
|
|
WARN_ON_ONCE(ret);
|
|
WARN_ON_ONCE(ret);
|
|
|
|
|
|
/* update max_pfn, max_low_pfn and high_memory */
|
|
/* update max_pfn, max_low_pfn and high_memory */
|
|
- update_end_of_memory_vars(start, size);
|
|
|
|
|
|
+ update_end_of_memory_vars(start_pfn << PAGE_SHIFT,
|
|
|
|
+ nr_pages << PAGE_SHIFT);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+int arch_add_memory(int nid, u64 start, u64 size, bool want_memblock)
|
|
|
|
+{
|
|
|
|
+ unsigned long start_pfn = start >> PAGE_SHIFT;
|
|
|
|
+ unsigned long nr_pages = size >> PAGE_SHIFT;
|
|
|
|
+
|
|
|
|
+ init_memory_mapping(start, start + size);
|
|
|
|
+
|
|
|
|
+ return add_pages(nid, start_pfn, nr_pages, want_memblock);
|
|
|
|
+}
|
|
EXPORT_SYMBOL_GPL(arch_add_memory);
|
|
EXPORT_SYMBOL_GPL(arch_add_memory);
|
|
|
|
|
|
#define PAGE_INUSE 0xFD
|
|
#define PAGE_INUSE 0xFD
|