diff options
-rw-r--r-- | include/linux/hrtimer.h | 11 | ||||
-rw-r--r-- | kernel/hrtimer.c | 14 |
2 files changed, 7 insertions, 18 deletions
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 0e8f4762f6f8..f57cc7bd7008 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
@@ -34,13 +34,7 @@ enum hrtimer_restart { | |||
34 | HRTIMER_RESTART, | 34 | HRTIMER_RESTART, |
35 | }; | 35 | }; |
36 | 36 | ||
37 | /* | 37 | #define HRTIMER_INACTIVE ((void *)1UL) |
38 | * Timer states: | ||
39 | */ | ||
40 | enum hrtimer_state { | ||
41 | HRTIMER_INACTIVE, /* Timer is inactive */ | ||
42 | HRTIMER_PENDING, /* Timer is pending */ | ||
43 | }; | ||
44 | 38 | ||
45 | struct hrtimer_base; | 39 | struct hrtimer_base; |
46 | 40 | ||
@@ -61,7 +55,6 @@ struct hrtimer_base; | |||
61 | struct hrtimer { | 55 | struct hrtimer { |
62 | struct rb_node node; | 56 | struct rb_node node; |
63 | ktime_t expires; | 57 | ktime_t expires; |
64 | enum hrtimer_state state; | ||
65 | int (*function)(void *); | 58 | int (*function)(void *); |
66 | void *data; | 59 | void *data; |
67 | struct hrtimer_base *base; | 60 | struct hrtimer_base *base; |
@@ -124,7 +117,7 @@ extern ktime_t hrtimer_get_next_event(void); | |||
124 | 117 | ||
125 | static inline int hrtimer_active(const struct hrtimer *timer) | 118 | static inline int hrtimer_active(const struct hrtimer *timer) |
126 | { | 119 | { |
127 | return timer->state == HRTIMER_PENDING; | 120 | return timer->node.rb_parent != HRTIMER_INACTIVE; |
128 | } | 121 | } |
129 | 122 | ||
130 | /* Forward a hrtimer so it expires after now: */ | 123 | /* Forward a hrtimer so it expires after now: */ |
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 59ec50c1e905..658d49feedb9 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
@@ -374,8 +374,6 @@ static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base) | |||
374 | rb_link_node(&timer->node, parent, link); | 374 | rb_link_node(&timer->node, parent, link); |
375 | rb_insert_color(&timer->node, &base->active); | 375 | rb_insert_color(&timer->node, &base->active); |
376 | 376 | ||
377 | timer->state = HRTIMER_PENDING; | ||
378 | |||
379 | if (!base->first || timer->expires.tv64 < | 377 | if (!base->first || timer->expires.tv64 < |
380 | rb_entry(base->first, struct hrtimer, node)->expires.tv64) | 378 | rb_entry(base->first, struct hrtimer, node)->expires.tv64) |
381 | base->first = &timer->node; | 379 | base->first = &timer->node; |
@@ -395,6 +393,7 @@ static void __remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base) | |||
395 | if (base->first == &timer->node) | 393 | if (base->first == &timer->node) |
396 | base->first = rb_next(&timer->node); | 394 | base->first = rb_next(&timer->node); |
397 | rb_erase(&timer->node, &base->active); | 395 | rb_erase(&timer->node, &base->active); |
396 | timer->node.rb_parent = HRTIMER_INACTIVE; | ||
398 | } | 397 | } |
399 | 398 | ||
400 | /* | 399 | /* |
@@ -405,7 +404,6 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base) | |||
405 | { | 404 | { |
406 | if (hrtimer_active(timer)) { | 405 | if (hrtimer_active(timer)) { |
407 | __remove_hrtimer(timer, base); | 406 | __remove_hrtimer(timer, base); |
408 | timer->state = HRTIMER_INACTIVE; | ||
409 | return 1; | 407 | return 1; |
410 | } | 408 | } |
411 | return 0; | 409 | return 0; |
@@ -579,6 +577,7 @@ void hrtimer_init(struct hrtimer *timer, clockid_t clock_id, | |||
579 | clock_id = CLOCK_MONOTONIC; | 577 | clock_id = CLOCK_MONOTONIC; |
580 | 578 | ||
581 | timer->base = &bases[clock_id]; | 579 | timer->base = &bases[clock_id]; |
580 | timer->node.rb_parent = HRTIMER_INACTIVE; | ||
582 | } | 581 | } |
583 | 582 | ||
584 | /** | 583 | /** |
@@ -625,7 +624,6 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base) | |||
625 | fn = timer->function; | 624 | fn = timer->function; |
626 | data = timer->data; | 625 | data = timer->data; |
627 | set_curr_timer(base, timer); | 626 | set_curr_timer(base, timer); |
628 | timer->state = HRTIMER_INACTIVE; | ||
629 | __remove_hrtimer(timer, base); | 627 | __remove_hrtimer(timer, base); |
630 | spin_unlock_irq(&base->lock); | 628 | spin_unlock_irq(&base->lock); |
631 | 629 | ||
@@ -633,12 +631,10 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base) | |||
633 | 631 | ||
634 | spin_lock_irq(&base->lock); | 632 | spin_lock_irq(&base->lock); |
635 | 633 | ||
636 | /* Another CPU has added back the timer */ | 634 | if (restart != HRTIMER_NORESTART) { |
637 | if (timer->state != HRTIMER_INACTIVE) | 635 | BUG_ON(hrtimer_active(timer)); |
638 | continue; | ||
639 | |||
640 | if (restart != HRTIMER_NORESTART) | ||
641 | enqueue_hrtimer(timer, base); | 636 | enqueue_hrtimer(timer, base); |
637 | } | ||
642 | } | 638 | } |
643 | set_curr_timer(base, NULL); | 639 | set_curr_timer(base, NULL); |
644 | spin_unlock_irq(&base->lock); | 640 | spin_unlock_irq(&base->lock); |