summaryrefslogtreecommitdiff
path: root/release/src/linux/linux/net/sched/sch_fifo.c
diff options
context:
space:
mode:
Diffstat (limited to 'release/src/linux/linux/net/sched/sch_fifo.c')
-rw-r--r--release/src/linux/linux/net/sched/sch_fifo.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/release/src/linux/linux/net/sched/sch_fifo.c b/release/src/linux/linux/net/sched/sch_fifo.c
index d8ce46f2..3a7741e9 100644
--- a/release/src/linux/linux/net/sched/sch_fifo.c
+++ b/release/src/linux/linux/net/sched/sch_fifo.c
@@ -46,7 +46,7 @@ bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{
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);
sch->stats.backlog += skb->len;
sch->stats.bytes += skb->len;
@@ -87,9 +87,10 @@ fifo_drop(struct Qdisc* sch)
skb = __skb_dequeue_tail(&sch->q);
if (skb) {
- sch->stats.backlog -= skb->len;
+ int len = skb->len;
+ sch->stats.backlog -= len;
kfree_skb(skb);
- return 1;
+ return len;
}
return 0;
}
@@ -106,7 +107,7 @@ pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{
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);
sch->stats.bytes += skb->len;
sch->stats.packets++;
@@ -139,10 +140,12 @@ static int fifo_init(struct Qdisc *sch, struct rtattr *opt)
struct fifo_sched_data *q = (void*)sch->data;
if (opt == NULL) {
+ unsigned int limit = sch->dev->tx_queue_len ? : 1;
+
if (sch->ops == &bfifo_qdisc_ops)
- q->limit = sch->dev->tx_queue_len*sch->dev->mtu;
+ q->limit = limit*sch->dev->mtu;
else
- q->limit = sch->dev->tx_queue_len;
+ q->limit = limit;
} else {
struct tc_fifo_qopt *ctl = RTA_DATA(opt);
if (opt->rta_len < RTA_LENGTH(sizeof(*ctl)))