pkt_sched: sch_hfsc: sch_htb: Add non-work-conserving warning handler.
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>
This commit is contained in:
Родитель
eefef1cf76
Коммит
b00355db3f
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче