ether: Add Linux-compatible netif_stats
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 2 Nov 2017 16:34:23 +0000 (12:34 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Nov 2017 15:46:55 +0000 (10:46 -0500)
Instead of faking stat structs (like we did with mlx4) or completely
ignoring them (like bnx2x), we can just use the same struct and put it in
struct netif (anonymously in struct ether).  We can even have an ifstat()
function pointer that all the Linux drivers use to extract the info.

Given we probably won't have too many Plan 9 drivers, we might just yank
the Plan 9 stats and covert everyone to using netif_stats.

netif_stats is Linux's rtnl_link_stats64, from commit 569dbb88e80d ("Linux
4.13").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/net/bnx2x/bnx2x_stats.c
kern/drivers/net/mlx4/en_netdev.c
kern/drivers/net/mlx4/en_port.c
kern/drivers/net/mlx4/mlx4_en.h
kern/drivers/net/mlx4/mlx4_stats.h
kern/include/linux/compat_todo.h
kern/include/net/ip.h
scripts/spatch/linux/scalar.cocci

index e6a5062..99c8a81 100644 (file)
@@ -1142,9 +1142,8 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp)
 
 static void bnx2x_net_stats_update(struct bnx2x *bp)
 {
-#if 0 // AKAROS_PORT XME skipping net_stats_update
        struct bnx2x_eth_stats *estats = &bp->eth_stats;
-       struct net_device_stats *nstats = &bp->dev->stats;
+       struct netif_stats *nstats = &bp->dev->stats;
        unsigned long tmp;
        int i;
 
@@ -1209,7 +1208,6 @@ static void bnx2x_net_stats_update(struct bnx2x *bp)
        nstats->tx_errors = nstats->tx_aborted_errors +
                            nstats->tx_carrier_errors +
            bnx2x_hilo(&estats->tx_stat_dot3statsinternalmactransmiterrors_hi);
-#endif
 }
 
 static void bnx2x_drv_stats_update(struct bnx2x *bp)
@@ -1692,9 +1690,7 @@ void bnx2x_stats_init(struct bnx2x *bp)
 void bnx2x_save_statistics(struct bnx2x *bp)
 {
        int i;
-panic("Not implemented");
-#if 0 // AKAROS_PORT
-       struct net_device_stats *nstats = &bp->dev->stats;
+       struct netif_stats *nstats = &bp->dev->stats;
 
        /* save queue statistics */
        for_each_eth_queue(bp, i) {
@@ -1732,7 +1728,6 @@ panic("Not implemented");
                UPDATE_FW_STAT_OLD(brb_truncate_discard);
                UPDATE_FW_STAT_OLD(mac_discard);
        }
-#endif
 }
 
 void bnx2x_afex_collect_stats(struct bnx2x *bp, void *void_afex_stats,
index feeee2f..3892d9f 100644 (file)
@@ -1331,7 +1331,7 @@ static void mlx4_en_tx_timeout(struct ether *dev)
 }
 
 
-static struct net_device_stats *mlx4_en_get_stats(struct ether *dev)
+static struct netif_stats *mlx4_en_get_stats(struct ether *dev)
 {
        struct mlx4_en_priv *priv = netdev_priv(dev);
 
index f7aa510..d29b814 100644 (file)
@@ -155,7 +155,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, uint8_t port,
        struct mlx4_en_stat_out_mbox *mlx4_en_stats;
        struct mlx4_en_stat_out_flow_control_mbox *flowstats;
        struct mlx4_en_priv *priv = netdev_priv(mdev->pndev[port]);
-       struct net_device_stats *stats = &priv->stats;
+       struct netif_stats *stats = &priv->stats;
        struct mlx4_cmd_mailbox *mailbox;
        uint64_t in_mod = reset << 8 | port;
        int err;
index bc5d87f..37fd9b0 100644 (file)
@@ -495,8 +495,8 @@ struct mlx4_en_priv {
        struct mlx4_en_port_profile *prof;
        struct ether *dev;
        unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
-       struct net_device_stats stats;
-       struct net_device_stats ret_stats;
+       struct netif_stats stats;
+       struct netif_stats ret_stats;
        struct mlx4_en_port_state port_state;
        spinlock_t stats_lock;
 #if 0 // AKAROS_PORT
index 4f207b9..e5c6e2d 100644 (file)
@@ -100,5 +100,5 @@ enum {
 #define NUM_ALL_STATS  (NUM_MAIN_STATS + NUM_PORT_STATS + NUM_PKT_STATS + \
                         NUM_FLOW_STATS + NUM_PERF_STATS)
 
-#define MLX4_FIND_NETDEV_STAT(n) (offsetof(struct net_device_stats, n) / \
-                                 sizeof(((struct net_device_stats *)0)->n))
+#define MLX4_FIND_NETDEV_STAT(n) (offsetof(struct netif_stats, n) / \
+                                 sizeof(((struct netif_stats *)0)->n))
index 71ac657..cccfd73 100644 (file)
@@ -939,11 +939,6 @@ typedef struct cpumask cpumask_var_t[1];
 struct notifier_block {
 };
 
