From: Longjun Tang <[email protected]> Add an rx_timeouts field to the per-queue RX statistics and expose it via ethtool. Whenever an RX queue gets stuck, the NAPI poll increments rx_timeouts, so it counts RX queue stuck events.
Signed-off-by: Longjun Tang <[email protected]> --- drivers/net/virtio_net.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ec7c248080c5..feb6bfbb1c5a 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -135,6 +135,7 @@ struct virtnet_rq_stats { u64_stats_t xdp_redirects; u64_stats_t xdp_drops; u64_stats_t kicks; + u64_stats_t rx_timeouts; }; #define VIRTNET_SQ_STAT(name, m) {name, offsetof(struct virtnet_sq_stats, m), -1} @@ -168,6 +169,7 @@ static const struct virtnet_stat_desc virtnet_rq_stats_desc[] = { VIRTNET_RQ_STAT("xdp_redirects", xdp_redirects), VIRTNET_RQ_STAT("xdp_drops", xdp_drops), VIRTNET_RQ_STAT("kicks", kicks), + VIRTNET_RQ_STAT("rx_timeouts", rx_timeouts), }; static const struct virtnet_stat_desc virtnet_sq_stats_desc_qstat[] = { @@ -2983,6 +2985,12 @@ static int virtnet_receive(struct receive_queue *rq, int budget, u64_stats_add(item, u64_stats_read(src)); } + /* Count a stall recovered by this poll. */ + if (rq->watchdog.stalled) { + u64_stats_inc(&rq->stats.rx_timeouts); + rq->watchdog.stalled = false; + } + u64_stats_add(&rq->stats.packets, u64_stats_read(&stats.packets)); u64_stats_add(&rq->stats.bytes, u64_stats_read(&stats.bytes)); u64_stats_add(&rq->stats.alloc_fail, u64_stats_read(&stats.alloc_fail)); -- 2.51.0
