This place is fetching the stats, so u64_stats_fetch_begin and u64_stats_fetch_retry should be used Fixes: 6208799553a8 ("virtio-net: support rx netdim") Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx> --- drivers/net/virtio_net.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 61a57d1..b669e73 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -2332,16 +2332,18 @@ static void virtnet_poll_cleantx(struct receive_queue *rq) static void virtnet_rx_dim_update(struct virtnet_info *vi, struct receive_queue *rq) { struct dim_sample cur_sample = {}; + unsigned int start; if (!rq->packets_in_napi) return; - u64_stats_update_begin(&rq->stats.syncp); - dim_update_sample(rq->calls, - u64_stats_read(&rq->stats.packets), - u64_stats_read(&rq->stats.bytes), - &cur_sample); - u64_stats_update_end(&rq->stats.syncp); + do { + start = u64_stats_fetch_begin(&rq->stats.syncp); + dim_update_sample(rq->calls, + u64_stats_read(&rq->stats.packets), + u64_stats_read(&rq->stats.bytes), + &cur_sample); + } while (u64_stats_fetch_retry(&rq->stats.syncp, start)); net_dim(&rq->dim, cur_sample); rq->packets_in_napi = 0; -- 2.9.4