• Toshiaki Makita's avatar
    virtio_net: Differentiate sk_buff and xdp_frame on freeing · 5050471d
    Toshiaki Makita authored
    We do not reset or free up unused buffers when enabling/disabling XDP,
    so it can happen that xdp_frames are freed after disabling XDP or
    sk_buffs are freed after enabling XDP on xdp tx queues.
    Thus we need to handle both forms (xdp_frames and sk_buffs) regardless
    of XDP setting.
    One way to trigger this problem is to disable XDP when napi_tx is
    enabled. In that case, virtnet_xdp_set() calls virtnet_napi_enable()
    which kicks NAPI. The NAPI handler will call virtnet_poll_cleantx()
    which invokes free_old_xmit_skbs() for queues which have been used by
    XDP.
    
    Note that even with this change we need to keep skipping
    free_old_xmit_skbs() from NAPI handlers when XDP is enabled, because XDP
    tx queues do not aquire queue locks.
    
    - v2: Use napi_consume_skb() instead of dev_consume_skb_any()
    
    Fixes: 4941d472 ("virtio-net: do not reset during XDP set")
    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>
    5050471d
virtio_net.c 85.1 KB