virtio_net: fix virtnet_open and virtnet_probe competing for try_fill_recv
Subsystems (3)
PATCH v2 1/1 virtio_net: fix virtnet_open and virtnet_probe competing for try_fill_recv
In function virtnet_open() and virtnet_probe(), func try_fill_recv() will be executed at the same time. VQ in virtqueue_add() is not protected well and BUG_ON will be triggered when virito_net.ko being removed.
--- drivers/net/virtio_net.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)
drivers/net/virtio_net.c +2 -16
@@ -1925,24 +1925,11 @@ static int virtnet_probe(struct virtio_device *vdev)virtio_device_ready (vdev); -/* Last of all, set up some receive buffers. */ -for (i =0 ; i < vi->curr_queue_pairs; i++) { -try_fill_recv (vi, &vi->rq[i],GFP_KERNEL ); - -/* If we didn't even get one input buffer, we're useless. */ -if (vi->rq[i].vq->num_free == -virtqueue_get_vring_size (vi->rq[i].vq)) { -free_unused_bufs (vi); - err = -ENOMEM ; - goto free_recv_bufs; - } - } - vi->nb.notifier_call = &virtnet_cpu_callback; err =register_hotcpu_notifier (&vi->nb);if (err) {pr_debug ("virtio_net: registering cpu notifier failed\n" ); - goto free_recv_bufs; + goto free_unregister_netdev; }/* Assume link up if device can't report link status,
@@ -1960,10 +1947,9 @@ static int virtnet_probe(struct virtio_device *vdev)return 0 ; -free_recv_bufs: +free_unregister_netdev: vi->vdev->config->reset (vdev); -free_receive_bufs (vi);unregister_netdev (dev); free_vqs:cancel_delayed_work_sync (&vi->refill);
Quoted 8 lines · wangyunjian
In function
virtnet_open()andvirtnet_probe(), functry_fill_recv()will be executed at the same time. VQ invirtqueue_add()is not protected well andBUG_ONwill be triggered when virito_net.ko being removed.Signed-off-by Yunjian Wang <[email protected]>--- drivers/net/virtio_net.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)
The patch is needed for stable.
Quoted 47 lines
drivers/net/virtio_net.c +2
-17@@ -1925,24 +1925,11 @@ static int virtnet_probe(struct virtio_device *vdev)virtio_device_ready (vdev); -/* Last of all, set up some receive buffers. */ -for (i =0 ; i < vi->curr_queue_pairs; i++) { -try_fill_recv (vi, &vi->rq[i],GFP_KERNEL ); - -/* If we didn't even get one input buffer, we're useless. */ -if (vi->rq[i].vq->num_free == -virtqueue_get_vring_size (vi->rq[i].vq)) { -free_unused_bufs (vi); - err = -ENOMEM ; - goto free_recv_bufs; - } - } - vi->nb.notifier_call = &virtnet_cpu_callback; err =register_hotcpu_notifier (&vi->nb);if (err) {pr_debug ("virtio_net: registering cpu notifier failed\n" ); - goto free_recv_bufs; + goto free_unregister_netdev; }/* Assume link up if device can't report link status, @@ -1960,10 +1947,9 @@ static int virtnet_probe(struct virtio_device *vdev)return 0 ; -free_recv_bufs: +free_unregister_netdev: vi->vdev->config->reset (vdev); -free_receive_bufs (vi);unregister_netdev (dev); free_vqs:cancel_delayed_work_sync (&vi->refill); --1.7.12.4
Quoted 5 lines · wangyunjian
In function
virtnet_open()andvirtnet_probe(), functry_fill_recv()will be executed at the same time. VQ invirtqueue_add()is not protected well andBUG_ONwill be triggered when virito_net.ko being removed.Signed-off-by Yunjian Wang <[email protected]>
Quoted 49 lines
--- drivers/net/virtio_net.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)drivers/net/virtio_net.c +2
-17@@ -1925,24 +1925,11 @@ static int virtnet_probe(struct virtio_device *vdev)virtio_device_ready (vdev); -/* Last of all, set up some receive buffers. */ -for (i =0 ; i < vi->curr_queue_pairs; i++) { -try_fill_recv (vi, &vi->rq[i],GFP_KERNEL ); - -/* If we didn't even get one input buffer, we're useless. */ -if (vi->rq[i].vq->num_free == -virtqueue_get_vring_size (vi->rq[i].vq)) { -free_unused_bufs (vi); - err = -ENOMEM ; - goto free_recv_bufs; - } - } - vi->nb.notifier_call = &virtnet_cpu_callback; err =register_hotcpu_notifier (&vi->nb);if (err) {pr_debug ("virtio_net: registering cpu notifier failed\n" ); - goto free_recv_bufs; + goto free_unregister_netdev; }/* Assume link up if device can't report link status, @@ -1960,10 +1947,9 @@ static int virtnet_probe(struct virtio_device *vdev)return 0 ; -free_recv_bufs: +free_unregister_netdev: vi->vdev->config->reset (vdev); -free_receive_bufs (vi);unregister_netdev (dev); free_vqs:cancel_delayed_work_sync (&vi->refill); --1.7.12.4
David Miller
maintainerFrom: wangyunjian <[email protected]>
Date: Thu, 26 May 2016 14:27:59 +0800
Quoted 5 lines
In function
virtnet_open()andvirtnet_probe(), functry_fill_recv()will be executed at the same time. VQ invirtqueue_add()is not protected well andBUG_ONwill be triggered when virito_net.ko being removed.Signed-off-by Yunjian Wang <[email protected]>
Patch is whitespace damanged by your email client.
Fix this, email a test patch to yourself, and do not try to resubmit this patch to the mailing list until you can successfully apply one of those test patches.
Thanks.