]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i40e: Add rx_missed_errors for buffer exhaustion
authorYajun Deng <yajun.deng@linux.dev>
Wed, 6 Sep 2023 07:27:57 +0000 (15:27 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:22:30 +0000 (16:22 +0200)
[ Upstream commit 5337d294973331660e84e41836a54014de22e5b0 ]

As the comment in struct rtnl_link_stats64, rx_dropped should not
include packets dropped by the device due to buffer exhaustion.
They are counted in rx_missed_errors, procfs folds those two counters
together.

Add rx_missed_errors for buffer exhaustion, rx_missed_errors corresponds
to rx_discards, rx_dropped corresponds to rx_discards_other.

Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
Tested-by: Arpana Arland <arpanax.arland@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Stable-dep-of: 50b2af451597 ("i40e: report VF tx_dropped with tx_errors instead of tx_discards")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/intel/i40e/i40e_ethtool.c
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

index 520929f4d535f8096b87db9a2a2584376dd66179..7f8fc9b3b105f2cd2c2ff094144bfdca4b761453 100644 (file)
@@ -247,6 +247,7 @@ static const struct i40e_stats i40e_gstrings_net_stats[] = {
        I40E_NETDEV_STAT(rx_errors),
        I40E_NETDEV_STAT(tx_errors),
        I40E_NETDEV_STAT(rx_dropped),
+       I40E_NETDEV_STAT(rx_missed_errors),
        I40E_NETDEV_STAT(tx_dropped),
        I40E_NETDEV_STAT(collisions),
        I40E_NETDEV_STAT(rx_length_errors),
@@ -317,7 +318,7 @@ static const struct i40e_stats i40e_gstrings_stats[] = {
        I40E_PF_STAT("port.rx_broadcast", stats.eth.rx_broadcast),
        I40E_PF_STAT("port.tx_broadcast", stats.eth.tx_broadcast),
        I40E_PF_STAT("port.tx_errors", stats.eth.tx_errors),
-       I40E_PF_STAT("port.rx_dropped", stats.eth.rx_discards),
+       I40E_PF_STAT("port.rx_discards", stats.eth.rx_discards),
        I40E_PF_STAT("port.tx_dropped_link_down", stats.tx_dropped_link_down),
        I40E_PF_STAT("port.rx_crc_errors", stats.crc_errors),
        I40E_PF_STAT("port.illegal_bytes", stats.illegal_bytes),
index 35a903f6df21513605ec2f0ab3722fb88a93b778..aa24d1808c9815709f85039d233247934cce1032 100644 (file)
@@ -492,6 +492,7 @@ static void i40e_get_netdev_stats_struct(struct net_device *netdev,
        stats->tx_dropped       = vsi_stats->tx_dropped;
        stats->rx_errors        = vsi_stats->rx_errors;
        stats->rx_dropped       = vsi_stats->rx_dropped;
+       stats->rx_missed_errors = vsi_stats->rx_missed_errors;
        stats->rx_crc_errors    = vsi_stats->rx_crc_errors;
        stats->rx_length_errors = vsi_stats->rx_length_errors;
 }
@@ -683,17 +684,13 @@ i40e_stats_update_rx_discards(struct i40e_vsi *vsi, struct i40e_hw *hw,
                              struct i40e_eth_stats *stat_offset,
                              struct i40e_eth_stats *stat)
 {
-       u64 rx_rdpc, rx_rxerr;
-
        i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx), offset_loaded,
-                          &stat_offset->rx_discards, &rx_rdpc);
+                          &stat_offset->rx_discards, &stat->rx_discards);
        i40e_stat_update64(hw,
                           I40E_GL_RXERR1H(i40e_compute_pci_to_hw_id(vsi, hw)),
                           I40E_GL_RXERR1L(i40e_compute_pci_to_hw_id(vsi, hw)),
                           offset_loaded, &stat_offset->rx_discards_other,
-                          &rx_rxerr);
-
-       stat->rx_discards = rx_rdpc + rx_rxerr;
+                          &stat->rx_discards_other);
 }
 
 /**
@@ -715,9 +712,6 @@ void i40e_update_eth_stats(struct i40e_vsi *vsi)
        i40e_stat_update32(hw, I40E_GLV_TEPC(stat_idx),
                           vsi->stat_offsets_loaded,
                           &oes->tx_errors, &es->tx_errors);
-       i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx),
-                          vsi->stat_offsets_loaded,
-                          &oes->rx_discards, &es->rx_discards);
        i40e_stat_update32(hw, I40E_GLV_RUPP(stat_idx),
                           vsi->stat_offsets_loaded,
                           &oes->rx_unknown_protocol, &es->rx_unknown_protocol);
@@ -958,8 +952,10 @@ static void i40e_update_vsi_stats(struct i40e_vsi *vsi)
        ns->tx_errors = es->tx_errors;
        ons->multicast = oes->rx_multicast;
        ns->multicast = es->rx_multicast;
-       ons->rx_dropped = oes->rx_discards;
-       ns->rx_dropped = es->rx_discards;
+       ons->rx_dropped = oes->rx_discards_other;
+       ns->rx_dropped = es->rx_discards_other;
+       ons->rx_missed_errors = oes->rx_discards;
+       ns->rx_missed_errors = es->rx_discards;
        ons->tx_dropped = oes->tx_discards;
        ns->tx_dropped = es->tx_discards;
 
index 852ece241a2780ff05eac82e250f0d8fc4f93467..65093c310dce8a1e3e88e8cfc92918cfb40e96c3 100644 (file)
@@ -4835,7 +4835,7 @@ int i40e_get_vf_stats(struct net_device *netdev, int vf_id,
        vf_stats->tx_bytes   = stats->tx_bytes;
        vf_stats->broadcast  = stats->rx_broadcast;
        vf_stats->multicast  = stats->rx_multicast;
-       vf_stats->rx_dropped = stats->rx_discards;
+       vf_stats->rx_dropped = stats->rx_discards + stats->rx_discards_other;
        vf_stats->tx_dropped = stats->tx_discards;
 
        return 0;