Skip to content
Snippets Groups Projects
Commit 7a4ed937 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds
Browse files

[PATCH] Fix cpu timers expiration time


There's a silly off-by-one error in the code that updates the expiration
of posix CPU timers, causing them to not be properly updated when they
hit exactly on their expiration time (which should be the normal case).

This causes them to then fire immediately again, and only _then_ get
properly updated.

Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e02fd440
No related branches found
No related tags found
No related merge requests found
...@@ -91,7 +91,7 @@ static inline union cpu_time_count cpu_time_sub(clockid_t which_clock, ...@@ -91,7 +91,7 @@ static inline union cpu_time_count cpu_time_sub(clockid_t which_clock,
* Update expiry time from increment, and increase overrun count, * Update expiry time from increment, and increase overrun count,
* given the current clock sample. * given the current clock sample.
*/ */
static inline void bump_cpu_timer(struct k_itimer *timer, static void bump_cpu_timer(struct k_itimer *timer,
union cpu_time_count now) union cpu_time_count now)
{ {
int i; int i;
...@@ -110,7 +110,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer, ...@@ -110,7 +110,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer,
for (i = 0; incr < delta - incr; i++) for (i = 0; incr < delta - incr; i++)
incr = incr << 1; incr = incr << 1;
for (; i >= 0; incr >>= 1, i--) { for (; i >= 0; incr >>= 1, i--) {
if (delta <= incr) if (delta < incr)
continue; continue;
timer->it.cpu.expires.sched += incr; timer->it.cpu.expires.sched += incr;
timer->it_overrun += 1 << i; timer->it_overrun += 1 << i;
...@@ -128,7 +128,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer, ...@@ -128,7 +128,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer,
for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++) for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++)
incr = cputime_add(incr, incr); incr = cputime_add(incr, incr);
for (; i >= 0; incr = cputime_halve(incr), i--) { for (; i >= 0; incr = cputime_halve(incr), i--) {
if (cputime_le(delta, incr)) if (cputime_lt(delta, incr))
continue; continue;
timer->it.cpu.expires.cpu = timer->it.cpu.expires.cpu =
cputime_add(timer->it.cpu.expires.cpu, incr); cputime_add(timer->it.cpu.expires.cpu, incr);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment