diff options
Diffstat (limited to 'drivers/net/virtio_net.c')
| -rw-r--r-- | drivers/net/virtio_net.c | 14 | 
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 7723b2a49d8e..61e33e4dd0cd 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -1677,13 +1677,13 @@ static int virtnet_poll(struct napi_struct *napi, int budget)  	received = virtnet_receive(rq, budget, &xdp_xmit); +	if (xdp_xmit & VIRTIO_XDP_REDIR) +		xdp_do_flush(); +  	/* Out of packets? */  	if (received < budget)  		virtqueue_napi_complete(napi, rq->vq, received); -	if (xdp_xmit & VIRTIO_XDP_REDIR) -		xdp_do_flush(); -  	if (xdp_xmit & VIRTIO_XDP_TX) {  		sq = virtnet_xdp_get_sq(vi);  		if (virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq)) { @@ -1877,8 +1877,10 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)  	 */  	if (sq->vq->num_free < 2+MAX_SKB_FRAGS) {  		netif_stop_subqueue(dev, qnum); -		if (!use_napi && -		    unlikely(!virtqueue_enable_cb_delayed(sq->vq))) { +		if (use_napi) { +			if (unlikely(!virtqueue_enable_cb_delayed(sq->vq))) +				virtqueue_napi_schedule(&sq->napi, sq->vq); +		} else if (unlikely(!virtqueue_enable_cb_delayed(sq->vq))) {  			/* More just got used, free them then recheck. */  			free_old_xmit_skbs(sq, false);  			if (sq->vq->num_free >= 2+MAX_SKB_FRAGS) { @@ -2156,8 +2158,8 @@ static int virtnet_close(struct net_device *dev)  	cancel_delayed_work_sync(&vi->refill);  	for (i = 0; i < vi->max_queue_pairs; i++) { -		xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);  		napi_disable(&vi->rq[i].napi); +		xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);  		virtnet_napi_tx_disable(&vi->sq[i].napi);  	}  | 
