| From foo@baz Tue Mar 6 19:02:56 PST 2018 |
| From: Jason Wang <jasowang@redhat.com> |
| Date: Wed, 28 Feb 2018 18:20:04 +0800 |
| Subject: virtio-net: disable NAPI only when enabled during XDP set |
| |
| From: Jason Wang <jasowang@redhat.com> |
| |
| |
| [ Upstream commit 4e09ff5362843dff3accfa84c805c7f3a99de9cd ] |
| |
| We try to disable NAPI to prevent a single XDP TX queue being used by |
| multiple cpus. But we don't check if device is up (NAPI is enabled), |
| this could result stall because of infinite wait in |
| napi_disable(). Fixing this by checking device state through |
| netif_running() before. |
| |
| Fixes: 4941d472bf95b ("virtio-net: do not reset during XDP set") |
| Signed-off-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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/virtio_net.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/virtio_net.c |
| +++ b/drivers/net/virtio_net.c |
| @@ -2040,8 +2040,9 @@ static int virtnet_xdp_set(struct net_de |
| } |
| |
| /* Make sure NAPI is not using any XDP TX queues for RX. */ |
| - for (i = 0; i < vi->max_queue_pairs; i++) |
| - napi_disable(&vi->rq[i].napi); |
| + if (netif_running(dev)) |
| + for (i = 0; i < vi->max_queue_pairs; i++) |
| + napi_disable(&vi->rq[i].napi); |
| |
| netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp); |
| err = _virtnet_set_queues(vi, curr_qp + xdp_qp); |
| @@ -2060,7 +2061,8 @@ static int virtnet_xdp_set(struct net_de |
| } |
| if (old_prog) |
| bpf_prog_put(old_prog); |
| - virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi); |
| + if (netif_running(dev)) |
| + virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi); |
| } |
| |
| return 0; |