-
-static int
-launch_cores(unsigned enq_core_count, unsigned deq_core_count,
- unsigned n_enq_bulk, unsigned n_deq_bulk,
- int sp, int sc, int bulk_not_burst)
-{
- void *obj;
- unsigned lcore_id;
- unsigned rate, deq_remain = 0;
- unsigned enq_total, deq_total;
- struct test_stats sum;
- int (*enq_f)(void *);
- int (*deq_f)(void *);
- unsigned cores = enq_core_count + deq_core_count;
- int ret;
-
- rte_atomic32_set(&synchro, 0);
-
- printf("ring_autotest e/d_core=%u,%u e/d_bulk=%u,%u ",
- enq_core_count, deq_core_count, n_enq_bulk, n_deq_bulk);
- printf("sp=%d sc=%d ", sp, sc);
-
- if (bulk_not_burst) {
- /* set enqueue function to be used */
- if (sp)
- enq_f = test_ring_per_core_sp_enqueue;
- else
- enq_f = test_ring_per_core_mp_enqueue;
-
- /* set dequeue function to be used */
- if (sc)
- deq_f = test_ring_per_core_sc_dequeue;
- else
- deq_f = test_ring_per_core_mc_dequeue;
-
- } else {
- /* set enqueue function to be used */
- if (sp)
- enq_f = test_ring_per_core_sp_enqueue_burst;
- else
- enq_f = test_ring_per_core_mp_enqueue_burst;
-
- /* set dequeue function to be used */
- if (sc)
- deq_f = test_ring_per_core_sc_dequeue_burst;
- else
- deq_f = test_ring_per_core_mc_dequeue_burst;
- }
-
- RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- if (enq_core_count != 0) {
- enq_core_count--;
- rte_eal_remote_launch(enq_f, &n_enq_bulk, lcore_id);
- }
- if (deq_core_count != 1) {
- deq_core_count--;
- rte_eal_remote_launch(deq_f, &n_deq_bulk, lcore_id);
- }
- }
-
- memset(test_stats, 0, sizeof(test_stats));
-
- /* start synchro and launch test on master */
- rte_atomic32_set(&synchro, 1);
- ret = deq_f(&n_deq_bulk);
-
- /* wait all cores */
- RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- if (cores == 1)
- break;
- cores--;
- if (rte_eal_wait_lcore(lcore_id) < 0)
- ret = -1;
- }
-
- memset(&sum, 0, sizeof(sum));
- for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
- sum.enq_success += test_stats[lcore_id].enq_success;
- sum.enq_quota += test_stats[lcore_id].enq_quota;
- sum.enq_fail += test_stats[lcore_id].enq_fail;
- sum.deq_success += test_stats[lcore_id].deq_success;
- sum.deq_fail += test_stats[lcore_id].deq_fail;
- }
-
- /* empty the ring */
- while (rte_ring_sc_dequeue(r, &obj) == 0)
- deq_remain += 1;
-
- if (ret < 0) {
- printf("per-lcore test returned -1\n");
- return -1;
- }
-
- enq_total = sum.enq_success + sum.enq_quota;
- deq_total = sum.deq_success + deq_remain;
-
- rate = deq_total/TIME_S;
-
- printf("rate_persec=%u\n", rate);
-
- if (enq_total != deq_total) {
- printf("invalid enq/deq_success counter: %u %u\n",
- enq_total, deq_total);
- return -1;
- }
-
- return 0;
-}
-
-static int
-do_one_ring_test2(unsigned enq_core_count, unsigned deq_core_count,
- unsigned n_enq_bulk, unsigned n_deq_bulk, unsigned bulk_or_burst)
-{
- int sp, sc;
- int do_sp, do_sc;
- int ret;
-
- do_sp = (enq_core_count == 1) ? 1 : 0;
- do_sc = (deq_core_count == 1) ? 1 : 0;
-
- for (sp = 0; sp <= do_sp; sp ++) {
- for (sc = 0; sc <= do_sc; sc ++) {
- ret = launch_cores(enq_core_count, deq_core_count,
- n_enq_bulk, n_deq_bulk, sp, sc, bulk_or_burst);
- if (ret < 0)
- return -1;
- }
- }
- return 0;
-}
-
-static int
-do_one_ring_test(unsigned enq_core_count, unsigned deq_core_count,
- unsigned bulk_or_burst)
-{
- unsigned bulk_enqueue_tab[] = { 1, 2, 4, 32, 0 };
- unsigned bulk_dequeue_tab[] = { 1, 2, 4, 32, 0 };
- unsigned *bulk_enqueue_ptr;
- unsigned *bulk_dequeue_ptr;
- int ret;
-
- for (bulk_enqueue_ptr = bulk_enqueue_tab;
- *bulk_enqueue_ptr;
- bulk_enqueue_ptr++) {
-
- for (bulk_dequeue_ptr = bulk_dequeue_tab;
- *bulk_dequeue_ptr;
- bulk_dequeue_ptr++) {
-
- ret = do_one_ring_test2(enq_core_count, deq_core_count,
- *bulk_enqueue_ptr,
- *bulk_dequeue_ptr,
- bulk_or_burst);
- if (ret < 0)
- return -1;
- }
- }
- return 0;
-}
-