Patch "virtio_net: Fix probe failed when modprobe virtio_net" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    virtio_net: Fix probe failed when modprobe virtio_net

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     virtio_net-fix-probe-failed-when-modprobe-virtio_net.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 3e369b6b4a4d52c75e81457fb2f1685c529ee137
Author: Li Zetao <lizetao1@xxxxxxxxxx>
Date:   Tue Nov 22 23:00:46 2022 +0800

    virtio_net: Fix probe failed when modprobe virtio_net
    
    [ Upstream commit b0686565946368892c2cdf92f102392e24823588 ]
    
    When doing the following test steps, an error was found:
      step 1: modprobe virtio_net succeeded
        # modprobe virtio_net        <-- OK
    
      step 2: fault injection in register_netdevice()
        # modprobe -r virtio_net     <-- OK
        # ...
          FAULT_INJECTION: forcing a failure.
          name failslab, interval 1, probability 0, space 0, times 0
          CPU: 0 PID: 3521 Comm: modprobe
          Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
          Call Trace:
           <TASK>
           ...
           should_failslab+0xa/0x20
           ...
           dev_set_name+0xc0/0x100
           netdev_register_kobject+0xc2/0x340
           register_netdevice+0xbb9/0x1320
           virtnet_probe+0x1d72/0x2658 [virtio_net]
           ...
           </TASK>
          virtio_net: probe of virtio0 failed with error -22
    
      step 3: modprobe virtio_net failed
        # modprobe virtio_net        <-- failed
          virtio_net: probe of virtio0 failed with error -2
    
    The root cause of the problem is that the queues are not
    disable on the error handling path when register_netdevice()
    fails in virtnet_probe(), resulting in an error "-ENOENT"
    returned in the next modprobe call in setup_vq().
    
    virtio_pci_modern_device uses virtqueues to send or
    receive message, and "queue_enable" records whether the
    queues are available. In vp_modern_find_vqs(), all queues
    will be selected and activated, but once queues are enabled
    there is no way to go back except reset.
    
    Fix it by reset virtio device on error handling path. This
    makes error handling follow the same order as normal device
    cleanup in virtnet_remove() which does: unregister, destroy
    failover, then reset. And that flow is better tested than
    error handling so we can be reasonably sure it works well.
    
    Fixes: 024655555021 ("virtio_net: fix use after free on allocation failure")
    Signed-off-by: Li Zetao <lizetao1@xxxxxxxxxx>
    Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221122150046.3910638-1-lizetao1@xxxxxxxxxx
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 9cce7dec7366..f5c88d232b11 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -3933,12 +3933,11 @@ static int virtnet_probe(struct virtio_device *vdev)
 	return 0;
 
 free_unregister_netdev:
-	virtio_reset_device(vdev);
-
 	unregister_netdev(dev);
 free_failover:
 	net_failover_destroy(vi->failover);
 free_vqs:
+	virtio_reset_device(vdev);
 	cancel_delayed_work_sync(&vi->refill);
 	free_receive_page_frags(vi);
 	virtnet_del_vqs(vi);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux