lkml.org 
[lkml]   [2011]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH] a patch to fix the cpu-offline-online problem caused by pm_idle
    From
    Hi there,

    I've seen many problems caused by deep-c-state-capable pm_idle on a
    NHM-EX system with this test script
    # for i in `seq 1 1000`; do echo $i; echo 0 >
    /sys/devices/system/cpu/cpu59/online ; sleep 1; echo 1 >
    /sys/devices/system/cpu/cpu59/online; done

    As the bug " CPU online/offline causes system slowdown"
    https://bugzilla.redhat.com/show_bug.cgi?id=586551 described.

    The simplest and easiest and cleanest way I can think of now is as the
    patch attached.

    Signed-off-by: Yu Luming <luming.yu@intel.com>

    diff --git a/kernel/cpu.c b/kernel/cpu.c
    index c75fcdd..d419eb3 100644
    --- a/kernel/cpu.c
    +++ b/kernel/cpu.c
    @@ -135,6 +135,7 @@ int __ref register_cpu_notifier(struct notifier_block *nb)

    #ifdef CONFIG_HOTPLUG_CPU

    +static void (*pm_idle_saved) (void) __read_mostly;
    EXPORT_SYMBOL(register_cpu_notifier);

    void __ref unregister_cpu_notifier(struct notifier_block *nb)
    @@ -145,6 +146,19 @@ void __ref unregister_cpu_notifier(struct
    notifier_block *nb)
    }
    EXPORT_SYMBOL(unregister_cpu_notifier);

    +static inline void save_pm_idle(void)
    +{
    + pm_idle_saved = pm_idle;
    + pm_idle = default_idle;
    + cpu_idle_wait();
    +}
    +
    +static inline void restore_pm_idle(void)
    +{
    + pm_idle = pm_idle_saved;
    + cpu_idle_wait();
    +}
    +
    static inline void check_for_tasks(int cpu)
    {
    struct task_struct *p;
    @@ -278,7 +292,9 @@ int __ref cpu_down(unsigned int cpu)
    goto out;
    }

    + save_pm_idle();
    err = _cpu_down(cpu, 0);
    + restore_pm_idle();

    out:
    cpu_maps_update_done();
    @@ -376,7 +392,9 @@ int __cpuinit cpu_up(unsigned int cpu)
    goto out;
    }

    + save_pm_idle();
    err = _cpu_up(cpu, 0);
    + restore_pm_idle();

    out:
    cpu_maps_update_done();[unhandled content-type:application/octet-stream]
    \
     
     \ /
      Last update: 2011-01-24 08:37    [W:4.348 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site