Messages in this thread | | | Date | Mon, 08 Apr 2013 10:53:08 -0400 | From | Rik van Riel <> | Subject | Re: [PATCH] hrtimer, add expiry time overflow check in hrtimer_interrupt |
| |
On 04/08/2013 08:47 AM, Prarit Bhargava wrote:
> When we change the system time to a low value like this, the value of > timekeeper->offs_real will be a negative value. > > It seems that the WARN occurs because an hrtimer has been started in the time > between the releasing of the timekeeper lock and the IPI call (via a call to > on_each_cpu) in clock_was_set() in the do_settimeofday() code. The end result > is that a REALTIME_CLOCK timer has been added with softexpires = expires = > KTIME_MAX. The hrtimer_interrupt() fires/is called and the loop at > kernel/hrtimer.c:1289 is executed. In this loop the code subtracts the > clock base's offset (which was set to timekeeper->offs_real in > do_settimeofday()) from the current hrtimer_cpu_base->expiry value (which > was KTIME_MAX): > > KTIME_MAX - (a negative value) = overflow > > A simple check for an overflow can resolve this problem. Using KTIME_MAX > instead of the overflow value will result in the hrtimer function being run, > and the reprogramming of the timer after that. > > Signed-off-by: Prarit Bhargava <prarit@redhat.com> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: John Stultz <john.stultz@linaro.org>
Reviewed-by: Rik van Riel <riel@redhat.com>
-- All rights reversed
| |