+ /* eth_octeontx only supports one rq. */
+ rx_queue_id = rx_queue_id == -1 ? 0 : rx_queue_id;
+ rxq = eth_dev->data->rx_queues[rx_queue_id];
+ /* Add rxq pool to list of used pools and reduce available events. */
+ for (i = 0; i < edev->rxq_pools; i++) {
+ if (edev->rxq_pool_array[i] == (uintptr_t)rxq->pool) {
+ edev->rxq_pool_rcnt[i]++;
+ found = true;
+ break;
+ } else if (free_idx == UINT16_MAX &&
+ edev->rxq_pool_array[i] == 0) {
+ free_idx = i;
+ }
+ }
+
+ if (!found) {
+ uint16_t idx;
+
+ if (edev->available_events < rxq->pool->size) {
+ ssovf_log_err(
+ "Max available events %"PRIu32" requested events in rxq pool %"PRIu32"",
+ edev->available_events, rxq->pool->size);
+ return -ENOMEM;
+ }
+
+ if (free_idx != UINT16_MAX) {
+ idx = free_idx;
+ } else {
+ old_ptr = edev->rxq_pool_array;
+ edev->rxq_pools++;
+ edev->rxq_pool_array = rte_realloc(
+ edev->rxq_pool_array,
+ sizeof(uint64_t) * edev->rxq_pools, 0);
+ if (edev->rxq_pool_array == NULL) {
+ edev->rxq_pools--;
+ edev->rxq_pool_array = old_ptr;
+ return -ENOMEM;
+ }
+
+ old_ptr = edev->rxq_pool_rcnt;
+ edev->rxq_pool_rcnt = rte_realloc(
+ edev->rxq_pool_rcnt,
+ sizeof(uint8_t) * edev->rxq_pools, 0);
+ if (edev->rxq_pool_rcnt == NULL) {
+ edev->rxq_pools--;
+ edev->rxq_pool_rcnt = old_ptr;
+ return -ENOMEM;
+ }
+ idx = edev->rxq_pools - 1;
+ }
+
+ edev->rxq_pool_array[idx] = (uintptr_t)rxq->pool;
+ edev->rxq_pool_rcnt[idx] = 1;
+ edev->available_events -= rxq->pool->size;
+ }
+