]> git.baikalelectronics.ru Git - kernel.git/commit
virtio_net: Don't call free_old_xmit_skbs for xdp_frames
authorToshiaki Makita <makita.toshiaki@lab.ntt.co.jp>
Tue, 29 Jan 2019 00:45:54 +0000 (09:45 +0900)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Jan 2019 22:02:43 +0000 (14:02 -0800)
commitaa25da29b74f76a1e4a216d3c73378c9962dc974
treedd53d86b074dd37cbde3ec6e9eeeb6ce0ec3375d
parentc7aca8dc92feca29cb42a717d3ef0c3fae7dc4bf
virtio_net: Don't call free_old_xmit_skbs for xdp_frames

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: 721a8191dfb7 ("virtio-net: transmit napi")
Fixes: 06483a3cbc47 ("virtio-net: clean tx descriptors from rx napi")
Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.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>
drivers/net/virtio_net.c