Commit 44f21475511bbc0135b52c66ad74dcc6a9026da3
Committed by
Linus Torvalds
1 parent
92127c7a45
Exists in
master
and in
4 other branches
[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, |
kernel/hrtimer.c
... | ... | @@ -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 |
kernel/itimer.c
... | ... | @@ -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: |