Skip to content

Commit

Permalink
net_sched: Add accessor function for packet length for qdiscs
Browse files Browse the repository at this point in the history
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jussi Kivilinna authored and David S. Miller committed Jul 20, 2008
1 parent 5f86173 commit 0abf77e
Show file tree
Hide file tree
Showing 22 changed files with 69 additions and 67 deletions.
17 changes: 11 additions & 6 deletions include/net/sch_generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,11 @@ static inline bool qdisc_tx_is_noop(const struct net_device *dev)
return true;
}

static inline unsigned int qdisc_pkt_len(struct sk_buff *skb)
{
return skb->len;
}

static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
{
return sch->enqueue(skb, sch);
Expand All @@ -320,8 +325,8 @@ static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch,
struct sk_buff_head *list)
{
__skb_queue_tail(list, skb);
sch->qstats.backlog += skb->len;
sch->bstats.bytes += skb->len;
sch->qstats.backlog += qdisc_pkt_len(skb);
sch->bstats.bytes += qdisc_pkt_len(skb);
sch->bstats.packets++;

return NET_XMIT_SUCCESS;
Expand All @@ -338,7 +343,7 @@ static inline struct sk_buff *__qdisc_dequeue_head(struct Qdisc *sch,
struct sk_buff *skb = __skb_dequeue(list);

if (likely(skb != NULL))
sch->qstats.backlog -= skb->len;
sch->qstats.backlog -= qdisc_pkt_len(skb);

return skb;
}
Expand All @@ -354,7 +359,7 @@ static inline struct sk_buff *__qdisc_dequeue_tail(struct Qdisc *sch,
struct sk_buff *skb = __skb_dequeue_tail(list);

if (likely(skb != NULL))
sch->qstats.backlog -= skb->len;
sch->qstats.backlog -= qdisc_pkt_len(skb);

return skb;
}
Expand All @@ -368,7 +373,7 @@ static inline int __qdisc_requeue(struct sk_buff *skb, struct Qdisc *sch,
struct sk_buff_head *list)
{
__skb_queue_head(list, skb);
sch->qstats.backlog += skb->len;
sch->qstats.backlog += qdisc_pkt_len(skb);
sch->qstats.requeues++;

return NET_XMIT_SUCCESS;
Expand Down Expand Up @@ -401,7 +406,7 @@ static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch,
struct sk_buff *skb = __qdisc_dequeue_tail(sch, list);

if (likely(skb != NULL)) {
unsigned int len = skb->len;
unsigned int len = qdisc_pkt_len(skb);
kfree_skb(skb);
return len;
}
Expand Down
2 changes: 1 addition & 1 deletion net/sched/act_gact.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ static int tcf_gact(struct sk_buff *skb, struct tc_action *a, struct tcf_result
#else
action = gact->tcf_action;
#endif
gact->tcf_bstats.bytes += skb->len;
gact->tcf_bstats.bytes += qdisc_pkt_len(skb);
gact->tcf_bstats.packets++;
if (action == TC_ACT_SHOT)
gact->tcf_qstats.drops++;
Expand Down
2 changes: 1 addition & 1 deletion net/sched/act_ipt.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ static int tcf_ipt(struct sk_buff *skb, struct tc_action *a,
spin_lock(&ipt->tcf_lock);

ipt->tcf_tm.lastuse = jiffies;
ipt->tcf_bstats.bytes += skb->len;
ipt->tcf_bstats.bytes += qdisc_pkt_len(skb);
ipt->tcf_bstats.packets++;

/* yes, we have to worry about both in and out dev
Expand Down
4 changes: 2 additions & 2 deletions net/sched/act_mirred.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ static int tcf_mirred(struct sk_buff *skb, struct tc_action *a,
if (skb2 != NULL)
kfree_skb(skb2);
m->tcf_qstats.overlimits++;
m->tcf_bstats.bytes += skb->len;
m->tcf_bstats.bytes += qdisc_pkt_len(skb);
m->tcf_bstats.packets++;
spin_unlock(&m->tcf_lock);
/* should we be asking for packet to be dropped?
Expand All @@ -184,7 +184,7 @@ static int tcf_mirred(struct sk_buff *skb, struct tc_action *a,
goto bad_mirred;
}

m->tcf_bstats.bytes += skb2->len;
m->tcf_bstats.bytes += qdisc_pkt_len(skb2);
m->tcf_bstats.packets++;
if (!(at & AT_EGRESS))
if (m->tcfm_ok_push)
Expand Down
2 changes: 1 addition & 1 deletion net/sched/act_nat.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a,
egress = p->flags & TCA_NAT_FLAG_EGRESS;
action = p->tcf_action;

p->tcf_bstats.bytes += skb->len;
p->tcf_bstats.bytes += qdisc_pkt_len(skb);
p->tcf_bstats.packets++;

spin_unlock(&p->tcf_lock);
Expand Down
2 changes: 1 addition & 1 deletion net/sched/act_pedit.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a,
bad:
p->tcf_qstats.overlimits++;
done:
p->tcf_bstats.bytes += skb->len;
p->tcf_bstats.bytes += qdisc_pkt_len(skb);
p->tcf_bstats.packets++;
spin_unlock(&p->tcf_lock);
return p->tcf_action;
Expand Down
8 changes: 4 additions & 4 deletions net/sched/act_police.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ static int tcf_act_police(struct sk_buff *skb, struct tc_action *a,

spin_lock(&police->tcf_lock);

police->tcf_bstats.bytes += skb->len;
police->tcf_bstats.bytes += qdisc_pkt_len(skb);
police->tcf_bstats.packets++;

if (police->tcfp_ewma_rate &&
Expand All @@ -282,7 +282,7 @@ static int tcf_act_police(struct sk_buff *skb, struct tc_action *a,
return police->tcf_action;
}

if (skb->len <= police->tcfp_mtu) {
if (qdisc_pkt_len(skb) <= police->tcfp_mtu) {
if (police->tcfp_R_tab == NULL) {
spin_unlock(&police->tcf_lock);
return police->tcfp_result;
Expand All @@ -295,12 +295,12 @@ static int tcf_act_police(struct sk_buff *skb, struct tc_action *a,
ptoks = toks + police->tcfp_ptoks;
if (ptoks > (long)L2T_P(police, police->tcfp_mtu))
ptoks = (long)L2T_P(police, police->tcfp_mtu);
ptoks -= L2T_P(police, skb->len);
ptoks -= L2T_P(police, qdisc_pkt_len(skb));
}
toks += police->tcfp_toks;
if (toks > (long)police->tcfp_burst)
toks = police->tcfp_burst;
toks -= L2T(police, skb->len);
toks -= L2T(police, qdisc_pkt_len(skb));
if ((toks|ptoks) >= 0) {
police->tcfp_t_c = now;
police->tcfp_toks = toks;
Expand Down
2 changes: 1 addition & 1 deletion net/sched/act_simple.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ static int tcf_simp(struct sk_buff *skb, struct tc_action *a, struct tcf_result

spin_lock(&d->tcf_lock);
d->tcf_tm.lastuse = jiffies;
d->tcf_bstats.bytes += skb->len;
d->tcf_bstats.bytes += qdisc_pkt_len(skb);
d->tcf_bstats.packets++;

/* print policy string followed by _ then packet count
Expand Down
4 changes: 2 additions & 2 deletions net/sched/sch_atm.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,9 +437,9 @@ drop: __maybe_unused
flow->qstats.drops++;
return ret;
}
sch->bstats.bytes += skb->len;
sch->bstats.bytes += qdisc_pkt_len(skb);
sch->bstats.packets++;
flow->bstats.bytes += skb->len;
flow->bstats.bytes += qdisc_pkt_len(skb);
flow->bstats.packets++;
/*
* Okay, this may seem weird. We pretend we've dropped the packet if
Expand Down
14 changes: 6 additions & 8 deletions net/sched/sch_cbq.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,6 @@ static int
cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
{
struct cbq_sched_data *q = qdisc_priv(sch);
int len = skb->len;
int uninitialized_var(ret);
struct cbq_class *cl = cbq_classify(skb, sch, &ret);

Expand All @@ -391,7 +390,7 @@ cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
if (ret == NET_XMIT_SUCCESS) {
sch->q.qlen++;
sch->bstats.packets++;
sch->bstats.bytes+=len;
sch->bstats.bytes += qdisc_pkt_len(skb);
cbq_mark_toplevel(q, cl);
if (!cl->next_alive)
cbq_activate_class(cl);
Expand Down Expand Up @@ -658,7 +657,6 @@ static enum hrtimer_restart cbq_undelay(struct hrtimer *timer)
#ifdef CONFIG_NET_CLS_ACT
static int cbq_reshape_fail(struct sk_buff *skb, struct Qdisc *child)
{
int len = skb->len;
struct Qdisc *sch = child->__parent;
struct cbq_sched_data *q = qdisc_priv(sch);
struct cbq_class *cl = q->rx_class;
Expand All @@ -675,7 +673,7 @@ static int cbq_reshape_fail(struct sk_buff *skb, struct Qdisc *child)
if (qdisc_enqueue(skb, cl->q) == 0) {
sch->q.qlen++;
sch->bstats.packets++;
sch->bstats.bytes+=len;
sch->bstats.bytes += qdisc_pkt_len(skb);
if (!cl->next_alive)
cbq_activate_class(cl);
return 0;
Expand Down Expand Up @@ -881,19 +879,19 @@ cbq_dequeue_prio(struct Qdisc *sch, int prio)
if (skb == NULL)
goto skip_class;

cl->deficit -= skb->len;
cl->deficit -= qdisc_pkt_len(skb);
q->tx_class = cl;
q->tx_borrowed = borrow;
if (borrow != cl) {
#ifndef CBQ_XSTATS_BORROWS_BYTES
borrow->xstats.borrows++;
cl->xstats.borrows++;
#else
borrow->xstats.borrows += skb->len;
cl->xstats.borrows += skb->len;
borrow->xstats.borrows += qdisc_pkt_len(skb);
cl->xstats.borrows += qdisc_pkt_len(skb);
#endif
}
q->tx_len = skb->len;
q->tx_len = qdisc_pkt_len(skb);

if (cl->deficit <= 0) {
q->active[prio] = cl;
Expand Down
2 changes: 1 addition & 1 deletion net/sched/sch_dsmark.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch)
return err;
}

sch->bstats.bytes += skb->len;
sch->bstats.bytes += qdisc_pkt_len(skb);
sch->bstats.packets++;
sch->q.qlen++;

Expand Down
2 changes: 1 addition & 1 deletion net/sched/sch_fifo.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ static int bfifo_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{
struct fifo_sched_data *q = qdisc_priv(sch);

if (likely(sch->qstats.backlog + skb->len <= q->limit))
if (likely(sch->qstats.backlog + qdisc_pkt_len(skb) <= q->limit))
return qdisc_enqueue_tail(skb, sch);

return qdisc_reshape_fail(skb, sch);
Expand Down
12 changes: 6 additions & 6 deletions net/sched/sch_gred.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
}

q->packetsin++;
q->bytesin += skb->len;
q->bytesin += qdisc_pkt_len(skb);

if (gred_wred_mode(t))
gred_load_wred_set(t, q);
Expand Down Expand Up @@ -226,8 +226,8 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
break;
}

if (q->backlog + skb->len <= q->limit) {
q->backlog += skb->len;
if (q->backlog + qdisc_pkt_len(skb) <= q->limit) {
q->backlog += qdisc_pkt_len(skb);
return qdisc_enqueue_tail(skb, sch);
}

Expand All @@ -254,7 +254,7 @@ static int gred_requeue(struct sk_buff *skb, struct Qdisc* sch)
} else {
if (red_is_idling(&q->parms))
red_end_of_idle_period(&q->parms);
q->backlog += skb->len;
q->backlog += qdisc_pkt_len(skb);
}

return qdisc_requeue(skb, sch);
Expand All @@ -277,7 +277,7 @@ static struct sk_buff *gred_dequeue(struct Qdisc* sch)
"VQ 0x%x after dequeue, screwing up "
"backlog.\n", tc_index_to_dp(skb));
} else {
q->backlog -= skb->len;
q->backlog -= qdisc_pkt_len(skb);

if (!q->backlog && !gred_wred_mode(t))
red_start_of_idle_period(&q->parms);
Expand All @@ -299,7 +299,7 @@ static unsigned int gred_drop(struct Qdisc* sch)

skb = qdisc_dequeue_tail(sch);
if (skb) {
unsigned int len = skb->len;
unsigned int len = qdisc_pkt_len(skb);
struct gred_sched_data *q;
u16 dp = tc_index_to_dp(skb);

Expand Down
14 changes: 6 additions & 8 deletions net/sched/sch_hfsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -895,7 +895,7 @@ qdisc_peek_len(struct Qdisc *sch)
printk("qdisc_peek_len: non work-conserving qdisc ?\n");
return 0;
}
len = skb->len;
len = qdisc_pkt_len(skb);
if (unlikely(sch->ops->requeue(skb, sch) != NET_XMIT_SUCCESS)) {
if (net_ratelimit())
printk("qdisc_peek_len: failed to requeue\n");
Expand Down Expand Up @@ -1574,7 +1574,6 @@ static int
hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
{
struct hfsc_class *cl;
unsigned int len;
int err;

cl = hfsc_classify(skb, sch, &err);
Expand All @@ -1585,7 +1584,6 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
return err;
}

len = skb->len;
err = qdisc_enqueue(skb, cl->qdisc);
if (unlikely(err != NET_XMIT_SUCCESS)) {
cl->qstats.drops++;
Expand All @@ -1594,12 +1592,12 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
}

if (cl->qdisc->q.qlen == 1)
set_active(cl, len);
set_active(cl, qdisc_pkt_len(skb));

cl->bstats.packets++;
cl->bstats.bytes += len;
cl->bstats.bytes += qdisc_pkt_len(skb);
sch->bstats.packets++;
sch->bstats.bytes += len;
sch->bstats.bytes += qdisc_pkt_len(skb);
sch->q.qlen++;

return NET_XMIT_SUCCESS;
Expand Down Expand Up @@ -1649,9 +1647,9 @@ hfsc_dequeue(struct Qdisc *sch)
return NULL;
}

update_vf(cl, skb->len, cur_time);
update_vf(cl, qdisc_pkt_len(skb), cur_time);
if (realtime)
cl->cl_cumul += skb->len;
cl->cl_cumul += qdisc_pkt_len(skb);

if (cl->qdisc->q.qlen != 0) {
if (cl->cl_flags & HFSC_RSC) {
Expand Down
9 changes: 5 additions & 4 deletions net/sched/sch_htb.c
Original file line number Diff line number Diff line change
Expand Up @@ -579,13 +579,13 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
} else {
cl->bstats.packets +=
skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1;
cl->bstats.bytes += skb->len;
cl->bstats.bytes += qdisc_pkt_len(skb);
htb_activate(q, cl);
}

sch->q.qlen++;
sch->bstats.packets += skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1;
sch->bstats.bytes += skb->len;
sch->bstats.bytes += qdisc_pkt_len(skb);
return NET_XMIT_SUCCESS;
}

Expand Down Expand Up @@ -642,7 +642,7 @@ static int htb_requeue(struct sk_buff *skb, struct Qdisc *sch)
static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,
int level, struct sk_buff *skb)
{
int bytes = skb->len;
int bytes = qdisc_pkt_len(skb);
long toks, diff;
enum htb_cmode old_mode;

Expand Down Expand Up @@ -855,7 +855,8 @@ static struct sk_buff *htb_dequeue_tree(struct htb_sched *q, int prio,
} while (cl != start);

if (likely(skb != NULL)) {
if ((cl->un.leaf.deficit[level] -= skb->len) < 0) {
cl->un.leaf.deficit[level] -= qdisc_pkt_len(skb);
if (cl->un.leaf.deficit[level] < 0) {
cl->un.leaf.deficit[level] += cl->un.leaf.quantum;
htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
ptr[0]) + prio);
Expand Down
2 changes: 1 addition & 1 deletion net/sched/sch_ingress.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ static int ingress_enqueue(struct sk_buff *skb, struct Qdisc *sch)
result = tc_classify(skb, p->filter_list, &res);

sch->bstats.packets++;
sch->bstats.bytes += skb->len;
sch->bstats.bytes += qdisc_pkt_len(skb);
switch (result) {
case TC_ACT_SHOT:
result = TC_ACT_SHOT;
Expand Down
Loading

0 comments on commit 0abf77e

Please sign in to comment.