]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: hyperv: dump TX indirection table to ethtool regs
authorChi Song <chisong@linux.microsoft.com>
Fri, 24 Jul 2020 04:14:26 +0000 (21:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Jul 2020 22:18:33 +0000 (15:18 -0700)
An imbalanced TX indirection table causes netvsc to have low
performance. This table is created and managed during runtime. To help
better diagnose performance issues caused by imbalanced tables, it needs
make TX indirection tables visible.

Because TX indirection table is driver specified information, so
display it via ethtool register dump.

Signed-off-by: Chi Song <chisong@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/netvsc_drv.c

index e0327b88732ce8ad73446949c3c9b3b51f97e2a5..d27b90b4e2bbd57d338a38e918d7c1e0c391ee25 100644 (file)
@@ -1958,6 +1958,23 @@ syncvf:
        return ret;
 }
 
+static int netvsc_get_regs_len(struct net_device *netdev)
+{
+       return VRSS_SEND_TAB_SIZE * sizeof(u32);
+}
+
+static void netvsc_get_regs(struct net_device *netdev,
+                           struct ethtool_regs *regs, void *p)
+{
+       struct net_device_context *ndc = netdev_priv(netdev);
+       u32 *regs_buff = p;
+
+       /* increase the version, if buffer format is changed. */
+       regs->version = 1;
+
+       memcpy(regs_buff, ndc->tx_table, VRSS_SEND_TAB_SIZE * sizeof(u32));
+}
+
 static u32 netvsc_get_msglevel(struct net_device *ndev)
 {
        struct net_device_context *ndev_ctx = netdev_priv(ndev);
@@ -1974,6 +1991,8 @@ static void netvsc_set_msglevel(struct net_device *ndev, u32 val)
 
 static const struct ethtool_ops ethtool_ops = {
        .get_drvinfo    = netvsc_get_drvinfo,
+       .get_regs_len   = netvsc_get_regs_len,
+       .get_regs       = netvsc_get_regs,
        .get_msglevel   = netvsc_get_msglevel,
        .set_msglevel   = netvsc_set_msglevel,
        .get_link       = ethtool_op_get_link,