Use get_online_cpus to avoid races involving CPU hotplug
Subsystems (2)
PATCH v2 4/4 Use get_online_cpus to avoid races involving CPU hotplug
coretemp_init in drivers/hwmon/coretemp.c loops with for_each_online_cpu, adding platform_devices and sysfs interfaces, then calls register_hotcpu_notifier. There is a race if a CPU is offlined or onlined after the loop, but before register_hotcpu_notifier. The race might result in the absence of a platform_device+sysfs interface for an online CPU, or the presence of a platform_device+sysfs interface for an offline CPU. A similar race occurs during coretemp_exit, after the module calls unregister_hotcpu_notifier, but before it unregisters all devices, a CPU might offline and a device for an offline CPU will exist for a short while.
This fix surrounds for_each_online_cpu and register_hotcpu_notifier with get_online_cpus+put_online_cpus; and surrounds unregister_hotcpu_notifier and device unregistering with get_online_cpus+put_online_cpus.
Build tested.
--- drivers/hwmon/coretemp.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/hwmon/coretemp.c +5 -0
@@ -815,17 +815,20 @@ static int __init coretemp_init(void)if (err) goto exit; +get_online_cpus ();for_each_online_cpu (i)get_core_online (i);#ifndef CONFIG_HOTPLUG_CPU if (list_empty (&pdev_list)) { +put_online_cpus (); err = -ENODEV ; goto exit_driver_unreg; }#endif register_hotcpu_notifier (&coretemp_cpu_notifier); +put_online_cpus ();return 0 ;#ifndef CONFIG_HOTPLUG_CPU
@@ -840,6 +843,7 @@ static void __exit coretemp_exit(void) {struct pdev_entry *p, *n; +get_online_cpus ();unregister_hotcpu_notifier (&coretemp_cpu_notifier);mutex_lock (&pdev_list_mutex);list_for_each_entry_safe (p, n, &pdev_list, list) {
@@ -848,6 +852,7 @@ static void __exit coretemp_exit(void)kfree (p); }mutex_unlock (&pdev_list_mutex); +put_online_cpus ();platform_driver_unregister (&coretemp_driver); }
Signature · 1 line
1.7.10.4
Jean Delvare
AppliedQuoted 17 lines · Silas Boyd-Wickizer
coretemp_initindrivers/hwmon/coretemp.cloops withfor_each_online_cpu, addingplatform_devicesand sysfs interfaces, then callsregister_hotcpu_notifier. There is a race if a CPU is offlined or onlined after the loop, but beforeregister_hotcpu_notifier. The race might result in the absence of a platform_device+sysfs interface for an online CPU, or the presence of a platform_device+sysfs interface for an offline CPU. A similar race occurs duringcoretemp_exit, after the module callsunregister_hotcpu_notifier, but before it unregisters all devices, a CPU might offline and a device for an offline CPU will exist for a short while.This fix surrounds
for_each_online_cpuandregister_hotcpu_notifierwith get_online_cpus+put_online_cpus; and surroundsunregister_hotcpu_notifierand device unregistering with get_online_cpus+put_online_cpus.
Quoted 7 lines
Build tested.
Signed-off-by Silas Boyd-Wickizer <[email protected]>--- drivers/hwmon/coretemp.c | 5 +++++ 1 file changed, 5 insertions(+)(...)
Applied, thanks.
Signature · 1 line
Jean Delvare