aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/hrtimer.h11
-rw-r--r--kernel/hrtimer.c14
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 */
40enum hrtimer_state {
41 HRTIMER_INACTIVE, /* Timer is inactive */
42 HRTIMER_PENDING, /* Timer is pending */
43};
44 38
45struct hrtimer_base; 39struct hrtimer_base;
46 40
@@ -61,7 +55,6 @@ struct hrtimer_base;
61struct hrtimer { 55struct 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
125static inline int hrtimer_active(const struct hrtimer *timer) 118static 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);