@@ -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;