aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_fifo.c
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2005-06-19 01:57:42 -0400
committerDavid S. Miller <davem@davemloft.net>2005-06-19 01:57:42 -0400
commitaaae3013d186d71a01e1059c9633c4ec8729d891 (patch)
tree533e5512f5f8497ae293db9bd828a771e957fd8a /net/sched/sch_fifo.c
parent9972b25d0c6e7f8f893eb3444dea37b42b1201de (diff)
[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: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_fifo.c')
-rw-r--r--net/sched/sch_fifo.c102
1 files changed, 14 insertions, 88 deletions
diff --git a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c
index 4888305c96da..83a4db4d3cdc 100644
--- a/net/sched/sch_fifo.c
+++ b/net/sched/sch_fifo.c
@@ -47,61 +47,10 @@ bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
47{ 47{
48 struct fifo_sched_data *q = qdisc_priv(sch); 48 struct fifo_sched_data *q = qdisc_priv(sch);
49 49
50 if (sch->qstats.backlog + skb->len <= q->limit) { 50 if (likely(sch->qstats.backlog + skb->len <= q->limit))
51 __skb_queue_tail(&sch->q, skb); 51 return qdisc_enqueue_tail(skb, sch);
52 sch->qstats.backlog += skb->len;
53 sch->bstats.bytes += skb->len;
54 sch->bstats.packets++;
55 return 0;
56 }
57 sch->qstats.drops++;
58#ifdef CONFIG_NET_CLS_POLICE
59 if (sch->reshape_fail==NULL || sch->reshape_fail(skb, sch))
60#endif
61 kfree_skb(skb);
62 return NET_XMIT_DROP;
63}
64
65static int
66bfifo_requeue(struct sk_buff *skb, struct Qdisc* sch)
67{
68 __skb_queue_head(&sch->q, skb);
69 sch->qstats.backlog += skb->len;
70 sch->qstats.requeues++;
71 return 0;
72}
73
74static struct sk_buff *
75bfifo_dequeue(struct Qdisc* sch)
76{
77 struct sk_buff *skb;
78
79 skb = __skb_dequeue(&sch->q);
80 if (skb)
81 sch->qstats.backlog -= skb->len;
82 return skb;
83}
84
85static unsigned int
86fifo_drop(struct Qdisc* sch)
87{
88 struct sk_buff *skb;
89
90 skb = __skb_dequeue_tail(&sch->q);
91 if (skb) {
92 unsigned int len = skb->len;
93 sch->qstats.backlog -= len;
94 kfree_skb(skb);
95 return len;
96 }
97 return 0;
98}
99 52
100static void 53 return qdisc_reshape_fail(skb, sch);
101fifo_reset(struct Qdisc* sch)
102{
103 skb_queue_purge(&sch->q);
104 sch->qstats.backlog = 0;
105} 54}
106 55
107static int 56static int
@@ -109,33 +58,10 @@ pfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
109{ 58{
110 struct fifo_sched_data *q = qdisc_priv(sch); 59 struct fifo_sched_data *q = qdisc_priv(sch);
111 60
112 if (sch->q.qlen < q->limit) { 61 if (likely(skb_queue_len(&sch->q) < q->limit))
113 __skb_queue_tail(&sch->q, skb); 62 return qdisc_enqueue_tail(skb, sch);
114 sch->bstats.bytes += skb->len;
115 sch->bstats.packets++;
116 return 0;
117 }
118 sch->qstats.drops++;
119#ifdef CONFIG_NET_CLS_POLICE
120 if (sch->reshape_fail==NULL || sch->reshape_fail(skb, sch))
121#endif
122 kfree_skb(skb);
123 return NET_XMIT_DROP;
124}
125 63
126static int 64 return qdisc_reshape_fail(skb, sch);
127pfifo_requeue(struct sk_buff *skb, struct Qdisc* sch)
128{
129 __skb_queue_head(&sch->q, skb);
130 sch->qstats.requeues++;
131 return 0;
132}
133
134
135static struct sk_buff *
136pfifo_dequeue(struct Qdisc* sch)
137{
138 return __skb_dequeue(&sch->q);
139} 65}
140 66
141static int fifo_init(struct Qdisc *sch, struct rtattr *opt) 67static int fifo_init(struct Qdisc *sch, struct rtattr *opt)
@@ -180,11 +106,11 @@ struct Qdisc_ops pfifo_qdisc_ops = {
180 .id = "pfifo", 106 .id = "pfifo",
181 .priv_size = sizeof(struct fifo_sched_data), 107 .priv_size = sizeof(struct fifo_sched_data),
182 .enqueue = pfifo_enqueue, 108 .enqueue = pfifo_enqueue,
183 .dequeue = pfifo_dequeue, 109 .dequeue = qdisc_dequeue_head,
184 .requeue = pfifo_requeue, 110 .requeue = qdisc_requeue,
185 .drop = fifo_drop, 111 .drop = qdisc_queue_drop,
186 .init = fifo_init, 112 .init = fifo_init,
187 .reset = fifo_reset, 113 .reset = qdisc_reset_queue,
188 .destroy = NULL, 114 .destroy = NULL,
189 .change = fifo_init, 115 .change = fifo_init,
190 .dump = fifo_dump, 116 .dump = fifo_dump,
@@ -197,11 +123,11 @@ struct Qdisc_ops bfifo_qdisc_ops = {
197 .id = "bfifo", 123 .id = "bfifo",
198 .priv_size = sizeof(struct fifo_sched_data), 124 .priv_size = sizeof(struct fifo_sched_data),
199 .enqueue = bfifo_enqueue, 125 .enqueue = bfifo_enqueue,
200 .dequeue = bfifo_dequeue, 126 .dequeue = qdisc_dequeue_head,
201 .requeue = bfifo_requeue, 127 .requeue = qdisc_requeue,
202 .drop = fifo_drop, 128 .drop = qdisc_queue_drop,
203 .init = fifo_init, 129 .init = fifo_init,
204 .reset = fifo_reset, 130 .reset = qdisc_reset_queue,
205 .destroy = NULL, 131 .destroy = NULL,
206 .change = fifo_init, 132 .change = fifo_init,
207 .dump = fifo_dump, 133 .dump = fifo_dump,