lkml.org 
[lkml]   [2018]   [Oct]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.18 28/33] virtio_net: avoid using netif_tx_disable() for serializing tx routine
    Date
    From: Ake Koomsin <ake@igel.co.jp>

    [ Upstream commit 05c998b738fdd3e5d6a257bcacc8f34b6284d795 ]

    Commit 713a98d90c5e ("virtio-net: serialize tx routine during reset")
    introduces netif_tx_disable() after netif_device_detach() in order to
    avoid use-after-free of tx queues. However, there are two issues.

    1) Its operation is redundant with netif_device_detach() in case the
    interface is running.
    2) In case of the interface is not running before suspending and
    resuming, the tx does not get resumed by netif_device_attach().
    This results in losing network connectivity.

    It is better to use netif_tx_lock_bh()/netif_tx_unlock_bh() instead for
    serializing tx routine during reset. This also preserves the symmetry
    of netif_device_detach() and netif_device_attach().

    Fixes commit 713a98d90c5e ("virtio-net: serialize tx routine during reset")
    Signed-off-by: Ake Koomsin <ake@igel.co.jp>
    Acked-by: Jason Wang <jasowang@redhat.com>
    Acked-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/virtio_net.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
    index 2b6ec927809e..500e2d8f10bc 100644
    --- a/drivers/net/virtio_net.c
    +++ b/drivers/net/virtio_net.c
    @@ -2162,8 +2162,9 @@ static void virtnet_freeze_down(struct virtio_device *vdev)
    /* Make sure no work handler is accessing the device */
    flush_work(&vi->config_work);

    + netif_tx_lock_bh(vi->dev);
    netif_device_detach(vi->dev);
    - netif_tx_disable(vi->dev);
    + netif_tx_unlock_bh(vi->dev);
    cancel_delayed_work_sync(&vi->refill);

    if (netif_running(vi->dev)) {
    @@ -2199,7 +2200,9 @@ static int virtnet_restore_up(struct virtio_device *vdev)
    }
    }

    + netif_tx_lock_bh(vi->dev);
    netif_device_attach(vi->dev);
    + netif_tx_unlock_bh(vi->dev);
    return err;
    }

    --
    2.17.1
    \
     
     \ /
      Last update: 2018-10-30 14:32    [W:4.321 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site