Commit a135e598 authored by Hiroaki SHIMODA's avatar Hiroaki SHIMODA Committed by David S. Miller

sch_tbf: Remove holes in struct tbf_sched_data.

On x86_64 we have 3 holes in struct tbf_sched_data.

The member peak_present can be replaced with peak.rate_bytes_ps,
because peak.rate_bytes_ps is set only when peak is specified in
tbf_change(). tbf_peak_present() is introduced to test
peak.rate_bytes_ps.

The member max_size is moved to fill 32bit hole.
Signed-off-by: default avatarHiroaki SHIMODA <shimoda.hiroaki@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 677676cd
...@@ -101,12 +101,11 @@ ...@@ -101,12 +101,11 @@
struct tbf_sched_data { struct tbf_sched_data {
/* Parameters */ /* Parameters */
u32 limit; /* Maximal length of backlog: bytes */ u32 limit; /* Maximal length of backlog: bytes */
u32 max_size;
s64 buffer; /* Token bucket depth/rate: MUST BE >= MTU/B */ s64 buffer; /* Token bucket depth/rate: MUST BE >= MTU/B */
s64 mtu; s64 mtu;
u32 max_size;
struct psched_ratecfg rate; struct psched_ratecfg rate;
struct psched_ratecfg peak; struct psched_ratecfg peak;
bool peak_present;
/* Variables */ /* Variables */
s64 tokens; /* Current number of B tokens */ s64 tokens; /* Current number of B tokens */
...@@ -222,6 +221,11 @@ static unsigned int tbf_drop(struct Qdisc *sch) ...@@ -222,6 +221,11 @@ static unsigned int tbf_drop(struct Qdisc *sch)
return len; return len;
} }
static bool tbf_peak_present(const struct tbf_sched_data *q)
{
return q->peak.rate_bytes_ps;
}
static struct sk_buff *tbf_dequeue(struct Qdisc *sch) static struct sk_buff *tbf_dequeue(struct Qdisc *sch)
{ {
struct tbf_sched_data *q = qdisc_priv(sch); struct tbf_sched_data *q = qdisc_priv(sch);
...@@ -238,7 +242,7 @@ static struct sk_buff *tbf_dequeue(struct Qdisc *sch) ...@@ -238,7 +242,7 @@ static struct sk_buff *tbf_dequeue(struct Qdisc *sch)
now = ktime_to_ns(ktime_get()); now = ktime_to_ns(ktime_get());
toks = min_t(s64, now - q->t_c, q->buffer); toks = min_t(s64, now - q->t_c, q->buffer);
if (q->peak_present) { if (tbf_peak_present(q)) {
ptoks = toks + q->ptokens; ptoks = toks + q->ptokens;
if (ptoks > q->mtu) if (ptoks > q->mtu)
ptoks = q->mtu; ptoks = q->mtu;
...@@ -378,6 +382,8 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) ...@@ -378,6 +382,8 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt)
} else { } else {
max_size = min_t(u64, max_size, psched_ns_t2l(&peak, mtu)); max_size = min_t(u64, max_size, psched_ns_t2l(&peak, mtu));
} }
} else {
memset(&peak, 0, sizeof(peak));
} }
if (max_size < psched_mtu(qdisc_dev(sch))) if (max_size < psched_mtu(qdisc_dev(sch)))
...@@ -410,12 +416,7 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) ...@@ -410,12 +416,7 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt)
q->ptokens = q->mtu; q->ptokens = q->mtu;
memcpy(&q->rate, &rate, sizeof(struct psched_ratecfg)); memcpy(&q->rate, &rate, sizeof(struct psched_ratecfg));
if (qopt->peakrate.rate) {
memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg)); memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg));
q->peak_present = true;
} else {
q->peak_present = false;
}
sch_tree_unlock(sch); sch_tree_unlock(sch);
err = 0; err = 0;
...@@ -458,7 +459,7 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb) ...@@ -458,7 +459,7 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
opt.limit = q->limit; opt.limit = q->limit;
psched_ratecfg_getrate(&opt.rate, &q->rate); psched_ratecfg_getrate(&opt.rate, &q->rate);
if (q->peak_present) if (tbf_peak_present(q))
psched_ratecfg_getrate(&opt.peakrate, &q->peak); psched_ratecfg_getrate(&opt.peakrate, &q->peak);
else else
memset(&opt.peakrate, 0, sizeof(opt.peakrate)); memset(&opt.peakrate, 0, sizeof(opt.peakrate));
...@@ -469,7 +470,7 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb) ...@@ -469,7 +470,7 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
if (q->rate.rate_bytes_ps >= (1ULL << 32) && if (q->rate.rate_bytes_ps >= (1ULL << 32) &&
nla_put_u64(skb, TCA_TBF_RATE64, q->rate.rate_bytes_ps)) nla_put_u64(skb, TCA_TBF_RATE64, q->rate.rate_bytes_ps))
goto nla_put_failure; goto nla_put_failure;
if (q->peak_present && if (tbf_peak_present(q) &&
q->peak.rate_bytes_ps >= (1ULL << 32) && q->peak.rate_bytes_ps >= (1ULL << 32) &&
nla_put_u64(skb, TCA_TBF_PRATE64, q->peak.rate_bytes_ps)) nla_put_u64(skb, TCA_TBF_PRATE64, q->peak.rate_bytes_ps))
goto nla_put_failure; goto nla_put_failure;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment