diff options
-rw-r--r-- | drivers/net/virtio_net.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ee022714eadb..ff208d2787d3 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -545,7 +545,8 @@ static bool try_fill_recv(struct receive_queue *rq, gfp_t gfp) | |||
545 | } while (rq->vq->num_free); | 545 | } while (rq->vq->num_free); |
546 | if (unlikely(rq->num > rq->max)) | 546 | if (unlikely(rq->num > rq->max)) |
547 | rq->max = rq->num; | 547 | rq->max = rq->num; |
548 | virtqueue_kick(rq->vq); | 548 | if (unlikely(!virtqueue_kick(rq->vq))) |
549 | return false; | ||
549 | return !oom; | 550 | return !oom; |
550 | } | 551 | } |
551 | 552 | ||
@@ -751,7 +752,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
751 | err = xmit_skb(sq, skb); | 752 | err = xmit_skb(sq, skb); |
752 | 753 | ||
753 | /* This should not happen! */ | 754 | /* This should not happen! */ |
754 | if (unlikely(err)) { | 755 | if (unlikely(err) || unlikely(!virtqueue_kick(sq->vq))) { |
755 | dev->stats.tx_fifo_errors++; | 756 | dev->stats.tx_fifo_errors++; |
756 | if (net_ratelimit()) | 757 | if (net_ratelimit()) |
757 | dev_warn(&dev->dev, | 758 | dev_warn(&dev->dev, |
@@ -760,7 +761,6 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
760 | kfree_skb(skb); | 761 | kfree_skb(skb); |
761 | return NETDEV_TX_OK; | 762 | return NETDEV_TX_OK; |
762 | } | 763 | } |
763 | virtqueue_kick(sq->vq); | ||
764 | 764 | ||
765 | /* Don't wait up for transmitted skbs to be freed. */ | 765 | /* Don't wait up for transmitted skbs to be freed. */ |
766 | skb_orphan(skb); | 766 | skb_orphan(skb); |
@@ -819,7 +819,8 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd, | |||
819 | BUG_ON(virtqueue_add_sgs(vi->cvq, sgs, out_num, in_num, vi, GFP_ATOMIC) | 819 | BUG_ON(virtqueue_add_sgs(vi->cvq, sgs, out_num, in_num, vi, GFP_ATOMIC) |
820 | < 0); | 820 | < 0); |
821 | 821 | ||
822 | virtqueue_kick(vi->cvq); | 822 | if (unlikely(!virtqueue_kick(vi->cvq))) |
823 | return status == VIRTIO_NET_OK; | ||
823 | 824 | ||
824 | /* Spin for a response, the kick causes an ioport write, trapping | 825 | /* Spin for a response, the kick causes an ioport write, trapping |
825 | * into the hypervisor, so the request should be handled immediately. | 826 | * into the hypervisor, so the request should be handled immediately. |