lkml.org 
[lkml]   [2008]   [Aug]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] nohz: fix wrong event handler after online an offlined cpu
    On the tickless system(CONFIG_NO_HZ=y and CONFIG_HIGH_RES_TIMERS=n), after I
    made an offlined cpu online, I found this cpu's event handler was
    tick_handle_periodic, not tick_nohz_handler.

    After debuging, I found this bug was caused by the wrong tick mode.
    the tick mode is not changed to NOHZ_MODE_INACTIVE when the cpu is offline.

    This patch fixes this bug.

    Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>

    ---
    include/linux/tick.h | 5 ++++-
    kernel/time/tick-sched.c | 6 +++++-
    2 files changed, 9 insertions(+), 2 deletions(-)

    diff --git a/include/linux/tick.h b/include/linux/tick.h
    index d3c0269..8cf8cfe 100644
    --- a/include/linux/tick.h
    +++ b/include/linux/tick.h
    @@ -74,10 +74,13 @@ extern struct tick_device *tick_get_device(int cpu);
    extern int tick_init_highres(void);
    extern int tick_program_event(ktime_t expires, int force);
    extern void tick_setup_sched_timer(void);
    +# endif
    +
    +# if defined CONFIG_NO_HZ || defined CONFIG_HIGH_RES_TIMERS
    extern void tick_cancel_sched_timer(int cpu);
    # else
    static inline void tick_cancel_sched_timer(int cpu) { }
    -# endif /* HIGHRES */
    +# endif

    # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
    extern struct tick_device *tick_get_broadcast_device(void);
    diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
    index 825b4c0..661a392 100644
    --- a/kernel/time/tick-sched.c
    +++ b/kernel/time/tick-sched.c
    @@ -645,17 +645,21 @@ void tick_setup_sched_timer(void)
    ts->nohz_mode = NOHZ_MODE_HIGHRES;
    #endif
    }
    +#endif /* HIGH_RES_TIMERS */

    +#if defined CONFIG_NO_HZ || defined CONFIG_HIGH_RES_TIMERS
    void tick_cancel_sched_timer(int cpu)
    {
    struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);

    +# ifdef CONFIG_HIGH_RES_TIMERS
    if (ts->sched_timer.base)
    hrtimer_cancel(&ts->sched_timer);
    +# endif

    ts->nohz_mode = NOHZ_MODE_INACTIVE;
    }
    -#endif /* HIGH_RES_TIMERS */
    +#endif

    /**
    * Async notification about clocksource changes
    --
    1.5.4.rc3


    \
     
     \ /
      Last update: 2008-08-04 12:11    [W:0.027 / U:1.232 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site