diff options
Diffstat (limited to 'net/sched/sch_cbq.c')
| -rw-r--r-- | net/sched/sch_cbq.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 149b0405c5e..d5798e17a83 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
| @@ -163,7 +163,7 @@ struct cbq_sched_data | |||
| 163 | psched_time_t now_rt; /* Cached real time */ | 163 | psched_time_t now_rt; /* Cached real time */ |
| 164 | unsigned pmask; | 164 | unsigned pmask; |
| 165 | 165 | ||
| 166 | struct tasklet_hrtimer delay_timer; | 166 | struct hrtimer delay_timer; |
| 167 | struct qdisc_watchdog watchdog; /* Watchdog timer, | 167 | struct qdisc_watchdog watchdog; /* Watchdog timer, |
| 168 | started when CBQ has | 168 | started when CBQ has |
| 169 | backlog, but cannot | 169 | backlog, but cannot |
| @@ -503,8 +503,6 @@ static void cbq_ovl_delay(struct cbq_class *cl) | |||
| 503 | cl->undertime = q->now + delay; | 503 | cl->undertime = q->now + delay; |
| 504 | 504 | ||
| 505 | if (delay > 0) { | 505 | if (delay > 0) { |
| 506 | struct hrtimer *ht; | ||
| 507 | |||
| 508 | sched += delay + cl->penalty; | 506 | sched += delay + cl->penalty; |
| 509 | cl->penalized = sched; | 507 | cl->penalized = sched; |
| 510 | cl->cpriority = TC_CBQ_MAXPRIO; | 508 | cl->cpriority = TC_CBQ_MAXPRIO; |
| @@ -512,12 +510,12 @@ static void cbq_ovl_delay(struct cbq_class *cl) | |||
| 512 | 510 | ||
| 513 | expires = ktime_set(0, 0); | 511 | expires = ktime_set(0, 0); |
| 514 | expires = ktime_add_ns(expires, PSCHED_TICKS2NS(sched)); | 512 | expires = ktime_add_ns(expires, PSCHED_TICKS2NS(sched)); |
| 515 | ht = &q->delay_timer.timer; | 513 | if (hrtimer_try_to_cancel(&q->delay_timer) && |
| 516 | if (hrtimer_try_to_cancel(ht) && | 514 | ktime_to_ns(ktime_sub( |
| 517 | ktime_to_ns(ktime_sub(hrtimer_get_expires(ht), | 515 | hrtimer_get_expires(&q->delay_timer), |
| 518 | expires)) > 0) | 516 | expires)) > 0) |
| 519 | hrtimer_set_expires(ht, expires); | 517 | hrtimer_set_expires(&q->delay_timer, expires); |
| 520 | hrtimer_restart(ht); | 518 | hrtimer_restart(&q->delay_timer); |
| 521 | cl->delayed = 1; | 519 | cl->delayed = 1; |
| 522 | cl->xstats.overactions++; | 520 | cl->xstats.overactions++; |
| 523 | return; | 521 | return; |
| @@ -593,7 +591,7 @@ static psched_tdiff_t cbq_undelay_prio(struct cbq_sched_data *q, int prio, | |||
| 593 | static enum hrtimer_restart cbq_undelay(struct hrtimer *timer) | 591 | static enum hrtimer_restart cbq_undelay(struct hrtimer *timer) |
| 594 | { | 592 | { |
| 595 | struct cbq_sched_data *q = container_of(timer, struct cbq_sched_data, | 593 | struct cbq_sched_data *q = container_of(timer, struct cbq_sched_data, |
| 596 | delay_timer.timer); | 594 | delay_timer); |
| 597 | struct Qdisc *sch = q->watchdog.qdisc; | 595 | struct Qdisc *sch = q->watchdog.qdisc; |
| 598 | psched_time_t now; | 596 | psched_time_t now; |
| 599 | psched_tdiff_t delay = 0; | 597 | psched_tdiff_t delay = 0; |
| @@ -623,7 +621,7 @@ static enum hrtimer_restart cbq_undelay(struct hrtimer *timer) | |||
| 623 | 621 | ||
| 624 | time = ktime_set(0, 0); | 622 | time = ktime_set(0, 0); |
| 625 | time = ktime_add_ns(time, PSCHED_TICKS2NS(now + delay)); | 623 | time = ktime_add_ns(time, PSCHED_TICKS2NS(now + delay)); |
| 626 | tasklet_hrtimer_start(&q->delay_timer, time, HRTIMER_MODE_ABS); | 624 | hrtimer_start(&q->delay_timer, time, HRTIMER_MODE_ABS); |
| 627 | } | 625 | } |
| 628 | 626 | ||
| 629 | sch->flags &= ~TCQ_F_THROTTLED; | 627 | sch->flags &= ~TCQ_F_THROTTLED; |
| @@ -1216,7 +1214,7 @@ cbq_reset(struct Qdisc* sch) | |||
| 1216 | q->tx_class = NULL; | 1214 | q->tx_class = NULL; |
| 1217 | q->tx_borrowed = NULL; | 1215 | q->tx_borrowed = NULL; |
| 1218 | qdisc_watchdog_cancel(&q->watchdog); | 1216 | qdisc_watchdog_cancel(&q->watchdog); |
| 1219 | tasklet_hrtimer_cancel(&q->delay_timer); | 1217 | hrtimer_cancel(&q->delay_timer); |
| 1220 | q->toplevel = TC_CBQ_MAXLEVEL; | 1218 | q->toplevel = TC_CBQ_MAXLEVEL; |
| 1221 | q->now = psched_get_time(); | 1219 | q->now = psched_get_time(); |
| 1222 | q->now_rt = q->now; | 1220 | q->now_rt = q->now; |
| @@ -1399,8 +1397,7 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt) | |||
| 1399 | q->link.minidle = -0x7FFFFFFF; | 1397 | q->link.minidle = -0x7FFFFFFF; |
| 1400 | 1398 | ||
| 1401 | qdisc_watchdog_init(&q->watchdog, sch); | 1399 | qdisc_watchdog_init(&q->watchdog, sch); |
| 1402 | tasklet_hrtimer_init(&q->delay_timer, cbq_undelay, | 1400 | hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); |
| 1403 | CLOCK_MONOTONIC, HRTIMER_MODE_ABS); | ||
| 1404 | q->delay_timer.function = cbq_undelay; | 1401 | q->delay_timer.function = cbq_undelay; |
| 1405 | q->toplevel = TC_CBQ_MAXLEVEL; | 1402 | q->toplevel = TC_CBQ_MAXLEVEL; |
| 1406 | q->now = psched_get_time(); | 1403 | q->now = psched_get_time(); |
