mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 07:54:36 -05:00
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:
committed by
David S. Miller
parent
db3067c8aa
commit
b3411dbdaa
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user