pkt_sched: sch_hfsc: sch_htb: Add non-work-conserving warning handler.
authorJarek Poplawski <jarkao2@gmail.com>
Sun, 1 Feb 2009 09:12:42 +0000 (01:12 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Feb 2009 09:12:42 +0000 (01:12 -0800)
Patrick McHardy <kaber@trash.net> suggested:
> How about making this flag and the warning message (in a out-of-line
> function) globally available? Other qdiscs (f.i. HFSC) can't deal with
> inner non-work-conserving qdiscs as well.

This patch uses qdisc->flags field of "suspected" child qdisc.

Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/pkt_sched.h
include/net/sch_generic.h
net/sched/sch_api.c
net/sched/sch_hfsc.c
net/sched/sch_htb.c

index 4082f39f507916c5002d7677831da8aff0e9013f..e37fe3129c17ddbf192de69ed3984f2ee5fbc93b 100644 (file)
@@ -85,6 +85,7 @@ extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
                struct nlattr *tab);
 extern void qdisc_put_rtab(struct qdisc_rate_table *tab);
 extern void qdisc_put_stab(struct qdisc_size_table *tab);
+extern void qdisc_warn_nonwc(char *txt, struct Qdisc *qdisc);
 
 extern void __qdisc_run(struct Qdisc *q);
 
index f8c47429044aee1db7ddf54a14e405305be51b0a..3d78a4d224601f5003aef260f4363bc88707d3be 100644 (file)
@@ -42,9 +42,10 @@ struct Qdisc
        int                     (*enqueue)(struct sk_buff *skb, struct Qdisc *dev);
        struct sk_buff *        (*dequeue)(struct Qdisc *dev);
        unsigned                flags;
-#define TCQ_F_BUILTIN  1
-#define TCQ_F_THROTTLED        2
-#define TCQ_F_INGRESS  4
+#define TCQ_F_BUILTIN          1
+#define TCQ_F_THROTTLED                2
+#define TCQ_F_INGRESS          4
+#define TCQ_F_WARN_NONWC       (1 << 16)
        int                     padded;
        struct Qdisc_ops        *ops;
        struct qdisc_size_table *stab;
index 0fc4a18fd96f7d83ec21e95bc6d0740025f6a219..32009793307be7fb39d969aa5fb029e03e01a1f6 100644 (file)
@@ -444,6 +444,17 @@ out:
 }
 EXPORT_SYMBOL(qdisc_calculate_pkt_len);
 
+void qdisc_warn_nonwc(char *txt, struct Qdisc *qdisc)
+{
+       if (!(qdisc->flags & TCQ_F_WARN_NONWC)) {
+               printk(KERN_WARNING
+                      "%s: %s qdisc %X: is non-work-conserving?\n",
+                      txt, qdisc->ops->id, qdisc->handle >> 16);
+               qdisc->flags |= TCQ_F_WARN_NONWC;
+       }
+}
+EXPORT_SYMBOL(qdisc_warn_nonwc);
+
 static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer)
 {
        struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog,
index 45c31b1a4e1dd0b488e6f6e20cc966e7aad70467..74226b265528cb9d2e37a5aed39cb48dc0c2f6db 100644 (file)
@@ -887,8 +887,7 @@ qdisc_peek_len(struct Qdisc *sch)
 
        skb = sch->ops->peek(sch);
        if (skb == NULL) {
-               if (net_ratelimit())
-                       printk("qdisc_peek_len: non work-conserving qdisc ?\n");
+               qdisc_warn_nonwc("qdisc_peek_len", sch);
                return 0;
        }
        len = qdisc_pkt_len(skb);
@@ -1642,8 +1641,7 @@ hfsc_dequeue(struct Qdisc *sch)
 
        skb = qdisc_dequeue_peeked(cl->qdisc);
        if (skb == NULL) {
-               if (net_ratelimit())
-                       printk("HFSC: Non-work-conserving qdisc ?\n");
+               qdisc_warn_nonwc("HFSC", cl->qdisc);
                return NULL;
        }
 
index 2f0f0b04d3fb127efa75b362beeb62c9aab11bde..77ff510ef8acb6e82bd956bcd2b6231b6110c2d9 100644 (file)
@@ -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) */
@@ -809,13 +807,8 @@ next:
                skb = cl->un.leaf.q->dequeue(cl->un.leaf.q);
                if (likely(skb != NULL))
                        break;
-               if (!cl->warned) {
-                       printk(KERN_WARNING
-                              "htb: class %X isn't work conserving ?!\n",
-                              cl->common.classid);
-                       cl->warned = 1;
-               }
 
+               qdisc_warn_nonwc("htb", cl->un.leaf.q);
                htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
                                  ptr[0]) + prio);
                cl = htb_lookup_leaf(q->row[level] + prio, prio,