mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
net: ethernet: ti: icssg: guard PA stat lookups
icssg_ndo_get_stats64() unconditionally calls emac_get_stat_by_name()
with FW PA stat names regardless of whether the PA stats block is
present on the hardware. emac_get_stat_by_name() already guards the
PA stats lookup with `if (emac->prueth->pa_stats)`; when that pointer
is NULL the lookup falls through to netdev_err() and returns -EINVAL.
Because ndo_get_stats64 is polled regularly by the networking stack
this produces thousands of log entries of the form:
icssg-prueth icssg1-eth end0: Invalid stats FW_RX_ERROR
A secondary consequence is that the int(-EINVAL) return value is
implicitly widened to a near-ULLONG_MAX unsigned value when accumulated
into the __u64 fields of rtnl_link_stats64, silently corrupting the
rx_errors, rx_dropped and tx_dropped counters reported by `ip -s link`.
Every other PA-aware code path in the driver is already guarded with
the same `if (emac->prueth->pa_stats)` check. Apply the same guard
here.
Fixes: 0d15a26b24 ("net: ti: icssg-prueth: Add ICSSG FW Stats")
Signed-off-by: Philippe Schenker <philippe.schenker@impulsing.ch>
Reviewed-by: Simon Horman <horms@kernel.org>
Cc: danishanwar@ti.com
Cc: rogerq@kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260618093037.3448858-1-dev@pschenker.ch
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
53442aad1d
commit
27b9daba50
|
|
@ -1652,28 +1652,35 @@ void icssg_ndo_get_stats64(struct net_device *ndev,
|
|||
stats->rx_over_errors = emac_get_stat_by_name(emac, "rx_over_errors");
|
||||
stats->multicast = emac_get_stat_by_name(emac, "rx_multicast_frames");
|
||||
|
||||
stats->rx_errors = ndev->stats.rx_errors +
|
||||
emac_get_stat_by_name(emac, "FW_RX_ERROR") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_EOF_SHORT_FRMERR") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_B0_DROP_EARLY_EOF") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_EXP_FRAG_Q_DROP") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_FIFO_OVERRUN");
|
||||
stats->rx_dropped = ndev->stats.rx_dropped +
|
||||
emac_get_stat_by_name(emac, "FW_DROPPED_PKT") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_PORT_DISABLED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_SAV") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_SA_DL") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_PORT_BLOCKED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_TAGGED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_PRIOTAGGED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_NOTAG") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_NOTMEMBER");
|
||||
stats->rx_errors = ndev->stats.rx_errors;
|
||||
stats->rx_dropped = ndev->stats.rx_dropped;
|
||||
stats->tx_errors = ndev->stats.tx_errors;
|
||||
stats->tx_dropped = ndev->stats.tx_dropped +
|
||||
emac_get_stat_by_name(emac, "FW_RTU_PKT_DROP") +
|
||||
emac_get_stat_by_name(emac, "FW_TX_DROPPED_PACKET") +
|
||||
emac_get_stat_by_name(emac, "FW_TX_TS_DROPPED_PACKET") +
|
||||
emac_get_stat_by_name(emac, "FW_TX_JUMBO_FRM_CUTOFF");
|
||||
stats->tx_dropped = ndev->stats.tx_dropped;
|
||||
|
||||
if (!emac->prueth->pa_stats)
|
||||
return;
|
||||
|
||||
stats->rx_errors +=
|
||||
emac_get_stat_by_name(emac, "FW_RX_ERROR") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_EOF_SHORT_FRMERR") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_B0_DROP_EARLY_EOF") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_EXP_FRAG_Q_DROP") +
|
||||
emac_get_stat_by_name(emac, "FW_RX_FIFO_OVERRUN");
|
||||
stats->rx_dropped +=
|
||||
emac_get_stat_by_name(emac, "FW_DROPPED_PKT") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_PORT_DISABLED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_SAV") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_SA_DL") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_PORT_BLOCKED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_TAGGED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_PRIOTAGGED") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_NOTAG") +
|
||||
emac_get_stat_by_name(emac, "FW_INF_DROP_NOTMEMBER");
|
||||
stats->tx_dropped +=
|
||||
emac_get_stat_by_name(emac, "FW_RTU_PKT_DROP") +
|
||||
emac_get_stat_by_name(emac, "FW_TX_DROPPED_PACKET") +
|
||||
emac_get_stat_by_name(emac, "FW_TX_TS_DROPPED_PACKET") +
|
||||
emac_get_stat_by_name(emac, "FW_TX_JUMBO_FRM_CUTOFF");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(icssg_ndo_get_stats64);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user