diff options
Diffstat (limited to 'drivers/base/cpu.c')
| -rw-r--r-- | drivers/base/cpu.c | 39 | 
1 files changed, 25 insertions, 14 deletions
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 848ebbd25717..f48370dfc908 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c @@ -44,13 +44,11 @@ static int __ref cpu_subsys_online(struct device *dev)  	struct cpu *cpu = container_of(dev, struct cpu, dev);  	int cpuid = dev->id;  	int from_nid, to_nid; -	int ret = -ENODEV; - -	cpu_hotplug_driver_lock(); +	int ret;  	from_nid = cpu_to_node(cpuid);  	if (from_nid == NUMA_NO_NODE) -		goto out; +		return -ENODEV;  	ret = cpu_up(cpuid);  	/* @@ -61,19 +59,12 @@ static int __ref cpu_subsys_online(struct device *dev)  	if (from_nid != to_nid)  		change_cpu_under_node(cpu, from_nid, to_nid); - out: -	cpu_hotplug_driver_unlock();  	return ret;  }  static int cpu_subsys_offline(struct device *dev)  { -	int ret; - -	cpu_hotplug_driver_lock(); -	ret = cpu_down(dev->id); -	cpu_hotplug_driver_unlock(); -	return ret; +	return cpu_down(dev->id);  }  void unregister_cpu(struct cpu *cpu) @@ -93,7 +84,17 @@ static ssize_t cpu_probe_store(struct device *dev,  			       const char *buf,  			       size_t count)  { -	return arch_cpu_probe(buf, count); +	ssize_t cnt; +	int ret; + +	ret = lock_device_hotplug_sysfs(); +	if (ret) +		return ret; + +	cnt = arch_cpu_probe(buf, count); + +	unlock_device_hotplug(); +	return cnt;  }  static ssize_t cpu_release_store(struct device *dev, @@ -101,7 +102,17 @@ static ssize_t cpu_release_store(struct device *dev,  				 const char *buf,  				 size_t count)  { -	return arch_cpu_release(buf, count); +	ssize_t cnt; +	int ret; + +	ret = lock_device_hotplug_sysfs(); +	if (ret) +		return ret; + +	cnt = arch_cpu_release(buf, count); + +	unlock_device_hotplug(); +	return cnt;  }  static DEVICE_ATTR(probe, S_IWUSR, NULL, cpu_probe_store);  |