diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index b4c6965a8..38ba46235 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -5746,10 +5746,10 @@ ice_fetch_u64_stats_per_ring(struct ice_ring *ring, u64 *pkts, u64 *bytes)
  * @count: number of rings
  */
 static void
-ice_update_vsi_tx_ring_stats(struct ice_vsi *vsi, struct ice_ring **rings,
-			     u16 count)
+ice_update_vsi_tx_ring_stats(u64 *tx_packets, u64 *tx_bytes, u64 *tx_restart,
+		u64 *tx_busy, u64 *tx_linearize, struct ice_ring **rings,
+		u16 count)
 {
-	struct rtnl_link_stats64 *vsi_stats = &vsi->net_stats;
 	u16 i;
 
 	for (i = 0; i < count; i++) {
@@ -5758,11 +5758,11 @@ ice_update_vsi_tx_ring_stats(struct ice_vsi *vsi, struct ice_ring **rings,
 
 		ring = READ_ONCE(rings[i]);
 		ice_fetch_u64_stats_per_ring(ring, &pkts, &bytes);
-		vsi_stats->tx_packets += pkts;
-		vsi_stats->tx_bytes += bytes;
-		vsi->tx_restart += ring->tx_stats.restart_q;
-		vsi->tx_busy += ring->tx_stats.tx_busy;
-		vsi->tx_linearize += ring->tx_stats.tx_linearize;
+		*tx_packets += pkts;
+		*tx_bytes += bytes;
+		*tx_restart += ring->tx_stats.restart_q;
+		*tx_busy += ring->tx_stats.tx_busy;
+		*tx_linearize += ring->tx_stats.tx_linearize;
 	}
 }
 
@@ -5776,41 +5776,54 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
 	u64 pkts, bytes;
 	int i;
 
-	/* reset netdev stats */
-	vsi_stats->tx_packets = 0;
-	vsi_stats->tx_bytes = 0;
-	vsi_stats->rx_packets = 0;
-	vsi_stats->rx_bytes = 0;
+	u64 tx_packets = 0;
+	u64 tx_bytes = 0;
+	u64 rx_packets = 0;
+	u64 rx_bytes = 0;
 
-	/* reset non-netdev (extended) stats */
-	vsi->tx_restart = 0;
-	vsi->tx_busy = 0;
-	vsi->tx_linearize = 0;
-	vsi->rx_buf_failed = 0;
-	vsi->rx_page_failed = 0;
+	u64 tx_restart = 0;
+	u64 tx_busy = 0;
+	u64 tx_linearize = 0;
+	u64 rx_buf_failed = 0;
+	u64 rx_page_failed = 0;
 
 	rcu_read_lock();
 
 	/* update Tx rings counters */
-	ice_update_vsi_tx_ring_stats(vsi, vsi->tx_rings, vsi->num_txq);
+	ice_update_vsi_tx_ring_stats(&tx_packets, &tx_bytes, &tx_restart,
+			&tx_busy, &tx_linearize, vsi->tx_rings, vsi->num_txq);
 
 	/* update Rx rings counters */
 	ice_for_each_rxq(vsi, i) {
 		struct ice_ring *ring = READ_ONCE(vsi->rx_rings[i]);
 
 		ice_fetch_u64_stats_per_ring(ring, &pkts, &bytes);
-		vsi_stats->rx_packets += pkts;
-		vsi_stats->rx_bytes += bytes;
-		vsi->rx_buf_failed += ring->rx_stats.alloc_buf_failed;
-		vsi->rx_page_failed += ring->rx_stats.alloc_page_failed;
+		rx_packets += pkts;
+		rx_bytes += bytes;
+		rx_buf_failed += ring->rx_stats.alloc_buf_failed;
+		rx_page_failed += ring->rx_stats.alloc_page_failed;
 	}
 
 	/* update XDP Tx rings counters */
 	if (ice_is_xdp_ena_vsi(vsi))
-		ice_update_vsi_tx_ring_stats(vsi, vsi->xdp_rings,
-					     vsi->num_xdp_txq);
+		ice_update_vsi_tx_ring_stats(&tx_packets, &tx_bytes,
+				&tx_restart, &tx_busy, &tx_linearize,
+				vsi->xdp_rings, vsi->num_xdp_txq);
 
 	rcu_read_unlock();
+
+	/* reset netdev stats */
+	vsi_stats->tx_packets = tx_packets;
+	vsi_stats->tx_bytes = tx_bytes;
+	vsi_stats->rx_packets = rx_packets;
+	vsi_stats->rx_bytes = rx_bytes;
+
+	/* reset non-netdev (extended) stats */
+	vsi->tx_restart = tx_restart;
+	vsi->tx_busy = tx_busy;
+	vsi->tx_linearize = tx_linearize;
+	vsi->rx_buf_failed = rx_buf_failed;
+	vsi->rx_page_failed = rx_page_failed;
 }
 
 /**
