• Dmitry Adamushko's avatar
    sched, cpu hotplug: fix set_cpus_allowed() use in hotplug callbacks · 279ef6bb
    Dmitry Adamushko authored
    Mark Langsdorf reported:
    
    > One of my co-workers noticed that the powernow-k8
    > driver no longer restarts when a CPU core is
    > hot-disabled and then hot-enabled on AMD quad-core
    > systems.
    >
    > The following comands work fine on 2.6.26 and fail
    > on 2.6.27-rc1:
    >
    > echo 0 > /sys/devices/system/cpu/cpu3/online
    > echo 1 > /sys/devices/system/cpu/cpu3/online
    > find /sys -name cpufreq
    >
    > For 2.6.26, the find will return a cpufreq
    > directory for each processor.  In 2.6.27-rc1,
    > the cpu3 directory is missing.
    >
    > After digging through the code, the following
    > logic is failing when the core is hot-enabled
    > at runtime.  The code works during the boot
    > sequence.
    >
    >       cpumask_t = current->cpus_allowed;
    >       set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu));
    >       if (smp_processor_id() != cpu)
    >               return -ENODEV;
    
    So set the CPU active before calling the CPU_ONLINE notifier chain,
    there are a handful of notifiers that use set_cpus_allowed().
    
    This fix also solves the problem with x86-microcode. I've sent
    alternative patches for microcode, but as this "rely on
    set_cpus_allowed_ptr() being workable in cpu-hotplug(CPU_ONLINE, ...)"
    assumption seems to be more broad than what we thought, perhaps this fix
    should be applied.
    
    With this patch we define that by the moment CPU_ONLINE is being sent,
    a 'cpu' is online and ready for tasks to be migrated onto it.
    Signed-off-by: default avatarDmitry Adamushko <dmitry.adamushko@gmail.com>
    Reported-by: default avatarMark Langsdorf <mark.langsdorf@amd.com>
    Tested-by: default avatarMark Langsdorf <mark.langsdorf@amd.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    279ef6bb
cpu.c 11.4 KB