提交 aaae3013 编写于 作者: T Thomas Graf 提交者: David S. Miller

[PKT_SCHED]: Transform fifo qdisc to use generic queue management interface

The simplicity of the fifo qdisc allows several qdisc operations to be
redirected to the relevant queue management function directly. Saves
a lot of code lines and gives the pfifo a byte based backlog.
Signed-off-by: NThomas Graf <tgraf@suug.ch>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 9972b25d
...@@ -47,61 +47,10 @@ bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch) ...@@ -47,61 +47,10 @@ bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{ {
struct fifo_sched_data *q = qdisc_priv(sch); struct fifo_sched_data *q = qdisc_priv(sch);
if (sch->qstats.backlog + skb->len <= q->limit) { if (likely(sch->qstats.backlog + skb->len <= q->limit))
__skb_queue_tail(&sch->q, skb); return qdisc_enqueue_tail(skb, sch);
sch->qstats.backlog += skb->len;
sch->bstats.bytes += skb->len;
sch->bstats.packets++;
return 0;
}
sch->qstats.drops++;
#ifdef CONFIG_NET_CLS_POLICE
if (sch->reshape_fail==NULL || sch->reshape_fail(skb, sch))
#endif
kfree_skb(skb);
return NET_XMIT_DROP;
}
static int
bfifo_requeue(struct sk_buff *skb, struct Qdisc* sch)
{
__skb_queue_head(&sch->q, skb);
sch->qstats.backlog += skb->len;
sch->qstats.requeues++;
return 0;
}
static struct sk_buff *
bfifo_dequeue(struct Qdisc* sch)
{
struct sk_buff *skb;
skb = __skb_dequeue(&sch->q);
if (skb)
sch->qstats.backlog -= skb->len;
return skb;
}
static unsigned int
fifo_drop(struct Qdisc* sch)
{
struct sk_buff *skb;
skb = __skb_dequeue_tail(&sch->q);
if (skb) {
unsigned int len = skb->len;
sch->qstats.backlog -= len;
kfree_skb(skb);
return len;
}
return 0;
}
static void return qdisc_reshape_fail(skb, sch);
fifo_reset(struct Qdisc* sch)
{
skb_queue_purge(&sch->q);
sch->qstats.backlog = 0;
} }
static int static int
...@@ -109,33 +58,10 @@ pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch) ...@@ -109,33 +58,10 @@ pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{ {
struct fifo_sched_data *q = qdisc_priv(sch); struct fifo_sched_data *q = qdisc_priv(sch);
if (sch->q.qlen < q->limit) { if (likely(skb_queue_len(&sch->q) < q->limit))
__skb_queue_tail(&sch->q, skb); return qdisc_enqueue_tail(skb, sch);
sch->bstats.bytes += skb->len;
sch->bstats.packets++;
return 0;
}
sch->qstats.drops++;
#ifdef CONFIG_NET_CLS_POLICE
if (sch->reshape_fail==NULL || sch->reshape_fail(skb, sch))
#endif
kfree_skb(skb);
return NET_XMIT_DROP;
}
static int return qdisc_reshape_fail(skb, sch);
pfifo_requeue(struct sk_buff *skb, struct Qdisc* sch)
{
__skb_queue_head(&sch->q, skb);
sch->qstats.requeues++;
return 0;
}
static struct sk_buff *
pfifo_dequeue(struct Qdisc* sch)
{
return __skb_dequeue(&sch->q);
} }
static int fifo_init(struct Qdisc *sch, struct rtattr *opt) static int fifo_init(struct Qdisc *sch, struct rtattr *opt)
...@@ -180,11 +106,11 @@ struct Qdisc_ops pfifo_qdisc_ops = { ...@@ -180,11 +106,11 @@ struct Qdisc_ops pfifo_qdisc_ops = {
.id = "pfifo", .id = "pfifo",
.priv_size = sizeof(struct fifo_sched_data), .priv_size = sizeof(struct fifo_sched_data),
.enqueue = pfifo_enqueue, .enqueue = pfifo_enqueue,
.dequeue = pfifo_dequeue, .dequeue = qdisc_dequeue_head,
.requeue = pfifo_requeue, .requeue = qdisc_requeue,
.drop = fifo_drop, .drop = qdisc_queue_drop,
.init = fifo_init, .init = fifo_init,
.reset = fifo_reset, .reset = qdisc_reset_queue,
.destroy = NULL, .destroy = NULL,
.change = fifo_init, .change = fifo_init,
.dump = fifo_dump, .dump = fifo_dump,
...@@ -197,11 +123,11 @@ struct Qdisc_ops bfifo_qdisc_ops = { ...@@ -197,11 +123,11 @@ struct Qdisc_ops bfifo_qdisc_ops = {
.id = "bfifo", .id = "bfifo",
.priv_size = sizeof(struct fifo_sched_data), .priv_size = sizeof(struct fifo_sched_data),
.enqueue = bfifo_enqueue, .enqueue = bfifo_enqueue,
.dequeue = bfifo_dequeue, .dequeue = qdisc_dequeue_head,
.requeue = bfifo_requeue, .requeue = qdisc_requeue,
.drop = fifo_drop, .drop = qdisc_queue_drop,
.init = fifo_init, .init = fifo_init,
.reset = fifo_reset, .reset = qdisc_reset_queue,
.destroy = NULL, .destroy = NULL,
.change = fifo_init, .change = fifo_init,
.dump = fifo_dump, .dump = fifo_dump,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册