| From foo@baz Thu Apr 26 20:46:44 CEST 2018 |
| From: Jason Wang <jasowang@redhat.com> |
| Date: Fri, 13 Apr 2018 14:58:25 +0800 |
| Subject: virtio-net: add missing virtqueue kick when flushing packets |
| |
| From: Jason Wang <jasowang@redhat.com> |
| |
| |
| [ Upstream commit 9267c430c6b6f4c0120e3c6bb847313d633f02a6 ] |
| |
| We tends to batch submitting packets during XDP_TX. This requires to |
| kick virtqueue after a batch, we tried to do it through |
| xdp_do_flush_map() which only makes sense for devmap not XDP_TX. So |
| explicitly kick the virtqueue in this case. |
| |
| Reported-by: Kimitoshi Takahashi <ktaka@nii.ac.jp> |
| Tested-by: Kimitoshi Takahashi <ktaka@nii.ac.jp> |
| Cc: Daniel Borkmann <daniel@iogearbox.net> |
| Fixes: 186b3c998c50 ("virtio-net: support XDP_REDIRECT") |
| Signed-off-by: Jason Wang <jasowang@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 | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/virtio_net.c |
| +++ b/drivers/net/virtio_net.c |
| @@ -1269,7 +1269,9 @@ static int virtnet_poll(struct napi_stru |
| { |
| struct receive_queue *rq = |
| container_of(napi, struct receive_queue, napi); |
| - unsigned int received; |
| + struct virtnet_info *vi = rq->vq->vdev->priv; |
| + struct send_queue *sq; |
| + unsigned int received, qp; |
| bool xdp_xmit = false; |
| |
| virtnet_poll_cleantx(rq); |
| @@ -1280,8 +1282,13 @@ static int virtnet_poll(struct napi_stru |
| if (received < budget) |
| virtqueue_napi_complete(napi, rq->vq, received); |
| |
| - if (xdp_xmit) |
| + if (xdp_xmit) { |
| + qp = vi->curr_queue_pairs - vi->xdp_queue_pairs + |
| + smp_processor_id(); |
| + sq = &vi->sq[qp]; |
| + virtqueue_kick(sq->vq); |
| xdp_do_flush_map(); |
| + } |
| |
| return received; |
| } |