瀏覽代碼

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: Jarek Poplawski <jarkao2@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Jarek Poplawski 17 年之前
父節點
當前提交
c085134719
共有 1 個文件被更改,包括 3 次插入3 次删除
  1. 3 3
      net/sched/sch_htb.c

+ 3 - 3
net/sched/sch_htb.c

@@ -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 */
-	return q->now + PSCHED_TICKS_PER_SEC / HZ;
+	/* too much load - let's continue on next jiffie (including above) */
+	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)
 		} 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];