Xuan Zhuo
2022-Aug-11 08:02 UTC
[PATCH vhost 0/2] virtio_net: fix for stuck when change ring size with dev down
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. PS. Hi Michael, I don't know which way is more convenient for you, so I split the commit into two commits, so you can fixup to my previous commit: virtio_net: support tx queue resize virtio_net: support rx queue resize Xuan Zhuo (2): virtio_net: fix for stuck when change rx ring size with dev down virtio_net: fix for stuck when change tx ring size with dev down drivers/net/virtio_net.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) -- 2.31.0
Xuan Zhuo
2022-Aug-11 08:02 UTC
[PATCH 1/2] virtio_net: fix for stuck when change rx ring size with dev down
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 at linux.alibaba.com> Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com> --- 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
Xuan Zhuo
2022-Aug-11 08:02 UTC
[PATCH 2/2] virtio_net: fix for stuck when change tx ring size with dev down
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 at linux.alibaba.com> Signed-off-by: Xuan Zhuo <xuanzhuo at linux.alibaba.com> --- 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 17687eb3f0bd..d9c434b00e9b 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -1915,12 +1915,14 @@ static int virtnet_rx_resize(struct virtnet_info *vi, static int virtnet_tx_resize(struct virtnet_info *vi, struct send_queue *sq, u32 ring_num) { + bool running = netif_running(vi->dev); struct netdev_queue *txq; int err, qindex; qindex = sq - vi->sq; - virtnet_napi_tx_disable(&sq->napi); + if (running) + virtnet_napi_tx_disable(&sq->napi); txq = netdev_get_tx_queue(vi->dev, qindex); @@ -1946,7 +1948,8 @@ static int virtnet_tx_resize(struct virtnet_info *vi, netif_tx_wake_queue(txq); __netif_tx_unlock_bh(txq); - virtnet_napi_tx_enable(vi, sq->vq, &sq->napi); + if (running) + virtnet_napi_tx_enable(vi, sq->vq, &sq->napi); return err; } -- 2.31.0
Michael S. Tsirkin
2022-Aug-11 08:11 UTC
[PATCH vhost 0/2] virtio_net: fix for stuck when change ring size with dev down
On Thu, Aug 11, 2022 at 04:02:56PM +0800, Xuan Zhuo wrote:> 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. > > PS. > Hi Michael, I don't know which way is more convenient for you, so I split the > commit into two commits, so you can fixup to my previous commit: > > virtio_net: support tx queue resize > virtio_net: support rx queue resize > > Xuan Zhuo (2): > virtio_net: fix for stuck when change rx ring size with dev down > virtio_net: fix for stuck when change tx ring size with dev down > > drivers/net/virtio_net.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-)Which patches does this fix? Maybe I should squash.> -- > 2.31.0