@@ -114,8 +114,6 @@ struct htb_class {
struct tcf_proto *filter_list;
int filter_cnt;
- int warned; /* only one warning about non work conserving .. */
-
/* token bucket parameters */
struct qdisc_rate_table *rate; /* rate table of the class itself */
struct qdisc_rate_table *ceil; /* ceiling rate (limits borrows too) */
@@ -155,6 +153,10 @@ struct htb_sched {
int direct_qlen; /* max qlen of above */
long direct_pkts;
+
+#define HTB_WARN_NONCONSERVING 0x1
+#define HTB_WARN_TOOMANYEVENTS 0x2
+ int warned; /* only one warning about non work conserving etc. */
};
/* find class in global hash table using given handle */
@@ -687,6 +689,10 @@ static psched_time_t htb_do_events(struct htb_sched *q, int level,
htb_add_to_wait_tree(q, cl, diff);
}
/* too much load - let's continue on next jiffie (including above) */
+ if (!(q->warned & HTB_WARN_TOOMANYEVENTS)) {
+ printk(KERN_WARNING "htb: too many events!\n");
+ q->warned |= HTB_WARN_TOOMANYEVENTS;
+ }
return q->now + 2 * PSCHED_TICKS_PER_SEC / HZ;
}
@@ -809,11 +815,11 @@ next:
skb = cl->un.leaf.q->dequeue(cl->un.leaf.q);
if (likely(skb != NULL))
break;
- if (!cl->warned) {
+ if (!(q->warned & HTB_WARN_NONCONSERVING)) {
printk(KERN_WARNING
"htb: class %X isn't work conserving ?!\n",
cl->common.classid);
- cl->warned = 1;
+ q->warned |= HTB_WARN_NONCONSERVING;
}
htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->