Commit 4a2c290d authored by Patrick McHardy's avatar Patrick McHardy Committed by Patrick McHardy

[NET SCHED]: Fix queue limits in multiple qdiscs.

parent b55b564f
...@@ -47,7 +47,7 @@ bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch) ...@@ -47,7 +47,7 @@ bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{ {
struct fifo_sched_data *q = (struct fifo_sched_data *)sch->data; struct fifo_sched_data *q = (struct fifo_sched_data *)sch->data;
if (sch->stats.backlog <= q->limit) { if (sch->stats.backlog + skb->len <= q->limit) {
__skb_queue_tail(&sch->q, skb); __skb_queue_tail(&sch->q, skb);
sch->stats.backlog += skb->len; sch->stats.backlog += skb->len;
sch->stats.bytes += skb->len; sch->stats.bytes += skb->len;
...@@ -108,7 +108,7 @@ pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch) ...@@ -108,7 +108,7 @@ pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{ {
struct fifo_sched_data *q = (struct fifo_sched_data *)sch->data; struct fifo_sched_data *q = (struct fifo_sched_data *)sch->data;
if (sch->q.qlen <= q->limit) { if (sch->q.qlen < q->limit) {
__skb_queue_tail(&sch->q, skb); __skb_queue_tail(&sch->q, skb);
sch->stats.bytes += skb->len; sch->stats.bytes += skb->len;
sch->stats.packets++; sch->stats.packets++;
......
...@@ -275,7 +275,7 @@ pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc) ...@@ -275,7 +275,7 @@ pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc)
list = ((struct sk_buff_head*)qdisc->data) + list = ((struct sk_buff_head*)qdisc->data) +
prio2band[skb->priority&TC_PRIO_MAX]; prio2band[skb->priority&TC_PRIO_MAX];
if (list->qlen <= qdisc->dev->tx_queue_len) { if (list->qlen < qdisc->dev->tx_queue_len) {
__skb_queue_tail(list, skb); __skb_queue_tail(list, skb);
qdisc->q.qlen++; qdisc->q.qlen++;
qdisc->stats.bytes += skb->len; qdisc->stats.bytes += skb->len;
......
...@@ -110,7 +110,7 @@ gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) ...@@ -110,7 +110,7 @@ gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
unsigned long qave=0; unsigned long qave=0;
int i=0; int i=0;
if (!t->initd && skb_queue_len(&sch->q) <= sch->dev->tx_queue_len) { if (!t->initd && skb_queue_len(&sch->q) < sch->dev->tx_queue_len) {
D2PRINTK("NO GRED Queues setup yet! Enqueued anyway\n"); D2PRINTK("NO GRED Queues setup yet! Enqueued anyway\n");
goto do_enqueue; goto do_enqueue;
} }
...@@ -175,7 +175,7 @@ gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) ...@@ -175,7 +175,7 @@ gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
if ((q->qave+qave) < q->qth_min) { if ((q->qave+qave) < q->qth_min) {
q->qcount = -1; q->qcount = -1;
enqueue: enqueue:
if (q->backlog <= q->limit) { if (q->backlog + skb->len <= q->limit) {
q->backlog += skb->len; q->backlog += skb->len;
do_enqueue: do_enqueue:
__skb_queue_tail(&sch->q, skb); __skb_queue_tail(&sch->q, skb);
......
...@@ -257,7 +257,7 @@ red_enqueue(struct sk_buff *skb, struct Qdisc* sch) ...@@ -257,7 +257,7 @@ red_enqueue(struct sk_buff *skb, struct Qdisc* sch)
if (q->qave < q->qth_min) { if (q->qave < q->qth_min) {
q->qcount = -1; q->qcount = -1;
enqueue: enqueue:
if (sch->stats.backlog <= q->limit) { if (sch->stats.backlog + skb->len <= q->limit) {
__skb_queue_tail(&sch->q, skb); __skb_queue_tail(&sch->q, skb);
sch->stats.backlog += skb->len; sch->stats.backlog += skb->len;
sch->stats.bytes += skb->len; sch->stats.bytes += skb->len;
......
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