+static int
+distribute_qps_to_lcores(uint32_t nb_cores, uint32_t nb_qps,
+ struct qps_per_lcore **qpl)
+{
+ int socket;
+ unsigned lcore_id;
+ uint32_t i;
+ uint16_t min_qp_id;
+ uint16_t max_qp_id;
+ struct qps_per_lcore *qps_per_lcore;
+ uint32_t detected_lcores;
+
+ if (nb_qps < nb_cores) {
+ nb_cores = nb_qps;
+ printf("Reducing number of cores to number of QPs (%u)\n",
+ nb_cores);
+ }
+ /* Allocate qps_per_lcore array */
+ qps_per_lcore =
+ rte_malloc(NULL, sizeof(*qps_per_lcore) * nb_cores, 0);
+ if (!qps_per_lcore)
+ rte_exit(EXIT_FAILURE, "Failed to create qps_per_lcore array\n");
+ *qpl = qps_per_lcore;
+ detected_lcores = 0;
+ min_qp_id = 0;
+
+ RTE_LCORE_FOREACH_WORKER(lcore_id) {
+ if (detected_lcores >= nb_cores)
+ break;
+ qps_per_lcore[detected_lcores].lcore_id = lcore_id;
+ socket = rte_lcore_to_socket_id(lcore_id);
+ if (socket == SOCKET_ID_ANY)
+ socket = 0;
+ qps_per_lcore[detected_lcores].socket = socket;
+ qps_per_lcore[detected_lcores].qp_id_base = min_qp_id;
+ max_qp_id = min_qp_id + nb_qps / nb_cores - 1;
+ if (nb_qps % nb_cores > detected_lcores)
+ max_qp_id++;
+ qps_per_lcore[detected_lcores].nb_qps = max_qp_id -
+ min_qp_id + 1;
+ min_qp_id = max_qp_id + 1;
+ detected_lcores++;
+ }
+ if (detected_lcores != nb_cores)
+ return -1;
+
+ for (i = 0; i < detected_lcores; i++) {
+ printf("===> Core %d: allocated queues: ",
+ qps_per_lcore[i].lcore_id);
+ min_qp_id = qps_per_lcore[i].qp_id_base;
+ max_qp_id =
+ qps_per_lcore[i].qp_id_base + qps_per_lcore[i].nb_qps;
+ while (min_qp_id < max_qp_id) {
+ printf("%u ", min_qp_id);
+ min_qp_id++;
+ }
+ printf("\n");
+ }
+ return 0;
+}
+