{
        u16 ntu = rx_ring->next_to_use;
        union i40e_rx_desc *rx_desc;
-       struct xdp_buff **bi, *xdp;
+       struct xdp_buff **xdp;
+       u32 nb_buffs, i;
        dma_addr_t dma;
-       bool ok = true;
 
        rx_desc = I40E_RX_DESC(rx_ring, ntu);
-       bi = i40e_rx_bi(rx_ring, ntu);
-       do {
-               xdp = xsk_buff_alloc(rx_ring->xsk_pool);
-               if (!xdp) {
-                       ok = false;
-                       goto no_buffers;
-               }
-               *bi = xdp;
-               dma = xsk_buff_xdp_get_dma(xdp);
+       xdp = i40e_rx_bi(rx_ring, ntu);
+
+       nb_buffs = min_t(u16, count, rx_ring->count - ntu);
+       nb_buffs = xsk_buff_alloc_batch(rx_ring->xsk_pool, xdp, nb_buffs);
+       if (!nb_buffs)
+               return false;
+
+       i = nb_buffs;
+       while (i--) {
+               dma = xsk_buff_xdp_get_dma(*xdp);
                rx_desc->read.pkt_addr = cpu_to_le64(dma);
                rx_desc->read.hdr_addr = 0;
 
                rx_desc++;
-               bi++;
-               ntu++;
-
-               if (unlikely(ntu == rx_ring->count)) {
-                       rx_desc = I40E_RX_DESC(rx_ring, 0);
-                       bi = i40e_rx_bi(rx_ring, 0);
-                       ntu = 0;
-               }
-       } while (--count);
+               xdp++;
+       }
 
-no_buffers:
-       if (rx_ring->next_to_use != ntu) {
-               /* clear the status bits for the next_to_use descriptor */
-               rx_desc->wb.qword1.status_error_len = 0;
-               i40e_release_rx_desc(rx_ring, ntu);
+       ntu += nb_buffs;
+       if (ntu == rx_ring->count) {
+               rx_desc = I40E_RX_DESC(rx_ring, 0);
+               xdp = i40e_rx_bi(rx_ring, 0);
+               ntu = 0;
        }
 
-       return ok;
+       /* clear the status bits for the next_to_use descriptor */
+       rx_desc->wb.qword1.status_error_len = 0;
+       i40e_release_rx_desc(rx_ring, ntu);
+
+       return count == nb_buffs ? true : false;
 }
 
 /**
                        break;
 
                bi = *i40e_rx_bi(rx_ring, next_to_clean);
-               bi->data_end = bi->data + size;
+               xsk_buff_set_size(bi, size);
                xsk_buff_dma_sync_for_cpu(bi, rx_ring->xsk_pool);
 
                xdp_res = i40e_run_xdp_zc(rx_ring, bi);