q_vector->rx.total_packets += total_rx_packets;
        q_vector->rx.total_bytes += total_rx_bytes;
 
+       if (xsk_umem_uses_need_wakeup(rx_ring->xsk_umem)) {
+               if (failure || rx_ring->next_to_clean == rx_ring->next_to_use)
+                       xsk_set_rx_need_wakeup(rx_ring->xsk_umem);
+               else
+                       xsk_clear_rx_need_wakeup(rx_ring->xsk_umem);
+
+               return (int)total_rx_packets;
+       }
        return failure ? budget : (int)total_rx_packets;
 }
 
        if (tx_desc) {
                ixgbe_xdp_ring_update_tail(xdp_ring);
                xsk_umem_consume_tx_done(xdp_ring->xsk_umem);
+               if (xsk_umem_uses_need_wakeup(xdp_ring->xsk_umem))
+                       xsk_clear_tx_need_wakeup(xdp_ring->xsk_umem);
        }
 
        return !!budget && work_done;
        if (xsk_frames)
                xsk_umem_complete_tx(umem, xsk_frames);
 
+       if (xsk_umem_uses_need_wakeup(tx_ring->xsk_umem)) {
+               if (tx_ring->next_to_clean == tx_ring->next_to_use)
+                       xsk_set_tx_need_wakeup(tx_ring->xsk_umem);
+               else
+                       xsk_clear_tx_need_wakeup(tx_ring->xsk_umem);
+       }
+
        xmit_done = ixgbe_xmit_zc(tx_ring, q_vector->tx.work_limit);
+
        return budget > 0 && xmit_done;
 }