| From foo@baz Fri Mar 16 15:43:17 CET 2018 |
| From: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> |
| Date: Thu, 7 Dec 2017 13:15:15 +0900 |
| Subject: virtio_net: Disable interrupts if napi_complete_done rescheduled napi |
| |
| From: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> |
| |
| |
| [ Upstream commit fdaa767aefc1685f9a41e91f447c9aea94103df6 ] |
| |
| Since commit 39e6c8208d7b ("net: solve a NAPI race") napi has been able |
| to be rescheduled within napi_complete_done() even in non-busypoll case, |
| but virtnet_poll() always enabled interrupts before complete, and when |
| napi was rescheduled within napi_complete_done() it did not disable |
| interrupts. |
| This caused more interrupts when event idx is disabled. |
| |
| According to commit cbdadbbf0c79 ("virtio_net: fix race in RX VQ |
| processing") we cannot place virtqueue_enable_cb_prepare() after |
| NAPI_STATE_SCHED is cleared, so disable interrupts again if |
| napi_complete_done() returned false. |
| |
| Tested with vhost-user of OVS 2.7 on host, which does not have the event |
| idx feature. |
| |
| * Before patch: |
| |
| $ netperf -t UDP_STREAM -H 192.168.150.253 -l 60 -- -m 1472 |
| MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.150.253 () port 0 AF_INET |
| Socket Message Elapsed Messages |
| Size Size Time Okay Errors Throughput |
| bytes bytes secs # # 10^6bits/sec |
| |
| 212992 1472 60.00 32763206 0 6430.32 |
| 212992 60.00 23384299 4589.56 |
| |
| Interrupts on guest: 9872369 |
| Packets/interrupt: 2.37 |
| |
| * After patch |
| |
| $ netperf -t UDP_STREAM -H 192.168.150.253 -l 60 -- -m 1472 |
| MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.150.253 () port 0 AF_INET |
| Socket Message Elapsed Messages |
| Size Size Time Okay Errors Throughput |
| bytes bytes secs # # 10^6bits/sec |
| |
| 212992 1472 60.00 32794646 0 6436.49 |
| 212992 60.00 32793501 6436.27 |
| |
| Interrupts on guest: 4941299 |
| Packets/interrupt: 6.64 |
| |
| Signed-off-by: Toshiaki Makita <makita.toshiaki@lab.ntt.co.jp> |
| Acked-by: Michael S. Tsirkin <mst@redhat.com> |
| Acked-by: Jason Wang <jasowang@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/virtio_net.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/virtio_net.c |
| +++ b/drivers/net/virtio_net.c |
| @@ -260,9 +260,12 @@ static void virtqueue_napi_complete(stru |
| int opaque; |
| |
| opaque = virtqueue_enable_cb_prepare(vq); |
| - if (napi_complete_done(napi, processed) && |
| - unlikely(virtqueue_poll(vq, opaque))) |
| - virtqueue_napi_schedule(napi, vq); |
| + if (napi_complete_done(napi, processed)) { |
| + if (unlikely(virtqueue_poll(vq, opaque))) |
| + virtqueue_napi_schedule(napi, vq); |
| + } else { |
| + virtqueue_disable_cb(vq); |
| + } |
| } |
| |
| static void skb_xmit_done(struct virtqueue *vq) |