When dev is set to DOWN state, napi has been disabled, if we modify the ring size at this time, we should not call napi_disable() again, which will cause stuck. And all operations are under the protection of rtnl_lock, so there is no need to consider concurrency issues. Reported-by: Kangjie Xu <kangjie.xu@xxxxxxxxxxxxxxxxx> Signed-off-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> --- drivers/net/virtio_net.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 816c613c22f7..17687eb3f0bd 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -1892,11 +1892,13 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) static int virtnet_rx_resize(struct virtnet_info *vi, struct receive_queue *rq, u32 ring_num) { + bool running = netif_running(vi->dev); int err, qindex; qindex = rq - vi->rq; - napi_disable(&rq->napi); + if (running) + napi_disable(&rq->napi); err = virtqueue_resize(rq->vq, ring_num, virtnet_rq_free_unused_buf); if (err) @@ -1905,7 +1907,8 @@ static int virtnet_rx_resize(struct virtnet_info *vi, if (!try_fill_recv(vi, rq, GFP_KERNEL)) schedule_delayed_work(&vi->refill, 0); - virtnet_napi_enable(rq->vq, &rq->napi); + if (running) + virtnet_napi_enable(rq->vq, &rq->napi); return err; } -- 2.31.0 _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization