mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 11:16:11 +00:00
pkt_sched: Add qdisc->ops->peek() implementation.
Add qdisc->ops->peek() implementation for work-conserving qdiscs. With feedback from Patrick McHardy. Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
99c0db2679
commit
8e3af97899
8 changed files with 69 additions and 0 deletions
|
@ -522,6 +522,15 @@ static struct sk_buff *atm_tc_dequeue(struct Qdisc *sch)
|
|||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *atm_tc_peek(struct Qdisc *sch)
|
||||
{
|
||||
struct atm_qdisc_data *p = qdisc_priv(sch);
|
||||
|
||||
pr_debug("atm_tc_peek(sch %p,[qdisc %p])\n", sch, p);
|
||||
|
||||
return p->link.q->ops->peek(p->link.q);
|
||||
}
|
||||
|
||||
static int atm_tc_requeue(struct sk_buff *skb, struct Qdisc *sch)
|
||||
{
|
||||
struct atm_qdisc_data *p = qdisc_priv(sch);
|
||||
|
@ -694,6 +703,7 @@ static struct Qdisc_ops atm_qdisc_ops __read_mostly = {
|
|||
.priv_size = sizeof(struct atm_qdisc_data),
|
||||
.enqueue = atm_tc_enqueue,
|
||||
.dequeue = atm_tc_dequeue,
|
||||
.peek = atm_tc_peek,
|
||||
.requeue = atm_tc_requeue,
|
||||
.drop = atm_tc_drop,
|
||||
.init = atm_tc_init,
|
||||
|
|
|
@ -33,6 +33,7 @@ static struct Qdisc_ops blackhole_qdisc_ops __read_mostly = {
|
|||
.priv_size = 0,
|
||||
.enqueue = blackhole_enqueue,
|
||||
.dequeue = blackhole_dequeue,
|
||||
.peek = blackhole_dequeue,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
|
|
|
@ -313,6 +313,15 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch)
|
|||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *dsmark_peek(struct Qdisc *sch)
|
||||
{
|
||||
struct dsmark_qdisc_data *p = qdisc_priv(sch);
|
||||
|
||||
pr_debug("dsmark_peek(sch %p,[qdisc %p])\n", sch, p);
|
||||
|
||||
return p->q->ops->peek(p->q);
|
||||
}
|
||||
|
||||
static int dsmark_requeue(struct sk_buff *skb, struct Qdisc *sch)
|
||||
{
|
||||
struct dsmark_qdisc_data *p = qdisc_priv(sch);
|
||||
|
@ -496,6 +505,7 @@ static struct Qdisc_ops dsmark_qdisc_ops __read_mostly = {
|
|||
.priv_size = sizeof(struct dsmark_qdisc_data),
|
||||
.enqueue = dsmark_enqueue,
|
||||
.dequeue = dsmark_dequeue,
|
||||
.peek = dsmark_peek,
|
||||
.requeue = dsmark_requeue,
|
||||
.drop = dsmark_drop,
|
||||
.init = dsmark_init,
|
||||
|
|
|
@ -602,6 +602,7 @@ static struct Qdisc_ops gred_qdisc_ops __read_mostly = {
|
|||
.priv_size = sizeof(struct gred_sched),
|
||||
.enqueue = gred_enqueue,
|
||||
.dequeue = gred_dequeue,
|
||||
.peek = qdisc_peek_head,
|
||||
.requeue = gred_requeue,
|
||||
.drop = gred_drop,
|
||||
.init = gred_init,
|
||||
|
|
|
@ -155,6 +155,34 @@ static struct sk_buff *multiq_dequeue(struct Qdisc *sch)
|
|||
|
||||
}
|
||||
|
||||
static struct sk_buff *multiq_peek(struct Qdisc *sch)
|
||||
{
|
||||
struct multiq_sched_data *q = qdisc_priv(sch);
|
||||
unsigned int curband = q->curband;
|
||||
struct Qdisc *qdisc;
|
||||
struct sk_buff *skb;
|
||||
int band;
|
||||
|
||||
for (band = 0; band < q->bands; band++) {
|
||||
/* cycle through bands to ensure fairness */
|
||||
curband++;
|
||||
if (curband >= q->bands)
|
||||
curband = 0;
|
||||
|
||||
/* Check that target subqueue is available before
|
||||
* pulling an skb to avoid excessive requeues
|
||||
*/
|
||||
if (!__netif_subqueue_stopped(qdisc_dev(sch), curband)) {
|
||||
qdisc = q->queues[curband];
|
||||
skb = qdisc->ops->peek(qdisc);
|
||||
if (skb)
|
||||
return skb;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
static unsigned int multiq_drop(struct Qdisc *sch)
|
||||
{
|
||||
struct multiq_sched_data *q = qdisc_priv(sch);
|
||||
|
@ -451,6 +479,7 @@ static struct Qdisc_ops multiq_qdisc_ops __read_mostly = {
|
|||
.priv_size = sizeof(struct multiq_sched_data),
|
||||
.enqueue = multiq_enqueue,
|
||||
.dequeue = multiq_dequeue,
|
||||
.peek = multiq_peek,
|
||||
.requeue = multiq_requeue,
|
||||
.drop = multiq_drop,
|
||||
.init = multiq_init,
|
||||
|
|
|
@ -541,6 +541,7 @@ static struct Qdisc_ops tfifo_qdisc_ops __read_mostly = {
|
|||
.priv_size = sizeof(struct fifo_sched_data),
|
||||
.enqueue = tfifo_enqueue,
|
||||
.dequeue = qdisc_dequeue_head,
|
||||
.peek = qdisc_peek_head,
|
||||
.requeue = qdisc_requeue,
|
||||
.drop = qdisc_queue_drop,
|
||||
.init = tfifo_init,
|
||||
|
|
|
@ -140,6 +140,14 @@ static struct sk_buff * red_dequeue(struct Qdisc* sch)
|
|||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff * red_peek(struct Qdisc* sch)
|
||||
{
|
||||
struct red_sched_data *q = qdisc_priv(sch);
|
||||
struct Qdisc *child = q->qdisc;
|
||||
|
||||
return child->ops->peek(child);
|
||||
}
|
||||
|
||||
static unsigned int red_drop(struct Qdisc* sch)
|
||||
{
|
||||
struct red_sched_data *q = qdisc_priv(sch);
|
||||
|
@ -361,6 +369,7 @@ static struct Qdisc_ops red_qdisc_ops __read_mostly = {
|
|||
.cl_ops = &red_class_ops,
|
||||
.enqueue = red_enqueue,
|
||||
.dequeue = red_dequeue,
|
||||
.peek = red_peek,
|
||||
.requeue = red_requeue,
|
||||
.drop = red_drop,
|
||||
.init = red_init,
|
||||
|
|
|
@ -123,6 +123,13 @@ teql_dequeue(struct Qdisc* sch)
|
|||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *
|
||||
teql_peek(struct Qdisc* sch)
|
||||
{
|
||||
/* teql is meant to be used as root qdisc */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static __inline__ void
|
||||
teql_neigh_release(struct neighbour *n)
|
||||
{
|
||||
|
@ -433,6 +440,7 @@ static __init void teql_master_setup(struct net_device *dev)
|
|||
|
||||
ops->enqueue = teql_enqueue;
|
||||
ops->dequeue = teql_dequeue;
|
||||
ops->peek = teql_peek;
|
||||
ops->requeue = teql_requeue;
|
||||
ops->init = teql_qdisc_init;
|
||||
ops->reset = teql_reset;
|
||||
|
|
Loading…
Reference in a new issue