lkml.org 
[lkml]   [2008]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 40/71] clockevents: prevent endless loop in periodic broadcast handler
    2.6.26-stable review patch.  If anyone has any objections, please let us
    know.

    ------------------
    From: Thomas Gleixner <tglx@linutronix.de>

    commit d4496b39559c6d43f83e4c08b899984f8b8089b5 upstream

    The reprogramming of the periodic broadcast handler was broken,
    when the first programming returned -ETIME. The clockevents code
    stores the new expiry value in the clock events device next_event field
    only when the programming time has not been elapsed yet. The loop in
    question calculates the new expiry value from the next_event value
    and therefor never increases.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    kernel/time/tick-broadcast.c | 11 ++++++++---
    1 file changed, 8 insertions(+), 3 deletions(-)

    --- a/kernel/time/tick-broadcast.c
    +++ b/kernel/time/tick-broadcast.c
    @@ -174,6 +174,8 @@ static void tick_do_periodic_broadcast(v
    */
    static void tick_handle_periodic_broadcast(struct clock_event_device *dev)
    {
    + ktime_t next;
    +
    tick_do_periodic_broadcast();

    /*
    @@ -184,10 +186,13 @@ static void tick_handle_periodic_broadca

    /*
    * Setup the next period for devices, which do not have
    - * periodic mode:
    + * periodic mode. We read dev->next_event first and add to it
    + * when the event alrady expired. clockevents_program_event()
    + * sets dev->next_event only when the event is really
    + * programmed to the device.
    */
    - for (;;) {
    - ktime_t next = ktime_add(dev->next_event, tick_period);
    + for (next = dev->next_event; ;) {
    + next = ktime_add(next, tick_period);

    if (!clockevents_program_event(dev, next, ktime_get()))
    return;
    --


    \
     
     \ /
      Last update: 2008-10-07 02:57    [W:0.020 / U:183.188 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site