free_old_xmit_skbs(vi);
 
        /* If we has a buffer left over from last time, send it now. */
-       if (vi->last_xmit_skb) {
+       if (unlikely(vi->last_xmit_skb)) {
                if (xmit_skb(vi, vi->last_xmit_skb) != 0) {
                        /* Drop this skb: we only queue one. */
                        vi->dev->stats.tx_dropped++;
                        kfree_skb(skb);
+                       skb = NULL;
                        goto stop_queue;
                }
                vi->last_xmit_skb = NULL;
        }
 
        /* Put new one in send queue and do transmit */
-       __skb_queue_head(&vi->send, skb);
-       if (xmit_skb(vi, skb) != 0) {
-               vi->last_xmit_skb = skb;
-               goto stop_queue;
+       if (likely(skb)) {
+               __skb_queue_head(&vi->send, skb);
+               if (xmit_skb(vi, skb) != 0) {
+                       vi->last_xmit_skb = skb;
+                       skb = NULL;
+                       goto stop_queue;
+               }
        }
 done:
        vi->svq->vq_ops->kick(vi->svq);