Commit 1e07e361 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

eth: fbnic: report software Tx queue stats



Gather and report software Tx queue stats - checksum stats
and queue stop / start.

Acked-by: default avatarJoe Damato <jdamato@fastly.com>
Reviewed-by: default avatarAlexander Lobakin <aleksander.lobakin@intel.com>
Link: https://patch.msgid.link/20250211181356.580800-5-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 67dc4eb5
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -517,6 +517,7 @@ static void fbnic_get_queue_stats_tx(struct net_device *dev, int idx,
	struct fbnic_net *fbn = netdev_priv(dev);
	struct fbnic_ring *txr = fbn->tx[idx];
	struct fbnic_queue_stats *stats;
	u64 stop, wake, csum;
	unsigned int start;
	u64 bytes, packets;

@@ -528,10 +529,16 @@ static void fbnic_get_queue_stats_tx(struct net_device *dev, int idx,
		start = u64_stats_fetch_begin(&stats->syncp);
		bytes = stats->bytes;
		packets = stats->packets;
		csum = stats->twq.csum_partial;
		stop = stats->twq.stop;
		wake = stats->twq.wake;
	} while (u64_stats_fetch_retry(&stats->syncp, start));

	tx->bytes = bytes;
	tx->packets = packets;
	tx->needs_csum = csum;
	tx->stop = stop;
	tx->wake = wake;
}

static void fbnic_get_base_stats(struct net_device *dev,
@@ -542,6 +549,9 @@ static void fbnic_get_base_stats(struct net_device *dev,

	tx->bytes = fbn->tx_stats.bytes;
	tx->packets = fbn->tx_stats.packets;
	tx->needs_csum = fbn->tx_stats.twq.csum_partial;
	tx->stop = fbn->tx_stats.twq.stop;
	tx->wake = fbn->tx_stats.twq.wake;

	rx->bytes = fbn->rx_stats.bytes;
	rx->packets = fbn->rx_stats.packets;
+19 −4
Original line number Diff line number Diff line
@@ -113,6 +113,11 @@ static int fbnic_maybe_stop_tx(const struct net_device *dev,

	res = netif_txq_maybe_stop(txq, fbnic_desc_unused(ring), size,
				   FBNIC_TX_DESC_WAKEUP);
	if (!res) {
		u64_stats_update_begin(&ring->stats.syncp);
		ring->stats.twq.stop++;
		u64_stats_update_end(&ring->stats.syncp);
	}

	return !res;
}
@@ -191,6 +196,9 @@ fbnic_tx_offloads(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
					skb->csum_offset / 2));

	*meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_CSO);
	u64_stats_update_begin(&ring->stats.syncp);
	ring->stats.twq.csum_partial++;
	u64_stats_update_end(&ring->stats.syncp);

	*meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L2_HLEN_MASK, l2len / 2) |
			     FIELD_PREP(FBNIC_TWD_L3_IHLEN_MASK, i3len / 2));
@@ -460,9 +468,13 @@ static void fbnic_clean_twq0(struct fbnic_napi_vector *nv, int napi_budget,
	ring->stats.packets += total_packets;
	u64_stats_update_end(&ring->stats.syncp);

	netif_txq_completed_wake(txq, total_packets, total_bytes,
	if (!netif_txq_completed_wake(txq, total_packets, total_bytes,
				      fbnic_desc_unused(ring),
				 FBNIC_TX_DESC_WAKEUP);
				      FBNIC_TX_DESC_WAKEUP)) {
		u64_stats_update_begin(&ring->stats.syncp);
		ring->stats.twq.wake++;
		u64_stats_update_end(&ring->stats.syncp);
	}
}

static void fbnic_clean_tsq(struct fbnic_napi_vector *nv,
@@ -1092,10 +1104,13 @@ void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
	fbn->tx_stats.bytes += stats->bytes;
	fbn->tx_stats.packets += stats->packets;
	fbn->tx_stats.dropped += stats->dropped;
	fbn->tx_stats.twq.csum_partial += stats->twq.csum_partial;
	fbn->tx_stats.twq.ts_lost += stats->twq.ts_lost;
	fbn->tx_stats.twq.ts_packets += stats->twq.ts_packets;
	fbn->tx_stats.twq.stop += stats->twq.stop;
	fbn->tx_stats.twq.wake += stats->twq.wake;
	/* Remember to add new stats here */
	BUILD_BUG_ON(sizeof(fbn->tx_stats.twq) / 8 != 2);
	BUILD_BUG_ON(sizeof(fbn->tx_stats.twq) / 8 != 5);
}

static void fbnic_remove_tx_ring(struct fbnic_net *fbn,
+3 −0
Original line number Diff line number Diff line
@@ -58,8 +58,11 @@ struct fbnic_queue_stats {
	u64 bytes;
	union {
		struct {
			u64 csum_partial;
			u64 ts_packets;
			u64 ts_lost;
			u64 stop;
			u64 wake;
		} twq;
		struct {
			u64 alloc_failed;