-struct net_device_stats {
-       unsigned long tx_dropped;
-       unsigned long rx_dropped;
-};
-
 struct hwtstamp_config {
        int flags;
        int tx_type;
index 3ef39c2..7acadfa 100644 (file)
@@ -983,6 +983,41 @@ enum {
        NETF_TSO = (1 << NS_TSO_SHIFT),         /* device can do TSO */
        NETF_LRO = (1 << NETF_LRO_SHIFT),       /* device can do LRO */
 };
+
+/* Linux's rtnl_link_stats64 */
+struct netif_stats {
+       uint64_t                                rx_packets;     /* total packets received */
+       uint64_t                                tx_packets;     /* total packets transmitted */
+       uint64_t                                rx_bytes;       /* total bytes received */
+       uint64_t                                tx_bytes;       /* total bytes transmitted */
+       uint64_t                                rx_errors;      /* bad packets received */
+       uint64_t                                tx_errors;      /* packet transmit problems */
+       uint64_t                                rx_dropped;     /* no space in linux buffers */
+       uint64_t                                tx_dropped;     /* no space available in linux */
+       uint64_t                                multicast;      /* multicast packets received */
+       uint64_t                                collisions;
+
+       /* detailed rx_errors: */
+       uint64_t                                rx_length_errors;
+       uint64_t                                rx_over_errors; /* receiver ring buff overflow */
+       uint64_t                                rx_crc_errors;  /* recved pkt with crc error */
+       uint64_t                                rx_frame_errors;/* recv'd frame alignment error */
+       uint64_t                                rx_fifo_errors; /* recv'r fifo overrun */
+       uint64_t                                rx_missed_errors;       /* receiver missed packet */
+
+       /* detailed tx_errors */
+       uint64_t                                tx_aborted_errors;
+       uint64_t                                tx_carrier_errors;
+       uint64_t                                tx_fifo_errors;
+       uint64_t                                tx_heartbeat_errors;
+       uint64_t                                tx_window_errors;
+
+       /* for cslip etc */
+       uint64_t                                rx_compressed;
+       uint64_t                                tx_compressed;
+       uint64_t                                rx_nohandler;   /* dropped, no handler found */
+};
+
 /*
  *  a network interface
  */
@@ -1010,7 +1045,7 @@ struct netif {
        int scan;                                       /* number of base station scanners */
        int all;                                        /* number of -1 multiplexors */
 
-       /* statistics */
+       /* 9ns statistics */
        int misses;
        int inpackets;
        int outpackets;
@@ -1020,6 +1055,8 @@ struct netif {
        int overflows;                          /* packet overflows */
        int buffs;                                      /* buffering errors */
        int soverflows;                         /* software overflow */
+       /* Linux-style statistics */
+       struct netif_stats stats;
 
        /* routines for touching the hardware */
        void *arg;
index 8eff47a..58def3d 100644 (file)
@@ -111,6 +111,20 @@ typedef __wsum;
 -net_device
 +ether
 
+// Akaros's netif_stats is Linux's rtnl_link_stats64, which is a superset (byte
+// for byte) of net_device_stats.
+@@
+@@
+ struct
+-rtnl_link_stats64
++netif_stats
+
+@@
+@@
+ struct
+-net_device_stats
++netif_stats
+
 @@
 struct pci_device *p;
 @@