diff options
Diffstat (limited to 'drivers/base/memory.c')
| -rw-r--r-- | drivers/base/memory.c | 22 | 
1 files changed, 8 insertions, 14 deletions
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 817320c7c4c1..0e5985682642 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -228,7 +228,6 @@ static bool pages_correctly_probed(unsigned long start_pfn)  /*   * MEMORY_HOTPLUG depends on SPARSEMEM in mm/Kconfig, so it is   * OK to have direct references to sparsemem variables in here. - * Must already be protected by mem_hotplug_begin().   */  static int  memory_block_action(unsigned long phys_index, unsigned long action, int online_type) @@ -294,7 +293,6 @@ static int memory_subsys_online(struct device *dev)  	if (mem->online_type < 0)  		mem->online_type = MMOP_ONLINE_KEEP; -	/* Already under protection of mem_hotplug_begin() */  	ret = memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE);  	/* clear online_type */ @@ -341,19 +339,11 @@ store_mem_state(struct device *dev,  		goto err;  	} -	/* -	 * Memory hotplug needs to hold mem_hotplug_begin() for probe to find -	 * the correct memory block to online before doing device_online(dev), -	 * which will take dev->mutex.  Take the lock early to prevent an -	 * inversion, memory_subsys_online() callbacks will be implemented by -	 * assuming it's already protected. -	 */ -	mem_hotplug_begin(); -  	switch (online_type) {  	case MMOP_ONLINE_KERNEL:  	case MMOP_ONLINE_MOVABLE:  	case MMOP_ONLINE_KEEP: +		/* mem->online_type is protected by device_hotplug_lock */  		mem->online_type = online_type;  		ret = device_online(&mem->dev);  		break; @@ -364,7 +354,6 @@ store_mem_state(struct device *dev,  		ret = -EINVAL; /* should never happen */  	} -	mem_hotplug_done();  err:  	unlock_device_hotplug(); @@ -519,15 +508,20 @@ memory_probe_store(struct device *dev, struct device_attribute *attr,  	if (phys_addr & ((pages_per_block << PAGE_SHIFT) - 1))  		return -EINVAL; +	ret = lock_device_hotplug_sysfs(); +	if (ret) +		goto out; +  	nid = memory_add_physaddr_to_nid(phys_addr); -	ret = add_memory(nid, phys_addr, -			 MIN_MEMORY_BLOCK_SIZE * sections_per_block); +	ret = __add_memory(nid, phys_addr, +			   MIN_MEMORY_BLOCK_SIZE * sections_per_block);  	if (ret)  		goto out;  	ret = count;  out: +	unlock_device_hotplug();  	return ret;  }  | 
