[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH R2 1/7] mm: Add add_registered_memory() to memory hotplug API



add_registered_memory() adds memory ealier registered
as memory resource. It is required by memory hotplug
for Xen guests, however it could be used also by other
modules.

Signed-off-by: Daniel Kiper <dkiper@xxxxxxxxxxxx>
---
 include/linux/memory_hotplug.h |    1 +
 mm/memory_hotplug.c            |   50 ++++++++++++++++++++++++++++++---------
 2 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
index 864035f..2458b2f 100644
--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -203,6 +203,7 @@ static inline int is_mem_section_removable(unsigned long 
pfn,
 #endif /* CONFIG_MEMORY_HOTREMOVE */
 
 extern int mem_online_node(int nid);
+extern int add_registered_memory(int nid, u64 start, u64 size);
 extern int add_memory(int nid, u64 start, u64 size);
 extern int arch_add_memory(int nid, u64 start, u64 size);
 extern int remove_memory(u64 start, u64 size);
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index dd186c1..b642f26 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -509,20 +509,12 @@ out:
 }
 
 /* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */
-int __ref add_memory(int nid, u64 start, u64 size)
+static int __ref __add_memory(int nid, u64 start, u64 size)
 {
        pg_data_t *pgdat = NULL;
        int new_pgdat = 0;
-       struct resource *res;
        int ret;
 
-       lock_system_sleep();
-
-       res = register_memory_resource(start, size);
-       ret = -EEXIST;
-       if (!res)
-               goto out;
-
        if (!node_online(nid)) {
                pgdat = hotadd_new_pgdat(nid, start);
                ret = -ENOMEM;
@@ -556,14 +548,48 @@ int __ref add_memory(int nid, u64 start, u64 size)
        goto out;
 
 error:
-       /* rollback pgdat allocation and others */
+       /* rollback pgdat allocation */
        if (new_pgdat)
                rollback_node_hotadd(nid, pgdat);
-       if (res)
-               release_memory_resource(res);
+
+out:
+       return ret;
+}
+
+int add_registered_memory(int nid, u64 start, u64 size)
+{
+       int ret;
+
+       lock_system_sleep();
+       ret = __add_memory(nid, start, size);
+       unlock_system_sleep();
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(add_registered_memory);
+
+int add_memory(int nid, u64 start, u64 size)
+{
+       int ret = -EEXIST;
+       struct resource *res;
+
+       lock_system_sleep();
+
+       res = register_memory_resource(start, size);
+
+       if (!res)
+               goto out;
+
+       ret = __add_memory(nid, start, size);
+
+       if (!ret)
+               goto out;
+
+       release_memory_resource(res);
 
 out:
        unlock_system_sleep();
+
        return ret;
 }
 EXPORT_SYMBOL_GPL(add_memory);
-- 
1.4.4.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.