> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Petr Oros
> Sent: Thursday, February 12, 2026 8:53 AM
> To: [email protected]
> Cc: Drewek, Wojciech <[email protected]>; Kitszel, Przemyslaw
> <[email protected]>; Eric Dumazet <[email protected]>;
> [email protected]; Andrew Lunn <[email protected]>;
> Nguyen, Anthony L <[email protected]>; Simon Horman
> <[email protected]>; Michal Swiatkowski
> <[email protected]>; Jakub Kicinski
> <[email protected]>; Paolo Abeni <[email protected]>; David S. Miller
> <[email protected]>; [email protected]
> Subject: [Intel-wired-lan] [PATCH iwl-net 2/2] ice: use
> ice_update_eth_stats() for representor stats
> 
> ice_repr_get_stats64() and __ice_get_ethtool_stats() call
> ice_update_vsi_stats() on the VF's src_vsi. This always returns early
> because ICE_VSI_DOWN is permanently set for VF VSIs — ice_up() is
> never called on them since queues are managed by iavf through
> virtchnl.
> 
> In __ice_get_ethtool_stats() the original code called
> ice_update_vsi_stats() for all VSIs including representors, iterated
> over ice_gstrings_vsi_stats[] to populate the data, and then bailed
> out with an early return before the per-queue ring stats section. That
> early return was necessary because representor VSIs have no rings on
> the PF side — the rings belong to the VF driver (iavf), so accessing
> per-queue stats would be invalid.
> 
> Move the representor handling to the top of __ice_get_ethtool_stats()
> and call ice_update_eth_stats() directly to read the hardware GLV_*
> counters. This matches ice_get_vf_stats() which already uses
> ice_update_eth_stats() for the same VF VSI in legacy mode. Apply the
> same fix to ice_repr_get_stats64().
> 
> Note that ice_gstrings_vsi_stats[] contains five software ring
> counters (rx_buf_failed, rx_page_failed, tx_linearize, tx_busy,
> tx_restart) that are always zero for representors since the PF never
> processes packets on VF rings. This is pre-existing behavior unchanged
> by this patch.
> 
> Fixes: 7aae80cef7ba ("ice: add port representor ethtool ops and
> stats")
> Signed-off-by: Petr Oros <[email protected]>
> ---
>  drivers/net/ethernet/intel/ice/ice_ethtool.c | 14 +++++++++++---
>  drivers/net/ethernet/intel/ice/ice_repr.c    |  3 ++-
>  2 files changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c
> b/drivers/net/ethernet/intel/ice/ice_ethtool.c
> index 3565a5d96c6d18..0b8775621f1567 100644
> --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
> +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
> @@ -1926,6 +1926,17 @@ __ice_get_ethtool_stats(struct net_device
> *netdev,
>       int i = 0;
>       char *p;
> 
> +     if (ice_is_port_repr_netdev(netdev)) {
> +             ice_update_eth_stats(vsi);
> +
> +             for (j = 0; j < ICE_VSI_STATS_LEN; j++) {
> +                     p = (char *)vsi +
> ice_gstrings_vsi_stats[j].stat_offset;
> +                     data[i++] =
> (ice_gstrings_vsi_stats[j].sizeof_stat ==
> +                                  sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
> +             }
> +             return;
> +     }
> +
>       ice_update_pf_stats(pf);
>       ice_update_vsi_stats(vsi);
> 
> @@ -1935,9 +1946,6 @@ __ice_get_ethtool_stats(struct net_device
> *netdev,
>                            sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
>       }
> 
> -     if (ice_is_port_repr_netdev(netdev))
> -             return;
> -
>       /* populate per queue stats */
>       rcu_read_lock();
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_repr.c
> b/drivers/net/ethernet/intel/ice/ice_repr.c
> index 2a84f656405828..f1e82ba155cff2 100644
> --- a/drivers/net/ethernet/intel/ice/ice_repr.c
> +++ b/drivers/net/ethernet/intel/ice/ice_repr.c
> @@ -2,6 +2,7 @@
>  /* Copyright (C) 2019-2021, Intel Corporation. */
> 
>  #include "ice.h"
> +#include "ice_lib.h"
>  #include "ice_eswitch.h"
>  #include "devlink/devlink.h"
>  #include "devlink/port.h"
> @@ -67,7 +68,7 @@ ice_repr_get_stats64(struct net_device *netdev,
> struct rtnl_link_stats64 *stats)
>               return;
>       vsi = repr->src_vsi;
> 
> -     ice_update_vsi_stats(vsi);
> +     ice_update_eth_stats(vsi);
>       eth_stats = &vsi->eth_stats;
> 
>       stats->tx_packets = eth_stats->tx_unicast + eth_stats-
> >tx_broadcast +
> --
> 2.52.0


Reviewed-by: Aleksandr Loktionov <[email protected]>

Reply via email to