pkt_sched: sch_htb: Break all htb_do_events() after 2 jiifies
Subsystems (3)
PATCH 3/6 pkt_sched: sch_htb: Break all htb_do_events() after 2 jiifies
Currently htb_do_events() breaks events recounting for a level after 2 jiffies, but there is no reason to repeat this for next levels and increase delays even more (with softirqs disabled). htb_dequeue_tree() can add to this too, btw. In such a case q->now time is invalid anyway.
Signed-off-by Jarek Poplawski <[email protected]>
--- net/sched/sch_htb.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-)
net/sched/sch_htb.c +4 -3
@@ -661,12 +661,13 @@ static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,* next pending event (0 for no event in pq). * Note: Applied are events whose have cl->pq_key <= q->now. */ -static psched_time_t htb_do_events (struct htb_sched *q,int level) +static psched_time_t htb_do_events (struct htb_sched *q,int level, +unsigned long start) {/* don't run for longer than 2 jiffies; 2 is used instead of 1 to simplify things when jiffy is going to be incremented too soon */ -unsigned long stop_at = jiffies +2 ; +unsigned long stop_at = start +2 ;while (time_before (jiffies, stop_at)) {struct htb_class *cl;long diff;
@@ -871,7 +872,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch)psched_time_t event;if (q->now >= q->near_ev_cache[level]) { - event =htb_do_events (q, level); + event =htb_do_events (q, level, start_at);if (!event) event = q->now +PSCHED_TICKS_PER_SEC ; q->near_ev_cache[level] = event;
Signature · 1 line
1.5.6.5