net: sched: extend percpu stats helpers
authorEric Dumazet <edumazet@google.com>
Mon, 6 Jul 2015 12:18:03 +0000 (05:18 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Jul 2015 20:50:41 +0000 (13:50 -0700)
qdisc_bstats_update_cpu() and other helpers were added to support
percpu stats for qdisc.

We want to add percpu stats for tc action, so this patch add common
helpers.

qdisc_bstats_update_cpu() is renamed to qdisc_bstats_cpu_update()
qdisc_qstats_drop_cpu() is renamed to qdisc_qstats_cpu_drop()

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Acked-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sch_generic.h
net/core/dev.c

index 2738f6f8790836b1b88d5163e5ba297b0f4421c0..2eab08c38e3283efd696bfff4198a16ad27c1d16 100644 (file)
@@ -513,17 +513,20 @@ static inline void bstats_update(struct gnet_stats_basic_packed *bstats,
        bstats->packets += skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 1;
 }
 
-static inline void qdisc_bstats_update_cpu(struct Qdisc *sch,
-                                          const struct sk_buff *skb)
+static inline void bstats_cpu_update(struct gnet_stats_basic_cpu *bstats,
+                                    const struct sk_buff *skb)
 {
-       struct gnet_stats_basic_cpu *bstats =
-                               this_cpu_ptr(sch->cpu_bstats);
-
        u64_stats_update_begin(&bstats->syncp);
        bstats_update(&bstats->bstats, skb);
        u64_stats_update_end(&bstats->syncp);
 }
 
+static inline void qdisc_bstats_cpu_update(struct Qdisc *sch,
+                                          const struct sk_buff *skb)
+{
+       bstats_cpu_update(this_cpu_ptr(sch->cpu_bstats), skb);
+}
+
 static inline void qdisc_bstats_update(struct Qdisc *sch,
                                       const struct sk_buff *skb)
 {
@@ -547,16 +550,24 @@ static inline void __qdisc_qstats_drop(struct Qdisc *sch, int count)
        sch->qstats.drops += count;
 }
 
-static inline void qdisc_qstats_drop(struct Qdisc *sch)
+static inline void qstats_drop_inc(struct gnet_stats_queue *qstats)
 {
-       sch->qstats.drops++;
+       qstats->drops++;
 }
 
-static inline void qdisc_qstats_drop_cpu(struct Qdisc *sch)
+static inline void qstats_overlimit_inc(struct gnet_stats_queue *qstats)
 {
-       struct gnet_stats_queue *qstats = this_cpu_ptr(sch->cpu_qstats);
+       qstats->overlimits++;
+}
 
-       qstats->drops++;
+static inline void qdisc_qstats_drop(struct Qdisc *sch)
+{
+       qstats_drop_inc(&sch->qstats);
+}
+
+static inline void qdisc_qstats_cpu_drop(struct Qdisc *sch)
+{
+       qstats_drop_inc(this_cpu_ptr(sch->cpu_qstats));
 }
 
 static inline void qdisc_qstats_overlimit(struct Qdisc *sch)
index 6778a9999d525307d5bd41a1750a6e96a6e22bf3..e0d270143fc79cb61f7eba305e75ba143adadd69 100644 (file)
@@ -3646,7 +3646,7 @@ static inline struct sk_buff *handle_ing(struct sk_buff *skb,
 
        qdisc_skb_cb(skb)->pkt_len = skb->len;
        skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_INGRESS);
-       qdisc_bstats_update_cpu(cl->q, skb);
+       qdisc_bstats_cpu_update(cl->q, skb);
 
        switch (tc_classify(skb, cl, &cl_res)) {
        case TC_ACT_OK:
@@ -3654,7 +3654,7 @@ static inline struct sk_buff *handle_ing(struct sk_buff *skb,
                skb->tc_index = TC_H_MIN(cl_res.classid);
                break;
        case TC_ACT_SHOT:
-               qdisc_qstats_drop_cpu(cl->q);
+               qdisc_qstats_cpu_drop(cl->q);
        case TC_ACT_STOLEN:
        case TC_ACT_QUEUED:
                kfree_skb(skb);