diff options
Diffstat (limited to 'kernel/hrtimer.c')
| -rw-r--r-- | kernel/hrtimer.c | 83 |
1 files changed, 27 insertions, 56 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 72206cf5c6cf..f2429fc3438c 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
| @@ -516,10 +516,13 @@ hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal) | |||
| 516 | 516 | ||
| 517 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++, base++) { | 517 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++, base++) { |
| 518 | struct hrtimer *timer; | 518 | struct hrtimer *timer; |
| 519 | struct timerqueue_node *next; | ||
| 519 | 520 | ||
| 520 | if (!base->first) | 521 | next = timerqueue_getnext(&base->active); |
| 522 | if (!next) | ||
| 521 | continue; | 523 | continue; |
| 522 | timer = rb_entry(base->first, struct hrtimer, node); | 524 | timer = container_of(next, struct hrtimer, node); |
| 525 | |||
| 523 | expires = ktime_sub(hrtimer_get_expires(timer), base->offset); | 526 | expires = ktime_sub(hrtimer_get_expires(timer), base->offset); |
| 524 | /* | 527 | /* |
| 525 | * clock_was_set() has changed base->offset so the | 528 | * clock_was_set() has changed base->offset so the |
| @@ -840,48 +843,17 @@ EXPORT_SYMBOL_GPL(hrtimer_forward); | |||
| 840 | static int enqueue_hrtimer(struct hrtimer *timer, | 843 | static int enqueue_hrtimer(struct hrtimer *timer, |
| 841 | struct hrtimer_clock_base *base) | 844 | struct hrtimer_clock_base *base) |
| 842 | { | 845 | { |
| 843 | struct rb_node **link = &base->active.rb_node; | ||
| 844 | struct rb_node *parent = NULL; | ||
| 845 | struct hrtimer *entry; | ||
| 846 | int leftmost = 1; | ||
| 847 | |||
| 848 | debug_activate(timer); | 846 | debug_activate(timer); |
| 849 | 847 | ||
| 850 | /* | 848 | timerqueue_add(&base->active, &timer->node); |
| 851 | * Find the right place in the rbtree: | ||
| 852 | */ | ||
| 853 | while (*link) { | ||
| 854 | parent = *link; | ||
| 855 | entry = rb_entry(parent, struct hrtimer, node); | ||
| 856 | /* | ||
| 857 | * We dont care about collisions. Nodes with | ||
| 858 | * the same expiry time stay together. | ||
| 859 | */ | ||
| 860 | if (hrtimer_get_expires_tv64(timer) < | ||
| 861 | hrtimer_get_expires_tv64(entry)) { | ||
| 862 | link = &(*link)->rb_left; | ||
| 863 | } else { | ||
| 864 | link = &(*link)->rb_right; | ||
| 865 | leftmost = 0; | ||
| 866 | } | ||
| 867 | } | ||
| 868 | |||
| 869 | /* | ||
| 870 | * Insert the timer to the rbtree and check whether it | ||
| 871 | * replaces the first pending timer | ||
| 872 | */ | ||
| 873 | if (leftmost) | ||
| 874 | base->first = &timer->node; | ||
| 875 | 849 | ||
| 876 | rb_link_node(&timer->node, parent, link); | ||
| 877 | rb_insert_color(&timer->node, &base->active); | ||
| 878 | /* | 850 | /* |
| 879 | * HRTIMER_STATE_ENQUEUED is or'ed to the current state to preserve the | 851 | * HRTIMER_STATE_ENQUEUED is or'ed to the current state to preserve the |
| 880 | * state of a possibly running callback. | 852 | * state of a possibly running callback. |
| 881 | */ | 853 | */ |
| 882 | timer->state |= HRTIMER_STATE_ENQUEUED; | 854 | timer->state |= HRTIMER_STATE_ENQUEUED; |
| 883 | 855 | ||
| 884 | return leftmost; | 856 | return (&timer->node == base->active.next); |
| 885 | } | 857 | } |
| 886 | 858 | ||
| 887 | /* | 859 | /* |
| @@ -901,12 +873,7 @@ static void __remove_hrtimer(struct hrtimer *timer, | |||
| 901 | if (!(timer->state & HRTIMER_STATE_ENQUEUED)) | 873 | if (!(timer->state & HRTIMER_STATE_ENQUEUED)) |
| 902 | goto out; | 874 | goto out; |
| 903 | 875 | ||
| 904 | /* | 876 | if (&timer->node == timerqueue_getnext(&base->active)) { |
| 905 | * Remove the timer from the rbtree and replace the first | ||
| 906 | * entry pointer if necessary. | ||
| 907 | */ | ||
| 908 | if (base->first == &timer->node) { | ||
| 909 | base->first = rb_next(&timer->node); | ||
| 910 | #ifdef CONFIG_HIGH_RES_TIMERS | 877 | #ifdef CONFIG_HIGH_RES_TIMERS |
| 911 | /* Reprogram the clock event device. if enabled */ | 878 | /* Reprogram the clock event device. if enabled */ |
| 912 | if (reprogram && hrtimer_hres_active()) { | 879 | if (reprogram && hrtimer_hres_active()) { |
| @@ -919,7 +886,7 @@ static void __remove_hrtimer(struct hrtimer *timer, | |||
| 919 | } | 886 | } |
| 920 | #endif | 887 | #endif |
| 921 | } | 888 | } |
| 922 | rb_erase(&timer->node, &base->active); | 889 | timerqueue_del(&base->active, &timer->node); |
| 923 | out: | 890 | out: |
| 924 | timer->state = newstate; | 891 | timer->state = newstate; |
| 925 | } | 892 | } |
| @@ -1128,11 +1095,13 @@ ktime_t hrtimer_get_next_event(void) | |||
| 1128 | if (!hrtimer_hres_active()) { | 1095 | if (!hrtimer_hres_active()) { |
| 1129 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++, base++) { | 1096 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++, base++) { |
| 1130 | struct hrtimer *timer; | 1097 | struct hrtimer *timer; |
| 1098 | struct timerqueue_node *next; | ||
| 1131 | 1099 | ||
| 1132 | if (!base->first) | 1100 | next = timerqueue_getnext(&base->active); |
| 1101 | if (!next) | ||
| 1133 | continue; | 1102 | continue; |
| 1134 | 1103 | ||
| 1135 | timer = rb_entry(base->first, struct hrtimer, node); | 1104 | timer = container_of(next, struct hrtimer, node); |
| 1136 | delta.tv64 = hrtimer_get_expires_tv64(timer); | 1105 | delta.tv64 = hrtimer_get_expires_tv64(timer); |
| 1137 | delta = ktime_sub(delta, base->get_time()); | 1106 | delta = ktime_sub(delta, base->get_time()); |
| 1138 | if (delta.tv64 < mindelta.tv64) | 1107 | if (delta.tv64 < mindelta.tv64) |
| @@ -1162,6 +1131,7 @@ static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, | |||
| 1162 | 1131 | ||
| 1163 | timer->base = &cpu_base->clock_base[clock_id]; | 1132 | timer->base = &cpu_base->clock_base[clock_id]; |
| 1164 | hrtimer_init_timer_hres(timer); | 1133 | hrtimer_init_timer_hres(timer); |
| 1134 | timerqueue_init(&timer->node); | ||
| 1165 | 1135 | ||
| 1166 | #ifdef CONFIG_TIMER_STATS | 1136 | #ifdef CONFIG_TIMER_STATS |
| 1167 | timer->start_site = NULL; | 1137 | timer->start_site = NULL; |
| @@ -1278,14 +1248,14 @@ retry: | |||
| 1278 | 1248 | ||
| 1279 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { | 1249 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { |
| 1280 | ktime_t basenow; | 1250 | ktime_t basenow; |
| 1281 | struct rb_node *node; | 1251 | struct timerqueue_node *node; |
| 1282 | 1252 | ||
| 1283 | basenow = ktime_add(now, base->offset); | 1253 | basenow = ktime_add(now, base->offset); |
| 1284 | 1254 | ||
| 1285 | while ((node = base->first)) { | 1255 | while ((node = timerqueue_getnext(&base->active))) { |
| 1286 | struct hrtimer *timer; | 1256 | struct hrtimer *timer; |
| 1287 | 1257 | ||
| 1288 | timer = rb_entry(node, struct hrtimer, node); | 1258 | timer = container_of(node, struct hrtimer, node); |
| 1289 | 1259 | ||
| 1290 | /* | 1260 | /* |
| 1291 | * The immediate goal for using the softexpires is | 1261 | * The immediate goal for using the softexpires is |
| @@ -1441,7 +1411,7 @@ void hrtimer_run_pending(void) | |||
| 1441 | */ | 1411 | */ |
| 1442 | void hrtimer_run_queues(void) | 1412 | void hrtimer_run_queues(void) |
| 1443 | { | 1413 | { |
| 1444 | struct rb_node *node; | 1414 | struct timerqueue_node *node; |
| 1445 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); | 1415 | struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases); |
| 1446 | struct hrtimer_clock_base *base; | 1416 | struct hrtimer_clock_base *base; |
| 1447 | int index, gettime = 1; | 1417 | int index, gettime = 1; |
| @@ -1451,8 +1421,7 @@ void hrtimer_run_queues(void) | |||
| 1451 | 1421 | ||
| 1452 | for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) { | 1422 | for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) { |
| 1453 | base = &cpu_base->clock_base[index]; | 1423 | base = &cpu_base->clock_base[index]; |
| 1454 | 1424 | if (!timerqueue_getnext(&base->active)) | |
| 1455 | if (!base->first) | ||
| 1456 | continue; | 1425 | continue; |
| 1457 | 1426 | ||
| 1458 | if (gettime) { | 1427 | if (gettime) { |
| @@ -1462,10 +1431,10 @@ void hrtimer_run_queues(void) | |||
| 1462 | 1431 | ||
| 1463 | raw_spin_lock(&cpu_base->lock); | 1432 | raw_spin_lock(&cpu_base->lock); |
| 1464 | 1433 | ||
| 1465 | while ((node = base->first)) { | 1434 | while ((node = timerqueue_getnext(&base->active))) { |
| 1466 | struct hrtimer *timer; | 1435 | struct hrtimer *timer; |
| 1467 | 1436 | ||
| 1468 | timer = rb_entry(node, struct hrtimer, node); | 1437 | timer = container_of(node, struct hrtimer, node); |
| 1469 | if (base->softirq_time.tv64 <= | 1438 | if (base->softirq_time.tv64 <= |
| 1470 | hrtimer_get_expires_tv64(timer)) | 1439 | hrtimer_get_expires_tv64(timer)) |
| 1471 | break; | 1440 | break; |
| @@ -1630,8 +1599,10 @@ static void __cpuinit init_hrtimers_cpu(int cpu) | |||
| 1630 | 1599 | ||
| 1631 | raw_spin_lock_init(&cpu_base->lock); | 1600 | raw_spin_lock_init(&cpu_base->lock); |
| 1632 | 1601 | ||
| 1633 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) | 1602 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { |
| 1634 | cpu_base->clock_base[i].cpu_base = cpu_base; | 1603 | cpu_base->clock_base[i].cpu_base = cpu_base; |
| 1604 | timerqueue_init_head(&cpu_base->clock_base[i].active); | ||
| 1605 | } | ||
| 1635 | 1606 | ||
| 1636 | hrtimer_init_hres(cpu_base); | 1607 | hrtimer_init_hres(cpu_base); |
| 1637 | } | 1608 | } |
| @@ -1642,10 +1613,10 @@ static void migrate_hrtimer_list(struct hrtimer_clock_base *old_base, | |||
| 1642 | struct hrtimer_clock_base *new_base) | 1613 | struct hrtimer_clock_base *new_base) |
| 1643 | { | 1614 | { |
| 1644 | struct hrtimer *timer; | 1615 | struct hrtimer *timer; |
| 1645 | struct rb_node *node; | 1616 | struct timerqueue_node *node; |
| 1646 | 1617 | ||
| 1647 | while ((node = rb_first(&old_base->active))) { | 1618 | while ((node = timerqueue_getnext(&old_base->active))) { |
| 1648 | timer = rb_entry(node, struct hrtimer, node); | 1619 | timer = container_of(node, struct hrtimer, node); |
| 1649 | BUG_ON(hrtimer_callback_running(timer)); | 1620 | BUG_ON(hrtimer_callback_running(timer)); |
| 1650 | debug_deactivate(timer); | 1621 | debug_deactivate(timer); |
| 1651 | 1622 | ||
