return;
 
        if (__netif_tx_trylock(txq)) {
-               free_old_xmit_skbs(sq, true);
+               do {
+                       virtqueue_disable_cb(sq->vq);
+                       free_old_xmit_skbs(sq, true);
+               } while (unlikely(!virtqueue_enable_cb_delayed(sq->vq)));
 
                if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
                        netif_tx_wake_queue(txq);
        bool use_napi = sq->napi.weight;
 
        /* Free up any pending old buffers before queueing new ones. */
-       free_old_xmit_skbs(sq, false);
+       do {
+               if (use_napi)
+                       virtqueue_disable_cb(sq->vq);
+
+               free_old_xmit_skbs(sq, false);
 
-       if (use_napi && kick)
-               virtqueue_enable_cb_delayed(sq->vq);
+       } while (use_napi && kick &&
+              unlikely(!virtqueue_enable_cb_delayed(sq->vq)));
 
        /* timestamp packet in software */
        skb_tx_timestamp(skb);