sfc: add per-queue RX bytes stats

While this does add overhead to the fast path, it should be minimal
 as the cacheline should already be held for write from updating the
 queue's rx_packets stat.

Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Edward Cree
2024-09-30 14:52:45 +01:00
committed by David S. Miller
parent db3067c8aa
commit b3411dbdaa
5 changed files with 11 additions and 0 deletions

View File

@@ -135,6 +135,7 @@ void __ef100_rx_packet(struct efx_channel *channel)
}
++rx_queue->rx_packets;
rx_queue->rx_bytes += rx_buf->len;
efx_rx_packet_gro(channel, rx_buf, channel->rx_pkt_n_frags, eh, csum);
goto out;

View File

@@ -638,6 +638,7 @@ static void efx_get_queue_stats_rx(struct net_device *net_dev, int idx,
rx_queue = efx_channel_get_rx_queue(channel);
/* Count only packets since last time datapath was started */
stats->packets = rx_queue->rx_packets - rx_queue->old_rx_packets;
stats->bytes = rx_queue->rx_bytes - rx_queue->old_rx_bytes;
stats->hw_drops = efx_get_queue_stat_rx_hw_drops(channel) -
channel->old_n_rx_hw_drops;
stats->hw_drop_overruns = channel->n_rx_nodesc_trunc -
@@ -682,6 +683,7 @@ static void efx_get_base_stats(struct net_device *net_dev,
struct efx_channel *channel;
rx->packets = 0;
rx->bytes = 0;
rx->hw_drops = 0;
rx->hw_drop_overruns = 0;
tx->packets = 0;
@@ -696,10 +698,12 @@ static void efx_get_base_stats(struct net_device *net_dev,
rx_queue = efx_channel_get_rx_queue(channel);
if (channel->channel >= net_dev->real_num_rx_queues) {
rx->packets += rx_queue->rx_packets;
rx->bytes += rx_queue->rx_bytes;
rx->hw_drops += efx_get_queue_stat_rx_hw_drops(channel);
rx->hw_drop_overruns += channel->n_rx_nodesc_trunc;
} else {
rx->packets += rx_queue->old_rx_packets;
rx->bytes += rx_queue->old_rx_bytes;
rx->hw_drops += channel->old_n_rx_hw_drops;
rx->hw_drop_overruns += channel->old_n_rx_hw_drop_overruns;
}

View File

@@ -400,7 +400,9 @@ struct efx_rx_page_state {
* @slow_fill: Timer used to defer efx_nic_generate_fill_event().
* @grant_work: workitem used to grant credits to the MAE if @grant_credits
* @rx_packets: Number of packets received since this struct was created
* @rx_bytes: Number of bytes received since this struct was created
* @old_rx_packets: Value of @rx_packets as of last efx_init_rx_queue()
* @old_rx_bytes: Value of @rx_bytes as of last efx_init_rx_queue()
* @xdp_rxq_info: XDP specific RX queue information.
* @xdp_rxq_info_valid: Is xdp_rxq_info valid data?.
*/
@@ -437,7 +439,9 @@ struct efx_rx_queue {
struct work_struct grant_work;
/* Statistics to supplement MAC stats */
unsigned long rx_packets;
unsigned long rx_bytes;
unsigned long old_rx_packets;
unsigned long old_rx_bytes;
struct xdp_rxq_info xdp_rxq_info;
bool xdp_rxq_info_valid;
};

View File

@@ -393,6 +393,7 @@ void __efx_rx_packet(struct efx_channel *channel)
}
rx_queue->rx_packets++;
rx_queue->rx_bytes += rx_buf->len;
if (!efx_do_xdp(efx, channel, rx_buf, &eh))
goto out;

View File

@@ -242,6 +242,7 @@ void efx_init_rx_queue(struct efx_rx_queue *rx_queue)
rx_queue->page_recycle_full = 0;
rx_queue->old_rx_packets = rx_queue->rx_packets;
rx_queue->old_rx_bytes = rx_queue->rx_bytes;
/* Initialise limit fields */
max_fill = efx->rxq_entries - EFX_RXD_HEAD_ROOM;