diff options
-rw-r--r-- | include/net/pkt_sched.h | 8 | ||||
-rw-r--r-- | include/net/red.h | 2 | ||||
-rw-r--r-- | net/sched/act_police.c | 8 | ||||
-rw-r--r-- | net/sched/sch_htb.c | 4 | ||||
-rw-r--r-- | net/sched/sch_tbf.c | 2 |
5 files changed, 14 insertions, 10 deletions
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 163973740207..e6b1da050d32 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h | |||
@@ -51,10 +51,14 @@ typedef long psched_tdiff_t; | |||
51 | #define PSCHED_GET_TIME(stamp) \ | 51 | #define PSCHED_GET_TIME(stamp) \ |
52 | ((stamp) = PSCHED_NS2US(ktime_to_ns(ktime_get()))) | 52 | ((stamp) = PSCHED_NS2US(ktime_to_ns(ktime_get()))) |
53 | 53 | ||
54 | #define PSCHED_TDIFF_SAFE(tv1, tv2, bound) \ | ||
55 | min_t(long long, (tv1) - (tv2), bound) | ||
56 | #define PSCHED_PASTPERFECT 0 | 54 | #define PSCHED_PASTPERFECT 0 |
57 | 55 | ||
56 | static inline psched_tdiff_t | ||
57 | psched_tdiff_bounded(psched_time_t tv1, psched_time_t tv2, psched_time_t bound) | ||
58 | { | ||
59 | return min(tv1 - tv2, bound); | ||
60 | } | ||
61 | |||
58 | struct qdisc_watchdog { | 62 | struct qdisc_watchdog { |
59 | struct hrtimer timer; | 63 | struct hrtimer timer; |
60 | struct Qdisc *qdisc; | 64 | struct Qdisc *qdisc; |
diff --git a/include/net/red.h b/include/net/red.h index d9e1149a2bca..0bc16913fdd7 100644 --- a/include/net/red.h +++ b/include/net/red.h | |||
@@ -178,7 +178,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p) | |||
178 | int shift; | 178 | int shift; |
179 | 179 | ||
180 | PSCHED_GET_TIME(now); | 180 | PSCHED_GET_TIME(now); |
181 | us_idle = PSCHED_TDIFF_SAFE(now, p->qidlestart, p->Scell_max); | 181 | us_idle = psched_tdiff_bounded(now, p->qidlestart, p->Scell_max); |
182 | 182 | ||
183 | /* | 183 | /* |
184 | * The problem: ideally, average length queue recalcultion should | 184 | * The problem: ideally, average length queue recalcultion should |
diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 0a5679ea6c64..65d60a3f7761 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c | |||
@@ -298,8 +298,8 @@ static int tcf_act_police(struct sk_buff *skb, struct tc_action *a, | |||
298 | 298 | ||
299 | PSCHED_GET_TIME(now); | 299 | PSCHED_GET_TIME(now); |
300 | 300 | ||
301 | toks = PSCHED_TDIFF_SAFE(now, police->tcfp_t_c, | 301 | toks = psched_tdiff_bounded(now, police->tcfp_t_c, |
302 | police->tcfp_burst); | 302 | police->tcfp_burst); |
303 | if (police->tcfp_P_tab) { | 303 | if (police->tcfp_P_tab) { |
304 | ptoks = toks + police->tcfp_ptoks; | 304 | ptoks = toks + police->tcfp_ptoks; |
305 | if (ptoks > (long)L2T_P(police, police->tcfp_mtu)) | 305 | if (ptoks > (long)L2T_P(police, police->tcfp_mtu)) |
@@ -544,8 +544,8 @@ int tcf_police(struct sk_buff *skb, struct tcf_police *police) | |||
544 | } | 544 | } |
545 | 545 | ||
546 | PSCHED_GET_TIME(now); | 546 | PSCHED_GET_TIME(now); |
547 | toks = PSCHED_TDIFF_SAFE(now, police->tcfp_t_c, | 547 | toks = psched_tdiff_bounded(now, police->tcfp_t_c, |
548 | police->tcfp_burst); | 548 | police->tcfp_burst); |
549 | if (police->tcfp_P_tab) { | 549 | if (police->tcfp_P_tab) { |
550 | ptoks = toks + police->tcfp_ptoks; | 550 | ptoks = toks + police->tcfp_ptoks; |
551 | if (ptoks > (long)L2T_P(police, police->tcfp_mtu)) | 551 | if (ptoks > (long)L2T_P(police, police->tcfp_mtu)) |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index b7abd0ae676a..71e4c92b7e87 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -729,7 +729,7 @@ static void htb_charge_class(struct htb_sched *q, struct htb_class *cl, | |||
729 | cl->T = toks | 729 | cl->T = toks |
730 | 730 | ||
731 | while (cl) { | 731 | while (cl) { |
732 | diff = PSCHED_TDIFF_SAFE(q->now, cl->t_c, (u32) cl->mbuffer); | 732 | diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer); |
733 | if (cl->level >= level) { | 733 | if (cl->level >= level) { |
734 | if (cl->level == level) | 734 | if (cl->level == level) |
735 | cl->xstats.lends++; | 735 | cl->xstats.lends++; |
@@ -789,7 +789,7 @@ static psched_time_t htb_do_events(struct htb_sched *q, int level) | |||
789 | return cl->pq_key; | 789 | return cl->pq_key; |
790 | 790 | ||
791 | htb_safe_rb_erase(p, q->wait_pq + level); | 791 | htb_safe_rb_erase(p, q->wait_pq + level); |
792 | diff = PSCHED_TDIFF_SAFE(q->now, cl->t_c, (u32) cl->mbuffer); | 792 | diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer); |
793 | htb_change_class_mode(q, cl, &diff); | 793 | htb_change_class_mode(q, cl, &diff); |
794 | if (cl->cmode != HTB_CAN_SEND) | 794 | if (cl->cmode != HTB_CAN_SEND) |
795 | htb_add_to_wait_tree(q, cl, diff); | 795 | htb_add_to_wait_tree(q, cl, diff); |
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 626ce96800fe..da9f40e54447 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
@@ -201,7 +201,7 @@ static struct sk_buff *tbf_dequeue(struct Qdisc* sch) | |||
201 | 201 | ||
202 | PSCHED_GET_TIME(now); | 202 | PSCHED_GET_TIME(now); |
203 | 203 | ||
204 | toks = PSCHED_TDIFF_SAFE(now, q->t_c, q->buffer); | 204 | toks = psched_tdiff_bounded(now, q->t_c, q->buffer); |
205 | 205 | ||
206 | if (q->P_tab) { | 206 | if (q->P_tab) { |
207 | ptoks = toks + q->ptokens; | 207 | ptoks = toks + q->ptokens; |