ice: xsk: drop power of 2 ring size restriction for AF_XDP
authorMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Thu, 1 Sep 2022 10:40:40 +0000 (12:40 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 27 Sep 2022 16:01:01 +0000 (09:01 -0700)
We had multiple customers in the past months that reported commit
296f13ff3854 ("ice: xsk: Force rings to be sized to power of 2")
makes them unable to use ring size of 8160 in conjunction with AF_XDP.
Remove this restriction.

Fixes: 296f13ff3854 ("ice: xsk: Force rings to be sized to power of 2")
CC: Alasdair McWilliam <alasdair.mcwilliam@outlook.com>
Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Tested-by: George Kuruvinakunnel <george.kuruvinakunnel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_xsk.c

index 8833b66b4e54ad893fa85fe534cd58674457ba00..056c904b83ccb6ab03902d9907c1a3ef4776cd5a 100644 (file)
@@ -392,13 +392,6 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)
                goto failure;
        }
 
-       if (!is_power_of_2(vsi->rx_rings[qid]->count) ||
-           !is_power_of_2(vsi->tx_rings[qid]->count)) {
-               netdev_err(vsi->netdev, "Please align ring sizes to power of 2\n");
-               pool_failure = -EINVAL;
-               goto failure;
-       }
-
        if_running = netif_running(vsi->netdev) && ice_is_xdp_ena_vsi(vsi);
 
        if (if_running) {
@@ -534,11 +527,10 @@ exit:
 bool ice_alloc_rx_bufs_zc(struct ice_rx_ring *rx_ring, u16 count)
 {
        u16 rx_thresh = ICE_RING_QUARTER(rx_ring);
-       u16 batched, leftover, i, tail_bumps;
+       u16 leftover, i, tail_bumps;
 
-       batched = ALIGN_DOWN(count, rx_thresh);
-       tail_bumps = batched / rx_thresh;
-       leftover = count & (rx_thresh - 1);
+       tail_bumps = count / rx_thresh;
+       leftover = count - (tail_bumps * rx_thresh);
 
        for (i = 0; i < tail_bumps; i++)
                if (!__ice_alloc_rx_bufs_zc(rx_ring, rx_thresh))
@@ -1037,14 +1029,16 @@ bool ice_xsk_any_rx_ring_ena(struct ice_vsi *vsi)
  */
 void ice_xsk_clean_rx_ring(struct ice_rx_ring *rx_ring)
 {
-       u16 count_mask = rx_ring->count - 1;
        u16 ntc = rx_ring->next_to_clean;
        u16 ntu = rx_ring->next_to_use;
 
-       for ( ; ntc != ntu; ntc = (ntc + 1) & count_mask) {
+       while (ntc != ntu) {
                struct xdp_buff *xdp = *ice_xdp_buf(rx_ring, ntc);
 
                xsk_buff_free(xdp);
+               ntc++;
+               if (ntc >= rx_ring->count)
+                       ntc = 0;
        }
 }