Commit a5d78ce7 authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller

net: systemport: Add software counters to track reallocations

When inserting the TSB, keep track of how many times we had to do it and
if there was a failure in doing so, this helps profile the driver for
possibly incorrect headroom settings.
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent aa6ca0ec
...@@ -284,6 +284,8 @@ static const struct bcm_sysport_stats bcm_sysport_gstrings_stats[] = { ...@@ -284,6 +284,8 @@ static const struct bcm_sysport_stats bcm_sysport_gstrings_stats[] = {
STAT_MIB_SOFT("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), STAT_MIB_SOFT("alloc_rx_buff_failed", mib.alloc_rx_buff_failed),
STAT_MIB_SOFT("rx_dma_failed", mib.rx_dma_failed), STAT_MIB_SOFT("rx_dma_failed", mib.rx_dma_failed),
STAT_MIB_SOFT("tx_dma_failed", mib.tx_dma_failed), STAT_MIB_SOFT("tx_dma_failed", mib.tx_dma_failed),
STAT_MIB_SOFT("tx_realloc_tsb", mib.tx_realloc_tsb),
STAT_MIB_SOFT("tx_realloc_tsb_failed", mib.tx_realloc_tsb_failed),
/* Per TX-queue statistics are dynamically appended */ /* Per TX-queue statistics are dynamically appended */
}; };
...@@ -1220,6 +1222,7 @@ static void bcm_sysport_poll_controller(struct net_device *dev) ...@@ -1220,6 +1222,7 @@ static void bcm_sysport_poll_controller(struct net_device *dev)
static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb, static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb,
struct net_device *dev) struct net_device *dev)
{ {
struct bcm_sysport_priv *priv = netdev_priv(dev);
struct sk_buff *nskb; struct sk_buff *nskb;
struct bcm_tsb *tsb; struct bcm_tsb *tsb;
u32 csum_info; u32 csum_info;
...@@ -1232,12 +1235,14 @@ static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb, ...@@ -1232,12 +1235,14 @@ static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb,
nskb = skb_realloc_headroom(skb, sizeof(*tsb)); nskb = skb_realloc_headroom(skb, sizeof(*tsb));
if (!nskb) { if (!nskb) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
priv->mib.tx_realloc_tsb_failed++;
dev->stats.tx_errors++; dev->stats.tx_errors++;
dev->stats.tx_dropped++; dev->stats.tx_dropped++;
return NULL; return NULL;
} }
dev_consume_skb_any(skb); dev_consume_skb_any(skb);
skb = nskb; skb = nskb;
priv->mib.tx_realloc_tsb++;
} }
tsb = skb_push(skb, sizeof(*tsb)); tsb = skb_push(skb, sizeof(*tsb));
......
...@@ -607,6 +607,8 @@ struct bcm_sysport_mib { ...@@ -607,6 +607,8 @@ struct bcm_sysport_mib {
u32 alloc_rx_buff_failed; u32 alloc_rx_buff_failed;
u32 rx_dma_failed; u32 rx_dma_failed;
u32 tx_dma_failed; u32 tx_dma_failed;
u32 tx_realloc_tsb;
u32 tx_realloc_tsb_failed;
}; };
/* HW maintains a large list of counters */ /* HW maintains a large list of counters */
......
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