sch_tbf: Remove holes in struct tbf_sched_data.
authorHiroaki SHIMODA <shimoda.hiroaki@gmail.com>
Sun, 2 Mar 2014 08:30:26 +0000 (17:30 +0900)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Mar 2014 20:43:47 +0000 (15:43 -0500)
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: Hiroaki SHIMODA <shimoda.hiroaki@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_tbf.c

index 1cb413fead89522a64931a4e2472b39c4d6a720d..0893161b0262d217d4917198df4bfc3d61839346 100644 (file)
 struct tbf_sched_data {
 /* Parameters */
        u32             limit;          /* Maximal length of backlog: bytes */
+       u32             max_size;
        s64             buffer;         /* Token bucket depth/rate: MUST BE >= MTU/B */
        s64             mtu;
-       u32             max_size;
        struct psched_ratecfg rate;
        struct psched_ratecfg peak;
-       bool peak_present;
 
 /* Variables */
        s64     tokens;                 /* Current number of B tokens */
@@ -222,6 +221,11 @@ static unsigned int tbf_drop(struct Qdisc *sch)
        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)
 {
        struct tbf_sched_data *q = qdisc_priv(sch);
@@ -238,7 +242,7 @@ static struct sk_buff *tbf_dequeue(struct Qdisc *sch)
                now = ktime_to_ns(ktime_get());
                toks = min_t(s64, now - q->t_c, q->buffer);
 
-               if (q->peak_present) {
+               if (tbf_peak_present(q)) {
                        ptoks = toks + q->ptokens;
                        if (ptoks > q->mtu)
                                ptoks = q->mtu;
@@ -378,6 +382,8 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt)
                } else {
                        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)))
@@ -410,12 +416,7 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt)
        q->ptokens = q->mtu;
 
        memcpy(&q->rate, &rate, sizeof(struct psched_ratecfg));
-       if (qopt->peakrate.rate) {
-               memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg));
-               q->peak_present = true;
-       } else {
-               q->peak_present = false;
-       }
+       memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg));
 
        sch_tree_unlock(sch);
        err = 0;
@@ -458,7 +459,7 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
 
        opt.limit = q->limit;
        psched_ratecfg_getrate(&opt.rate, &q->rate);
-       if (q->peak_present)
+       if (tbf_peak_present(q))
                psched_ratecfg_getrate(&opt.peakrate, &q->peak);
        else
                memset(&opt.peakrate, 0, sizeof(opt.peakrate));
@@ -469,7 +470,7 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
        if (q->rate.rate_bytes_ps >= (1ULL << 32) &&
            nla_put_u64(skb, TCA_TBF_RATE64, q->rate.rate_bytes_ps))
                goto nla_put_failure;
-       if (q->peak_present &&
+       if (tbf_peak_present(q) &&
            q->peak.rate_bytes_ps >= (1ULL << 32) &&
            nla_put_u64(skb, TCA_TBF_PRATE64, q->peak.rate_bytes_ps))
                goto nla_put_failure;