forked from luck/tmp_suning_uos_patched
virtio-net: clean tx descriptors from rx napi
Amortize the cost of virtual interrupts by doing both rx and tx work on reception of a receive interrupt if tx napi is enabled. With VIRTIO_F_EVENT_IDX, this suppresses most explicit tx completion interrupts for bidirectional workloads. Signed-off-by: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ea7735d97b
commit
7b0411ef4a
|
@ -1075,12 +1075,33 @@ static void free_old_xmit_skbs(struct send_queue *sq)
|
|||
u64_stats_update_end(&stats->tx_syncp);
|
||||
}
|
||||
|
||||
static void virtnet_poll_cleantx(struct receive_queue *rq)
|
||||
{
|
||||
struct virtnet_info *vi = rq->vq->vdev->priv;
|
||||
unsigned int index = vq2rxq(rq->vq);
|
||||
struct send_queue *sq = &vi->sq[index];
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(vi->dev, index);
|
||||
|
||||
if (!sq->napi.weight)
|
||||
return;
|
||||
|
||||
if (__netif_tx_trylock(txq)) {
|
||||
free_old_xmit_skbs(sq);
|
||||
__netif_tx_unlock(txq);
|
||||
}
|
||||
|
||||
if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
|
||||
netif_tx_wake_queue(txq);
|
||||
}
|
||||
|
||||
static int virtnet_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct receive_queue *rq =
|
||||
container_of(napi, struct receive_queue, napi);
|
||||
unsigned int received;
|
||||
|
||||
virtnet_poll_cleantx(rq);
|
||||
|
||||
received = virtnet_receive(rq, budget);
|
||||
|
||||
/* Out of packets? */
|
||||
|
|
Loading…
Reference in New Issue
Block a user