net/core: Add new basic hardware counter
authorEelco Chaudron <echaudro@redhat.com>
Fri, 21 Sep 2018 11:13:54 +0000 (07:13 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Sep 2018 19:18:42 +0000 (12:18 -0700)
Add a new hardware specific basic counter, TCA_STATS_BASIC_HW. This can
be used to count packets/bytes processed by hardware offload.

Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/gen_stats.h
include/uapi/linux/gen_stats.h
net/core/gen_stats.c

index 883bb90..946bd53 100644 (file)
@@ -44,6 +44,10 @@ void __gnet_stats_copy_basic(const seqcount_t *running,
                             struct gnet_stats_basic_packed *bstats,
                             struct gnet_stats_basic_cpu __percpu *cpu,
                             struct gnet_stats_basic_packed *b);
+int gnet_stats_copy_basic_hw(const seqcount_t *running,
+                            struct gnet_dump *d,
+                            struct gnet_stats_basic_cpu __percpu *cpu,
+                            struct gnet_stats_basic_packed *b);
 int gnet_stats_copy_rate_est(struct gnet_dump *d,
                             struct net_rate_estimator __rcu **ptr);
 int gnet_stats_copy_queue(struct gnet_dump *d,
index 24a861c..065408e 100644 (file)
@@ -12,6 +12,7 @@ enum {
        TCA_STATS_APP,
        TCA_STATS_RATE_EST64,
        TCA_STATS_PAD,
+       TCA_STATS_BASIC_HW,
        __TCA_STATS_MAX,
 };
 #define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
index 188d693..65a2e82 100644 (file)
@@ -162,30 +162,18 @@ __gnet_stats_copy_basic(const seqcount_t *running,
 }
 EXPORT_SYMBOL(__gnet_stats_copy_basic);
 
-/**
- * gnet_stats_copy_basic - copy basic statistics into statistic TLV
- * @running: seqcount_t pointer
- * @d: dumping handle
- * @cpu: copy statistic per cpu
- * @b: basic statistics
- *
- * Appends the basic statistics to the top level TLV created by
- * gnet_stats_start_copy().
- *
- * Returns 0 on success or -1 with the statistic lock released
- * if the room in the socket buffer was not sufficient.
- */
 int
-gnet_stats_copy_basic(const seqcount_t *running,
-                     struct gnet_dump *d,
-                     struct gnet_stats_basic_cpu __percpu *cpu,
-                     struct gnet_stats_basic_packed *b)
+___gnet_stats_copy_basic(const seqcount_t *running,
+                        struct gnet_dump *d,
+                        struct gnet_stats_basic_cpu __percpu *cpu,
+                        struct gnet_stats_basic_packed *b,
+                        int type)
 {
        struct gnet_stats_basic_packed bstats = {0};
 
        __gnet_stats_copy_basic(running, &bstats, cpu, b);
 
-       if (d->compat_tc_stats) {
+       if (d->compat_tc_stats && type == TCA_STATS_BASIC) {
                d->tc_stats.bytes = bstats.bytes;
                d->tc_stats.packets = bstats.packets;
        }
@@ -196,14 +184,61 @@ gnet_stats_copy_basic(const seqcount_t *running,
                memset(&sb, 0, sizeof(sb));
                sb.bytes = bstats.bytes;
                sb.packets = bstats.packets;
-               return gnet_stats_copy(d, TCA_STATS_BASIC, &sb, sizeof(sb),
+               return gnet_stats_copy(d, type, &sb, sizeof(sb),
                                       TCA_STATS_PAD);
        }
        return 0;
 }
+
+/**
+ * gnet_stats_copy_basic - copy basic statistics into statistic TLV
+ * @running: seqcount_t pointer
+ * @d: dumping handle
+ * @cpu: copy statistic per cpu
+ * @b: basic statistics
+ *
+ * Appends the basic statistics to the top level TLV created by
+ * gnet_stats_start_copy().
+ *
+ * Returns 0 on success or -1 with the statistic lock released
+ * if the room in the socket buffer was not sufficient.
+ */
+int
+gnet_stats_copy_basic(const seqcount_t *running,
+                     struct gnet_dump *d,
+                     struct gnet_stats_basic_cpu __percpu *cpu,
+                     struct gnet_stats_basic_packed *b)
+{
+       return ___gnet_stats_copy_basic(running, d, cpu, b,
+                                       TCA_STATS_BASIC);
+}
 EXPORT_SYMBOL(gnet_stats_copy_basic);
 
 /**
+ * gnet_stats_copy_basic_hw - copy basic hw statistics into statistic TLV
+ * @running: seqcount_t pointer
+ * @d: dumping handle
+ * @cpu: copy statistic per cpu
+ * @b: basic statistics
+ *
+ * Appends the basic statistics to the top level TLV created by
+ * gnet_stats_start_copy().
+ *
+ * Returns 0 on success or -1 with the statistic lock released
+ * if the room in the socket buffer was not sufficient.
+ */
+int
+gnet_stats_copy_basic_hw(const seqcount_t *running,
+                        struct gnet_dump *d,
+                        struct gnet_stats_basic_cpu __percpu *cpu,
+                        struct gnet_stats_basic_packed *b)
+{
+       return ___gnet_stats_copy_basic(running, d, cpu, b,
+                                       TCA_STATS_BASIC_HW);
+}
+EXPORT_SYMBOL(gnet_stats_copy_basic_hw);
+
+/**
  * gnet_stats_copy_rate_est - copy rate estimator statistics into statistics TLV
  * @d: dumping handle
  * @rate_est: rate estimator