Commit c0851347 authored by Jarek Poplawski's avatar Jarek Poplawski Committed by David S. Miller

pkt_sched: sch_htb: Consider used jiffies in htb_do_events()

Next event time should consider jiffies used for recounting. Otherwise
qdisc_watchdog_schedule() triggers hrtimer immediately with the event
in the past, and may cause very high ksoftirqd cpu usage (if highres
is on).

There is also removed checking "event" for zero in htb_dequeue(): it's
always true in this place.
Signed-off-by: default avatarJarek Poplawski <jarkao2@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent daaf83d2
...@@ -685,8 +685,8 @@ static psched_time_t htb_do_events(struct htb_sched *q, int level) ...@@ -685,8 +685,8 @@ static psched_time_t htb_do_events(struct htb_sched *q, int level)
if (cl->cmode != HTB_CAN_SEND) if (cl->cmode != HTB_CAN_SEND)
htb_add_to_wait_tree(q, cl, diff); htb_add_to_wait_tree(q, cl, diff);
} }
/* too much load - let's continue on next jiffie */ /* too much load - let's continue on next jiffie (including above) */
return q->now + PSCHED_TICKS_PER_SEC / HZ; return q->now + 2 * PSCHED_TICKS_PER_SEC / HZ;
} }
/* Returns class->node+prio from id-tree where classe's id is >= id. NULL /* Returns class->node+prio from id-tree where classe's id is >= id. NULL
...@@ -873,7 +873,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) ...@@ -873,7 +873,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch)
} else } else
event = q->near_ev_cache[level]; event = q->near_ev_cache[level];
if (event && next_event > event) if (next_event > event)
next_event = event; next_event = event;
m = ~q->row_mask[level]; m = ~q->row_mask[level];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment