• Silas Boyd-Wickizer's avatar
    Use get_online_cpus to avoid races involving CPU hotplug · a2db672a
    Silas Boyd-Wickizer authored
    If arch/x86/kernel/msr.c is a module, a CPU might offline or online
    between the for_each_online_cpu(i) loop and the call to
    register_hotcpu_notifier in msr_init or the call to
    unregister_hotcpu_notifier in msr_exit. The potential races can lead
    to leaks/duplicates, attempts to destroy non-existant devices, or
    random pointer dereferences.
    
    For example, in msr_init if:
    
            for_each_online_cpu(i) {
                    err = msr_device_create(i);
                    if (err != 0)
                            goto out_class;
            }
            <----- CPU offlines
            register_hotcpu_notifier(&msr_class_cpu_notifier);
    
    and the CPU never onlines before msr_exit, then the module will never
    call msr_device_destroy for the associated CPU.
    
    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: default avatarSilas Boyd-Wickizer <sbw@mit.edu>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    a2db672a
msr.c 6.44 KB