On Thu, Feb 03, 2011 at 05:25:14PM +0100, Daniel Kiper wrote: > 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 8122018..fe63912 100644 > --- a/include/linux/memory_hotplug.h > +++ b/include/linux/memory_hotplug.h > @@ -223,6 +223,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 321fc74..7947bdf 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -532,20 +532,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_memory_hotplug(); > - > - res = register_memory_resource(start, size); > - ret = -EEXIST; > - if (!res) > - goto out; > - > if (!node_online(nid)) { > pgdat = hotadd_new_pgdat(nid, start); > ret = -ENOMEM; > @@ -579,14 +571,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_memory_hotplug(); > + ret = __add_memory(nid, start, size); > + unlock_memory_hotplug(); Isn't this a duplicate call to the mutex? The __add_memory does an unlock_memory_hotplug when it finishes and then you do another unlock_memory_hotplug here too. > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(add_registered_memory); > + > +int add_memory(int nid, u64 start, u64 size) > +{ > + int ret = -EEXIST; > + struct resource *res; > + > + lock_memory_hotplug(); > + > + res = register_memory_resource(start, size); > + > + if (!res) > + goto out; > + > + ret = __add_memory(nid, start, size); Ditto here. When __add_memory finishes the unlock_memory_hotplug has been called, but you end up doing it in the out: label too? > + > + if (!ret) > + goto out; > + > + release_memory_resource(res); > > out: > unlock_memory_hotplug(); > + > return ret; > } > EXPORT_SYMBOL_GPL(add_memory); > -- > 1.5.6.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>