aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcutree.c
diff options
context:
space:
mode:
authorSilas Boyd-Wickizer <sbw@mit.edu>2012-08-03 12:34:50 -0700
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2012-09-23 07:43:56 -0700
commit429227bbe55647aa42f8f63cac61e4544e248629 (patch)
tree345535746085ed30bfea14e38e23c61a540ddbbd /kernel/rcutree.c
parenta2db672aa305a045404615e5222ba681bab6cf58 (diff)
downloadkernel_goldelico_gta04-429227bbe55647aa42f8f63cac61e4544e248629.zip
kernel_goldelico_gta04-429227bbe55647aa42f8f63cac61e4544e248629.tar.gz
kernel_goldelico_gta04-429227bbe55647aa42f8f63cac61e4544e248629.tar.bz2
Use get_online_cpus to avoid races involving CPU hotplug
If arch/x86/kernel/cpuid.c is a module, a CPU might offline or online between the for_each_online_cpu() loop and the call to register_hotcpu_notifier in cpuid_init or the call to unregister_hotcpu_notifier in cpuid_exit. The potential races can lead to leaks/duplicates, attempts to destroy non-existant devices, or random pointer dereferences. For example, in cpuid_exit if: for_each_online_cpu(cpu) cpuid_device_destroy(cpu); class_destroy(cpuid_class); __unregister_chrdev(CPUID_MAJOR, 0, NR_CPUS, "cpu/cpuid"); <----- CPU onlines unregister_hotcpu_notifier(&cpuid_class_cpu_notifier); the hotcpu notifier will attempt to create a device for the cpuid_class, which the module already destroyed. This fix surrounds for_each_online_cpu and register_hotcpu_notifier or unregister_hotcpu_notifier with get_online_cpus+put_online_cpus. Tested on a VM. Signed-off-by: Silas Boyd-Wickizer <sbw@mit.edu> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/rcutree.c')
0 files changed, 0 insertions, 0 deletions