hotplug / x86: Add hotplug lock to missing places

lock_device_hotplug[_sysfs]() serializes CPU & Memory online/offline
and hotplug operations.  However, this lock is not held in the debug
interfaces below that initiate CPU online/offline operations.

 - _debug_hotplug_cpu(), cpu0 hotplug test interface enabled by
   CONFIG_DEBUG_HOTPLUG_CPU0.
 - cpu_probe_store() and cpu_release_store(), cpu hotplug test interface
   enabled by CONFIG_ARCH_CPU_PROBE_RELEASE.

This patch changes the above interfaces to hold lock_device_hotplug().

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Toshi Kani 2013-08-29 18:22:07 -06:00 committed by Rafael J. Wysocki
parent f6913f9902
commit 574b851e99
2 changed files with 24 additions and 2 deletions

View File

@ -65,6 +65,7 @@ int __ref _debug_hotplug_cpu(int cpu, int action)
if (!cpu_is_hotpluggable(cpu))
return -EINVAL;
lock_device_hotplug();
cpu_hotplug_driver_lock();
switch (action) {
@ -91,6 +92,7 @@ int __ref _debug_hotplug_cpu(int cpu, int action)
}
cpu_hotplug_driver_unlock();
unlock_device_hotplug();
return ret;
}

View File

@ -93,7 +93,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 +111,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);