Skip to content

Commit

Permalink
clockevents: prevent endless loop in periodic broadcast handler
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Thomas Gleixner committed Sep 5, 2008
1 parent 7c1e768 commit d4496b3
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions kernel/time/tick-broadcast.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,8 @@ static void tick_do_periodic_broadcast(void)
*/
static void tick_handle_periodic_broadcast(struct clock_event_device *dev)
{
ktime_t next;

tick_do_periodic_broadcast();

/*
Expand All @@ -185,10 +187,13 @@ static void tick_handle_periodic_broadcast(struct clock_event_device *dev)

/*
* 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;
Expand Down

0 comments on commit d4496b3

Please sign in to comment.