diff options
-rw-r--r-- | drivers/net/virtio_net.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index fe7cdf2a2a23..d50f4fe352b3 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -287,21 +287,25 @@ again: | |||
287 | free_old_xmit_skbs(vi); | 287 | free_old_xmit_skbs(vi); |
288 | 288 | ||
289 | /* If we has a buffer left over from last time, send it now. */ | 289 | /* If we has a buffer left over from last time, send it now. */ |
290 | if (vi->last_xmit_skb) { | 290 | if (unlikely(vi->last_xmit_skb)) { |
291 | if (xmit_skb(vi, vi->last_xmit_skb) != 0) { | 291 | if (xmit_skb(vi, vi->last_xmit_skb) != 0) { |
292 | /* Drop this skb: we only queue one. */ | 292 | /* Drop this skb: we only queue one. */ |
293 | vi->dev->stats.tx_dropped++; | 293 | vi->dev->stats.tx_dropped++; |
294 | kfree_skb(skb); | 294 | kfree_skb(skb); |
295 | skb = NULL; | ||
295 | goto stop_queue; | 296 | goto stop_queue; |
296 | } | 297 | } |
297 | vi->last_xmit_skb = NULL; | 298 | vi->last_xmit_skb = NULL; |
298 | } | 299 | } |
299 | 300 | ||
300 | /* Put new one in send queue and do transmit */ | 301 | /* Put new one in send queue and do transmit */ |
301 | __skb_queue_head(&vi->send, skb); | 302 | if (likely(skb)) { |
302 | if (xmit_skb(vi, skb) != 0) { | 303 | __skb_queue_head(&vi->send, skb); |
303 | vi->last_xmit_skb = skb; | 304 | if (xmit_skb(vi, skb) != 0) { |
304 | goto stop_queue; | 305 | vi->last_xmit_skb = skb; |
306 | skb = NULL; | ||
307 | goto stop_queue; | ||
308 | } | ||
305 | } | 309 | } |
306 | done: | 310 | done: |
307 | vi->svq->vq_ops->kick(vi->svq); | 311 | vi->svq->vq_ops->kick(vi->svq); |