Commit 40bedf7c authored by Jakub Kicinski's avatar Jakub Kicinski

bnxt: count packets discarded because of netpoll

bnxt may discard packets if Rx completions are consumed
in an attempt to let netpoll make progress. It should be
extremely rare in practice but nonetheless such events
should be counted.

Since completion ring memory is allocated dynamically use
a similar scheme to what is done for HW stats to save them.

Report the stats in rx_dropped and per-netdev ethtool
counter. Chances that users care which ring dropped are
very low.

v3: only save the stat to rx_dropped on reset,
rx_total_netpoll_discards will now only show drops since
last reset, similar to other "total_discard" counters.
Reviewed-by: default avatarMichael Chan <michael.chan@broadcom.com>
Reviewed-by: default avatarEdwin Peer <edwin.peer@broadcom.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 4baf0e0b
...@@ -2003,6 +2003,7 @@ static int bnxt_force_rx_discard(struct bnxt *bp, ...@@ -2003,6 +2003,7 @@ static int bnxt_force_rx_discard(struct bnxt *bp,
struct rx_cmp *rxcmp; struct rx_cmp *rxcmp;
u16 cp_cons; u16 cp_cons;
u8 cmp_type; u8 cmp_type;
int rc;
cp_cons = RING_CMP(tmp_raw_cons); cp_cons = RING_CMP(tmp_raw_cons);
rxcmp = (struct rx_cmp *) rxcmp = (struct rx_cmp *)
...@@ -2031,7 +2032,10 @@ static int bnxt_force_rx_discard(struct bnxt *bp, ...@@ -2031,7 +2032,10 @@ static int bnxt_force_rx_discard(struct bnxt *bp,
tpa_end1->rx_tpa_end_cmp_errors_v2 |= tpa_end1->rx_tpa_end_cmp_errors_v2 |=
cpu_to_le32(RX_TPA_END_CMP_ERRORS); cpu_to_le32(RX_TPA_END_CMP_ERRORS);
} }
return bnxt_rx_pkt(bp, cpr, raw_cons, event); rc = bnxt_rx_pkt(bp, cpr, raw_cons, event);
if (rc && rc != -EBUSY)
cpr->sw_stats.rx.rx_netpoll_discards += 1;
return rc;
} }
u32 bnxt_fw_health_readl(struct bnxt *bp, int reg_idx) u32 bnxt_fw_health_readl(struct bnxt *bp, int reg_idx)
...@@ -10646,6 +10650,8 @@ static void bnxt_get_ring_stats(struct bnxt *bp, ...@@ -10646,6 +10650,8 @@ static void bnxt_get_ring_stats(struct bnxt *bp,
stats->multicast += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts); stats->multicast += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts);
stats->tx_dropped += BNXT_GET_RING_STATS64(sw, tx_error_pkts); stats->tx_dropped += BNXT_GET_RING_STATS64(sw, tx_error_pkts);
stats->rx_dropped += cpr->sw_stats.rx.rx_netpoll_discards;
} }
} }
...@@ -10660,6 +10666,7 @@ static void bnxt_add_prev_stats(struct bnxt *bp, ...@@ -10660,6 +10666,7 @@ static void bnxt_add_prev_stats(struct bnxt *bp,
stats->tx_bytes += prev_stats->tx_bytes; stats->tx_bytes += prev_stats->tx_bytes;
stats->rx_missed_errors += prev_stats->rx_missed_errors; stats->rx_missed_errors += prev_stats->rx_missed_errors;
stats->multicast += prev_stats->multicast; stats->multicast += prev_stats->multicast;
stats->rx_dropped += prev_stats->rx_dropped;
stats->tx_dropped += prev_stats->tx_dropped; stats->tx_dropped += prev_stats->tx_dropped;
} }
......
...@@ -939,6 +939,7 @@ struct bnxt_rx_sw_stats { ...@@ -939,6 +939,7 @@ struct bnxt_rx_sw_stats {
u64 rx_l4_csum_errors; u64 rx_l4_csum_errors;
u64 rx_resets; u64 rx_resets;
u64 rx_buf_errors; u64 rx_buf_errors;
u64 rx_netpoll_discards;
}; };
struct bnxt_cmn_sw_stats { struct bnxt_cmn_sw_stats {
......
...@@ -307,6 +307,7 @@ static const char * const bnxt_cmn_sw_stats_str[] = { ...@@ -307,6 +307,7 @@ static const char * const bnxt_cmn_sw_stats_str[] = {
enum { enum {
RX_TOTAL_DISCARDS, RX_TOTAL_DISCARDS,
TX_TOTAL_DISCARDS, TX_TOTAL_DISCARDS,
RX_NETPOLL_DISCARDS,
}; };
static struct { static struct {
...@@ -315,6 +316,7 @@ static struct { ...@@ -315,6 +316,7 @@ static struct {
} bnxt_sw_func_stats[] = { } bnxt_sw_func_stats[] = {
{0, "rx_total_discard_pkts"}, {0, "rx_total_discard_pkts"},
{0, "tx_total_discard_pkts"}, {0, "tx_total_discard_pkts"},
{0, "rx_total_netpoll_discards"},
}; };
#define NUM_RING_RX_SW_STATS ARRAY_SIZE(bnxt_rx_sw_stats_str) #define NUM_RING_RX_SW_STATS ARRAY_SIZE(bnxt_rx_sw_stats_str)
...@@ -603,6 +605,8 @@ static void bnxt_get_ethtool_stats(struct net_device *dev, ...@@ -603,6 +605,8 @@ static void bnxt_get_ethtool_stats(struct net_device *dev,
BNXT_GET_RING_STATS64(sw_stats, rx_discard_pkts); BNXT_GET_RING_STATS64(sw_stats, rx_discard_pkts);
bnxt_sw_func_stats[TX_TOTAL_DISCARDS].counter += bnxt_sw_func_stats[TX_TOTAL_DISCARDS].counter +=
BNXT_GET_RING_STATS64(sw_stats, tx_discard_pkts); BNXT_GET_RING_STATS64(sw_stats, tx_discard_pkts);
bnxt_sw_func_stats[RX_NETPOLL_DISCARDS].counter +=
cpr->sw_stats.rx.rx_netpoll_discards;
} }
for (i = 0; i < BNXT_NUM_SW_FUNC_STATS; i++, j++) for (i = 0; i < BNXT_NUM_SW_FUNC_STATS; i++, j++)
......
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