|
@@ -545,7 +545,8 @@ static bool try_fill_recv(struct receive_queue *rq, gfp_t gfp)
|
|
|
} while (rq->vq->num_free);
|
|
|
if (unlikely(rq->num > rq->max))
|
|
|
rq->max = rq->num;
|
|
|
- virtqueue_kick(rq->vq);
|
|
|
+ if (unlikely(!virtqueue_kick(rq->vq)))
|
|
|
+ return false;
|
|
|
return !oom;
|
|
|
}
|
|
|
|
|
@@ -751,7 +752,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
err = xmit_skb(sq, skb);
|
|
|
|
|
|
/* This should not happen! */
|
|
|
- if (unlikely(err)) {
|
|
|
+ if (unlikely(err) || unlikely(!virtqueue_kick(sq->vq))) {
|
|
|
dev->stats.tx_fifo_errors++;
|
|
|
if (net_ratelimit())
|
|
|
dev_warn(&dev->dev,
|
|
@@ -760,7 +761,6 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
kfree_skb(skb);
|
|
|
return NETDEV_TX_OK;
|
|
|
}
|
|
|
- virtqueue_kick(sq->vq);
|
|
|
|
|
|
/* Don't wait up for transmitted skbs to be freed. */
|
|
|
skb_orphan(skb);
|
|
@@ -819,7 +819,8 @@ static bool virtnet_send_command(struct virtnet_info *vi, u8 class, u8 cmd,
|
|
|
BUG_ON(virtqueue_add_sgs(vi->cvq, sgs, out_num, in_num, vi, GFP_ATOMIC)
|
|
|
< 0);
|
|
|
|
|
|
- virtqueue_kick(vi->cvq);
|
|
|
+ if (unlikely(!virtqueue_kick(vi->cvq)))
|
|
|
+ return status == VIRTIO_NET_OK;
|
|
|
|
|
|
/* Spin for a response, the kick causes an ioport write, trapping
|
|
|
* into the hypervisor, so the request should be handled immediately.
|