struct ice_tc_cfg tc_cfg;
        struct bpf_prog *xdp_prog;
        struct ice_tx_ring **xdp_rings;  /* XDP ring array */
-       unsigned long *af_xdp_zc_qps;    /* tracks AF_XDP ZC enabled qps */
        u16 num_xdp_txq;                 /* Used XDP queues */
        u8 xdp_mapping_mode;             /* ICE_MAP_MODE_[CONTIG|SCATTER] */
 
        ring->flags |= ICE_TX_FLAGS_RING_XDP;
 }
 
+/**
+ * ice_get_xp_from_qid - get ZC XSK buffer pool bound to a queue ID
+ * @vsi: pointer to VSI
+ * @qid: index of a queue to look at XSK buff pool presence
+ *
+ * Return: A pointer to xsk_buff_pool structure if there is a buffer pool
+ * attached and configured as zero-copy, NULL otherwise.
+ */
+static inline struct xsk_buff_pool *ice_get_xp_from_qid(struct ice_vsi *vsi,
+                                                       u16 qid)
+{
+       struct xsk_buff_pool *pool = xsk_get_pool_from_qid(vsi->netdev, qid);
+
+       if (!ice_is_xdp_ena_vsi(vsi))
+               return NULL;
+
+       return (pool && pool->dev) ? pool : NULL;
+}
+
 /**
  * ice_xsk_pool - get XSK buffer pool bound to a ring
  * @ring: Rx ring to use
        struct ice_vsi *vsi = ring->vsi;
        u16 qid = ring->q_index;
 
-       if (!ice_is_xdp_ena_vsi(vsi) || !test_bit(qid, vsi->af_xdp_zc_qps))
-               return NULL;
-
-       return xsk_get_pool_from_qid(vsi->netdev, qid);
+       return ice_get_xp_from_qid(vsi, qid);
 }
 
 /**
        if (!ring)
                return;
 
-       if (!ice_is_xdp_ena_vsi(vsi) || !test_bit(qid, vsi->af_xdp_zc_qps)) {
-               ring->xsk_pool = NULL;
-               return;
-       }
-
-       ring->xsk_pool = xsk_get_pool_from_qid(vsi->netdev, qid);
+       ring->xsk_pool = ice_get_xp_from_qid(vsi, qid);
 }
 
 /**
 
        if (!vsi->q_vectors)
                goto err_vectors;
 
-       vsi->af_xdp_zc_qps = bitmap_zalloc(max_t(int, vsi->alloc_txq, vsi->alloc_rxq), GFP_KERNEL);
-       if (!vsi->af_xdp_zc_qps)
-               goto err_zc_qps;
-
        return 0;
 
-err_zc_qps:
-       devm_kfree(dev, vsi->q_vectors);
 err_vectors:
        devm_kfree(dev, vsi->rxq_map);
 err_rxq_map:
 
        dev = ice_pf_to_dev(pf);
 
-       bitmap_free(vsi->af_xdp_zc_qps);
-       vsi->af_xdp_zc_qps = NULL;
        /* free the ring and vector containers */
        devm_kfree(dev, vsi->q_vectors);
        vsi->q_vectors = NULL;
 
        if (!pool)
                return -EINVAL;
 
-       clear_bit(qid, vsi->af_xdp_zc_qps);
        xsk_pool_dma_unmap(pool, ICE_RX_DMA_ATTR);
 
        return 0;
        if (err)
                return err;
 
-       set_bit(qid, vsi->af_xdp_zc_qps);
-
        return 0;
 }
 
 int ice_realloc_zc_buf(struct ice_vsi *vsi, bool zc)
 {
        struct ice_rx_ring *rx_ring;
-       unsigned long q;
+       uint i;
+
+       ice_for_each_rxq(vsi, i) {
+               rx_ring = vsi->rx_rings[i];
+               if (!rx_ring->xsk_pool)
+                       continue;
 
-       for_each_set_bit(q, vsi->af_xdp_zc_qps,
-                        max_t(int, vsi->alloc_txq, vsi->alloc_rxq)) {
-               rx_ring = vsi->rx_rings[q];
                if (ice_realloc_rx_xdp_bufs(rx_ring, zc))
                        return -ENOMEM;
        }