Commit 44f21475511bbc0135b52c66ad74dcc6a9026da3

Authored by Roman Zippel
Committed by Linus Torvalds
1 parent 92127c7a45

[PATCH] hrtimers: pass current time to hrtimer_forward()

Pass current time to hrtimer_forward().  This allows to use the softirq time
in the timer base when the forward function is called from the timer callback.
 Other places pass current time with a call to timer->base->get_time().

Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 4 changed files with 17 additions and 10 deletions Side-by-side Diff

include/linux/hrtimer.h
... ... @@ -130,7 +130,8 @@
130 130 }
131 131  
132 132 /* Forward a hrtimer so it expires after now: */
133   -extern unsigned long hrtimer_forward(struct hrtimer *timer, ktime_t interval);
  133 +extern unsigned long
  134 +hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval);
134 135  
135 136 /* Precise sleep: */
136 137 extern long hrtimer_nanosleep(struct timespec *rqtp,
... ... @@ -301,18 +301,17 @@
301 301 * hrtimer_forward - forward the timer expiry
302 302 *
303 303 * @timer: hrtimer to forward
  304 + * @now: forward past this time
304 305 * @interval: the interval to forward
305 306 *
306 307 * Forward the timer expiry so it will expire in the future.
307 308 * Returns the number of overruns.
308 309 */
309 310 unsigned long
310   -hrtimer_forward(struct hrtimer *timer, ktime_t interval)
  311 +hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval)
311 312 {
312 313 unsigned long orun = 1;
313   - ktime_t delta, now;
314   -
315   - now = timer->base->get_time();
  314 + ktime_t delta;
316 315  
317 316 delta = ktime_sub(now, timer->expires);
318 317  
... ... @@ -136,7 +136,8 @@
136 136  
137 137 if (tsk->signal->it_real_incr.tv64 != 0) {
138 138 hrtimer_forward(&tsk->signal->real_timer,
139   - tsk->signal->it_real_incr);
  139 + tsk->signal->real_timer.base->softirq_time,
  140 + tsk->signal->it_real_incr);
140 141  
141 142 return HRTIMER_RESTART;
142 143 }
kernel/posix-timers.c
... ... @@ -251,15 +251,18 @@
251 251  
252 252 static void schedule_next_timer(struct k_itimer *timr)
253 253 {
  254 + struct hrtimer *timer = &timr->it.real.timer;
  255 +
254 256 if (timr->it.real.interval.tv64 == 0)
255 257 return;
256 258  
257   - timr->it_overrun += hrtimer_forward(&timr->it.real.timer,
  259 + timr->it_overrun += hrtimer_forward(timer, timer->base->get_time(),
258 260 timr->it.real.interval);
  261 +
259 262 timr->it_overrun_last = timr->it_overrun;
260 263 timr->it_overrun = -1;
261 264 ++timr->it_requeue_pending;
262   - hrtimer_restart(&timr->it.real.timer);
  265 + hrtimer_restart(timer);
263 266 }
264 267  
265 268 /*
... ... @@ -334,6 +337,7 @@
334 337 static int posix_timer_fn(void *data)
335 338 {
336 339 struct k_itimer *timr = data;
  340 + struct hrtimer *timer = &timr->it.real.timer;
337 341 unsigned long flags;
338 342 int si_private = 0;
339 343 int ret = HRTIMER_NORESTART;
... ... @@ -351,7 +355,8 @@
351 355 */
352 356 if (timr->it.real.interval.tv64 != 0) {
353 357 timr->it_overrun +=
354   - hrtimer_forward(&timr->it.real.timer,
  358 + hrtimer_forward(timer,
  359 + timer->base->softirq_time,
355 360 timr->it.real.interval);
356 361 ret = HRTIMER_RESTART;
357 362 ++timr->it_requeue_pending;
... ... @@ -623,7 +628,8 @@
623 628 if (timr->it_requeue_pending & REQUEUE_PENDING ||
624 629 (timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE) {
625 630 timr->it_overrun +=
626   - hrtimer_forward(timer, timr->it.real.interval);
  631 + hrtimer_forward(timer, timer->base->get_time(),
  632 + timr->it.real.interval);
627 633 remaining = hrtimer_get_remaining(timer);
628 634 }
629 635 calci: