Use get_online_cpus to avoid races involving CPU hotplug
PATCH v2 3/4 Use get_online_cpus to avoid races involving CPU hotplug
via_cputemp_init in drivers/hwmon/via-cputemp.c loops with for_each_online_cpu, adding platform_devices, then calls register_hotcpu_notifier. If a CPU is offlined between the loop and register_hotcpu_notifier, then later onlined, via_cputemp_device_add will attempt to add platform devices with the same ID. A similar race occurs during via_cputemp_exit, after the module calls unregister_hotcpu_notifier, a CPU might offline and a device will exist for a CPU that is offline.
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/via-cputemp.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/hwmon/via-cputemp.c +5 -0
@@ -328,6 +328,7 @@ static int __init via_cputemp_init(void)if (err) goto exit; +get_online_cpus ();for_each_online_cpu (i) {struct cpuinfo_x86 *c = &cpu_data (i);
@@ -347,12 +348,14 @@ static int __init via_cputemp_init(void)#ifndef CONFIG_HOTPLUG_CPU if (list_empty (&pdev_list)) { +put_online_cpus (); err = -ENODEV ; goto exit_driver_unreg; }#endif register_hotcpu_notifier (&via_cputemp_cpu_notifier); +put_online_cpus ();return 0 ;#ifndef CONFIG_HOTPLUG_CPU
@@ -367,6 +370,7 @@ static void __exit via_cputemp_exit(void) {struct pdev_entry *p, *n; +get_online_cpus ();unregister_hotcpu_notifier (&via_cputemp_cpu_notifier);mutex_lock (&pdev_list_mutex);list_for_each_entry_safe (p, n, &pdev_list, list) {
@@ -375,6 +379,7 @@ static void __exit via_cputemp_exit(void)kfree (p); }mutex_unlock (&pdev_list_mutex); +put_online_cpus ();platform_driver_unregister (&via_cputemp_driver); }
Signature · 1 line
1.7.10.4
Jean Delvare
AppliedQuoted 14 lines · Silas Boyd-Wickizer
via_cputemp_initindrivers/hwmon/via-cputemp.cloops withfor_each_online_cpu, addingplatform_devices, then callsregister_hotcpu_notifier. If a CPU is offlined between the loop andregister_hotcpu_notifier, then later onlined,via_cputemp_device_addwill attempt to add platform devices with the same ID. A similar race occurs duringvia_cputemp_exit, after the module callsunregister_hotcpu_notifier, a CPU might offline and a device will exist for a CPU that is offline.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/via-cputemp.c | 5 +++++ 1 file changed, 5 insertions(+)(...)
Applied, thanks.
Signature · 1 line
Jean Delvare