Commit 4c96c0ac authored by Ioana Ciornei's avatar Ioana Ciornei Committed by David S. Miller

dpaa2-eth: add software counter for Tx frames converted to S/G

With the previous commit, in case of insufficient SKB headroom on the Tx
path instead of reallocing the SKB we now send a S/G frame descriptor.
Export the number of occurences of this case as a per CPU counter (in
debugfs) and a total number in the ethtool statistics - "tx converted sg
frames'.
Signed-off-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d70446ee
...@@ -19,14 +19,14 @@ static int dpaa2_dbg_cpu_show(struct seq_file *file, void *offset) ...@@ -19,14 +19,14 @@ static int dpaa2_dbg_cpu_show(struct seq_file *file, void *offset)
int i; int i;
seq_printf(file, "Per-CPU stats for %s\n", priv->net_dev->name); seq_printf(file, "Per-CPU stats for %s\n", priv->net_dev->name);
seq_printf(file, "%s%16s%16s%16s%16s%16s%16s%16s%16s\n", seq_printf(file, "%s%16s%16s%16s%16s%16s%16s%16s%16s%16s\n",
"CPU", "Rx", "Rx Err", "Rx SG", "Tx", "Tx Err", "Tx conf", "CPU", "Rx", "Rx Err", "Rx SG", "Tx", "Tx Err", "Tx conf",
"Tx SG", "Enq busy"); "Tx SG", "Tx converted to SG", "Enq busy");
for_each_online_cpu(i) { for_each_online_cpu(i) {
stats = per_cpu_ptr(priv->percpu_stats, i); stats = per_cpu_ptr(priv->percpu_stats, i);
extras = per_cpu_ptr(priv->percpu_extras, i); extras = per_cpu_ptr(priv->percpu_extras, i);
seq_printf(file, "%3d%16llu%16llu%16llu%16llu%16llu%16llu%16llu%16llu\n", seq_printf(file, "%3d%16llu%16llu%16llu%16llu%16llu%16llu%16llu%16llu%16llu\n",
i, i,
stats->rx_packets, stats->rx_packets,
stats->rx_errors, stats->rx_errors,
...@@ -35,6 +35,7 @@ static int dpaa2_dbg_cpu_show(struct seq_file *file, void *offset) ...@@ -35,6 +35,7 @@ static int dpaa2_dbg_cpu_show(struct seq_file *file, void *offset)
stats->tx_errors, stats->tx_errors,
extras->tx_conf_frames, extras->tx_conf_frames,
extras->tx_sg_frames, extras->tx_sg_frames,
extras->tx_converted_sg_frames,
extras->tx_portal_busy); extras->tx_portal_busy);
} }
......
...@@ -960,6 +960,8 @@ static netdev_tx_t dpaa2_eth_tx(struct sk_buff *skb, struct net_device *net_dev) ...@@ -960,6 +960,8 @@ static netdev_tx_t dpaa2_eth_tx(struct sk_buff *skb, struct net_device *net_dev)
err = build_sg_fd_single_buf(priv, skb, &fd); err = build_sg_fd_single_buf(priv, skb, &fd);
percpu_extras->tx_sg_frames++; percpu_extras->tx_sg_frames++;
percpu_extras->tx_sg_bytes += skb->len; percpu_extras->tx_sg_bytes += skb->len;
percpu_extras->tx_converted_sg_frames++;
percpu_extras->tx_converted_sg_bytes += skb->len;
} else { } else {
err = build_single_fd(priv, skb, &fd); err = build_single_fd(priv, skb, &fd);
} }
......
...@@ -285,6 +285,9 @@ struct dpaa2_eth_drv_stats { ...@@ -285,6 +285,9 @@ struct dpaa2_eth_drv_stats {
__u64 tx_sg_bytes; __u64 tx_sg_bytes;
__u64 rx_sg_frames; __u64 rx_sg_frames;
__u64 rx_sg_bytes; __u64 rx_sg_bytes;
/* Linear skbs sent as a S/G FD due to insufficient headroom */
__u64 tx_converted_sg_frames;
__u64 tx_converted_sg_bytes;
/* Enqueues retried due to portal busy */ /* Enqueues retried due to portal busy */
__u64 tx_portal_busy; __u64 tx_portal_busy;
}; };
......
...@@ -45,6 +45,8 @@ static char dpaa2_ethtool_extras[][ETH_GSTRING_LEN] = { ...@@ -45,6 +45,8 @@ static char dpaa2_ethtool_extras[][ETH_GSTRING_LEN] = {
"[drv] tx sg bytes", "[drv] tx sg bytes",
"[drv] rx sg frames", "[drv] rx sg frames",
"[drv] rx sg bytes", "[drv] rx sg bytes",
"[drv] tx converted sg frames",
"[drv] tx converted sg bytes",
"[drv] enqueue portal busy", "[drv] enqueue portal busy",
/* Channel stats */ /* Channel stats */
"[drv] dequeue portal busy", "[drv] dequeue portal busy",
......
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