virtio_net: Fix stalled inbound traffic on early packets
Subsystems (3)
PATCH 1/1 virtio_net: Fix stalled inbound traffic on early packets
The current virtio_net driver has a startup race, which prevents any incoming traffic:
If try_fill_recv submits buffers to the host system data might be filled in and an interrupt is sent, before napi_enable finishes. In that case the interrupt will kick skb_recv_done which will then call netif_rx_schedule. netif_rx_schedule checks, if NAPI_STATE_SCHED is set - which is not as we did not run napi_enable. No poll routine is scheduled. Furthermore, skb_recv_done returns false, we disables interrupts for this device.
One solution is the enable napi before inbound buffer are available.
Signed-off-by Christian Borntraeger <[email protected]>
--- drivers/net/virtio_net.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/virtio_net.c +4 -2
@@ -285,13 +285,15 @@ static int virtnet_open(struct net_devic {struct virtnet_info *vi =netdev_priv (dev); +napi_enable (&vi->napi);try_fill_recv (vi);/* If we didn't even get one input buffer, we're useless. */ -if (vi->num ==0 ) +if (vi->num ==0 ) { +napi_disable (&vi->napi);return -ENOMEM ; + } -napi_enable (&vi->napi);return 0 ; }