• Toshiaki Makita's avatar
    virtio_net: Don't call free_old_xmit_skbs for xdp_frames · 4c2e63dc
    Toshiaki Makita authored
    [ Upstream commit 534da5e8 ]
    
    When napi_tx is enabled, virtnet_poll_cleantx() called
    free_old_xmit_skbs() even for xdp send queue.
    This is bogus since the queue has xdp_frames, not sk_buffs, thus mangled
    device tx bytes counters because skb->len is meaningless value, and even
    triggered oops due to general protection fault on freeing them.
    
    Since xdp send queues do not aquire locks, old xdp_frames should be
    freed only in virtnet_xdp_xmit(), so just skip free_old_xmit_skbs() for
    xdp send queues.
    
    Similarly virtnet_poll_tx() called free_old_xmit_skbs(). This NAPI
    handler is called even without calling start_xmit() because cb for tx is
    by default enabled. Once the handler is called, it enabled the cb again,
    and then the handler would be called again. We don't need this handler
    for XDP, so don't enable cb as well as not calling free_old_xmit_skbs().
    
    Also, we need to disable tx NAPI when disabling XDP, so
    virtnet_poll_tx() can safely access curr_queue_pairs and
    xdp_queue_pairs, which are not atomically updated while disabling XDP.
    
    Fixes: b92f1e67 ("virtio-net: transmit napi")
    Fixes: 7b0411ef ("virtio-net: clean tx descriptors from rx napi")
    Signed-off-by: default avatarToshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4c2e63dc
virtio_net.c 82.1 KB