diff options
Diffstat (limited to 'mm/memory_hotplug.c')
| -rw-r--r-- | mm/memory_hotplug.c | 31 | 
1 files changed, 24 insertions, 7 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 9260314a221e..2c6523af5473 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -34,6 +34,23 @@  #include "internal.h" +DEFINE_MUTEX(mem_hotplug_mutex); + +void lock_memory_hotplug(void) +{ +	mutex_lock(&mem_hotplug_mutex); + +	/* for exclusive hibernation if CONFIG_HIBERNATION=y */ +	lock_system_sleep(); +} + +void unlock_memory_hotplug(void) +{ +	unlock_system_sleep(); +	mutex_unlock(&mem_hotplug_mutex); +} + +  /* add this memory to iomem resource */  static struct resource *register_memory_resource(u64 start, u64 size)  { @@ -493,7 +510,7 @@ int mem_online_node(int nid)  	pg_data_t	*pgdat;  	int	ret; -	lock_system_sleep(); +	lock_memory_hotplug();  	pgdat = hotadd_new_pgdat(nid, 0);  	if (pgdat) {  		ret = -ENOMEM; @@ -504,7 +521,7 @@ int mem_online_node(int nid)  	BUG_ON(ret);  out: -	unlock_system_sleep(); +	unlock_memory_hotplug();  	return ret;  } @@ -516,7 +533,7 @@ int __ref add_memory(int nid, u64 start, u64 size)  	struct resource *res;  	int ret; -	lock_system_sleep(); +	lock_memory_hotplug();  	res = register_memory_resource(start, size);  	ret = -EEXIST; @@ -563,7 +580,7 @@ error:  		release_memory_resource(res);  out: -	unlock_system_sleep(); +	unlock_memory_hotplug();  	return ret;  }  EXPORT_SYMBOL_GPL(add_memory); @@ -791,7 +808,7 @@ static int offline_pages(unsigned long start_pfn,  	if (!test_pages_in_a_zone(start_pfn, end_pfn))  		return -EINVAL; -	lock_system_sleep(); +	lock_memory_hotplug();  	zone = page_zone(pfn_to_page(start_pfn));  	node = zone_to_nid(zone); @@ -880,7 +897,7 @@ repeat:  	writeback_set_ratelimit();  	memory_notify(MEM_OFFLINE, &arg); -	unlock_system_sleep(); +	unlock_memory_hotplug();  	return 0;  failed_removal: @@ -891,7 +908,7 @@ failed_removal:  	undo_isolate_page_range(start_pfn, end_pfn);  out: -	unlock_system_sleep(); +	unlock_memory_hotplug();  	return ret;  }  | 
