app/eventdev: launch pipeline lcores
authorPavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Tue, 16 Jan 2018 17:46:00 +0000 (23:16 +0530)
committerJerin Jacob <jerin.jacob@caviumnetworks.com>
Fri, 19 Jan 2018 15:09:56 +0000 (16:09 +0100)
The event master lcore's test termination and the logic to print the mpps
are common for the queue and all types queue test.

Move them as the common function.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Harry van Haaren <harry.van.haaren@intel.com>
app/test-eventdev/test_pipeline_common.c
app/test-eventdev/test_pipeline_common.h

index 98df423..6cad935 100644 (file)
@@ -90,6 +90,73 @@ pipeline_opt_dump(struct evt_options *opt, uint8_t nb_queues)
        evt_dump_producer_type(opt);
 }
 
+static inline uint64_t
+processed_pkts(struct test_pipeline *t)
+{
+       uint8_t i;
+       uint64_t total = 0;
+
+       rte_smp_rmb();
+       if (t->mt_unsafe)
+               total = t->tx_service.processed_pkts;
+       else
+               for (i = 0; i < t->nb_workers; i++)
+                       total += t->worker[i].processed_pkts;
+
+       return total;
+}
+
+int
+pipeline_launch_lcores(struct evt_test *test, struct evt_options *opt,
+               int (*worker)(void *))
+{
+       int ret, lcore_id;
+       struct test_pipeline *t = evt_test_priv(test);
+
+       int port_idx = 0;
+       /* launch workers */
+       RTE_LCORE_FOREACH_SLAVE(lcore_id) {
+               if (!(opt->wlcores[lcore_id]))
+                       continue;
+
+               ret = rte_eal_remote_launch(worker,
+                                &t->worker[port_idx], lcore_id);
+               if (ret) {
+                       evt_err("failed to launch worker %d", lcore_id);
+                       return ret;
+               }
+               port_idx++;
+       }
+
+       uint64_t perf_cycles = rte_get_timer_cycles();
+       const uint64_t perf_sample = rte_get_timer_hz();
+
+       static float total_mpps;
+       static uint64_t samples;
+
+       uint64_t prev_pkts = 0;
+
+       while (t->done == false) {
+               const uint64_t new_cycles = rte_get_timer_cycles();
+
+               if ((new_cycles - perf_cycles) > perf_sample) {
+                       const uint64_t curr_pkts = processed_pkts(t);
+
+                       float mpps = (float)(curr_pkts - prev_pkts)/1000000;
+
+                       prev_pkts = curr_pkts;
+                       perf_cycles = new_cycles;
+                       total_mpps += mpps;
+                       ++samples;
+                       printf(CLGRN"\r%.3f mpps avg %.3f mpps"CLNRM,
+                                       mpps, total_mpps/samples);
+                       fflush(stdout);
+               }
+       }
+       printf("\n");
+       return 0;
+}
+
 int
 pipeline_opt_check(struct evt_options *opt, uint64_t nb_queues)
 {
index b812486..b6923f3 100644 (file)
@@ -84,6 +84,8 @@ int pipeline_mempool_setup(struct evt_test *test, struct evt_options *opt);
 int pipeline_event_port_setup(struct evt_test *test, struct evt_options *opt,
                uint8_t *queue_arr, uint8_t nb_queues,
                const struct rte_event_port_conf p_conf);
+int pipeline_launch_lcores(struct evt_test *test, struct evt_options *opt,
+               int (*worker)(void *));
 void pipeline_opt_dump(struct evt_options *opt, uint8_t nb_queues);
 void pipeline_test_destroy(struct evt_test *test, struct evt_options *opt);
 void pipeline_eventdev_destroy(struct evt_test *test, struct evt_options *opt);