virtio-net: add missing virtqueue kick when flushing packets

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: 186b3c998c ("virtio-net: support XDP_REDIRECT")
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jason Wang 2018-04-13 14:58:25 +08:00 коммит произвёл David S. Miller
Родитель 2290482379
Коммит 9267c430c6
1 изменённых файлов: 9 добавлений и 2 удалений

Просмотреть файл

@ -1269,7 +1269,9 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
{ {
struct receive_queue *rq = struct receive_queue *rq =
container_of(napi, struct receive_queue, napi); 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; bool xdp_xmit = false;
virtnet_poll_cleantx(rq); virtnet_poll_cleantx(rq);
@ -1280,8 +1282,13 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
if (received < budget) if (received < budget)
virtqueue_napi_complete(napi, rq->vq, received); 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(); xdp_do_flush_map();
}
return received; return received;
} }