The event ethernet Tx adapter provides data path for the ethernet transmit stage. Enqueue a burst of events objects supplied on an event device.
Fixes: 2369f73329 ("app/testeventdev: add perf queue worker functions") Cc: sta...@dpdk.org Signed-off-by: Apeksha Gupta <apeksha.gu...@nxp.com> --- app/test-eventdev/test_perf_common.c | 11 ++++++++ app/test-eventdev/test_perf_common.h | 1 + app/test-eventdev/test_perf_queue.c | 42 ++++++++++++++++++++-------- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/test-eventdev/test_perf_common.c b/app/test-eventdev/test_perf_common.c index b3af4bfeca..341e16eade 100644 --- a/app/test-eventdev/test_perf_common.c +++ b/app/test-eventdev/test_perf_common.c @@ -687,9 +687,20 @@ perf_ethdev_setup(struct evt_test *test, struct evt_options *opt) return -ENODEV; } + t->internal_port = 1; RTE_ETH_FOREACH_DEV(i) { struct rte_eth_dev_info dev_info; struct rte_eth_conf local_port_conf = port_conf; + uint32_t caps = 0; + + ret = rte_event_eth_tx_adapter_caps_get(opt->dev_id, i, &caps); + if (ret != 0) { + evt_err("failed to get event tx adapter[%d] caps", i); + return ret; + } + + if (!(caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) + t->internal_port = 0; ret = rte_eth_dev_info_get(i, &dev_info); if (ret != 0) { diff --git a/app/test-eventdev/test_perf_common.h b/app/test-eventdev/test_perf_common.h index d8fbee6d89..716199d8c9 100644 --- a/app/test-eventdev/test_perf_common.h +++ b/app/test-eventdev/test_perf_common.h @@ -48,6 +48,7 @@ struct test_perf { int done; uint64_t outstand_pkts; uint8_t nb_workers; + uint8_t internal_port; enum evt_test_result result; uint32_t nb_flows; uint64_t nb_pkts; diff --git a/app/test-eventdev/test_perf_queue.c b/app/test-eventdev/test_perf_queue.c index 29098580e7..f79e4a4164 100644 --- a/app/test-eventdev/test_perf_queue.c +++ b/app/test-eventdev/test_perf_queue.c @@ -71,10 +71,12 @@ perf_queue_worker(void *arg, const int enable_fwd_latency) } static int -perf_queue_worker_burst(void *arg, const int enable_fwd_latency) +perf_queue_worker_burst(void *arg, const int enable_fwd_latency, + const uint32_t flags) { PERF_WORKER_INIT; uint16_t i; + uint16_t nb_tx; /* +1 to avoid prefetch out of array check */ struct rte_event ev[BURST_SIZE + 1]; @@ -111,12 +113,20 @@ perf_queue_worker_burst(void *arg, const int enable_fwd_latency) } } - uint16_t enq; - - enq = rte_event_enqueue_burst(dev, port, ev, nb_rx); - while (enq < nb_rx) { - enq += rte_event_enqueue_burst(dev, port, + if (flags == TEST_PERF_EVENT_TX_DIRECT) { + nb_tx = rte_event_eth_tx_adapter_enqueue(dev, port, + ev, nb_rx, 0); + while (nb_tx < nb_rx && !t->done) + nb_tx += rte_event_eth_tx_adapter_enqueue(dev, + port, ev + nb_tx, + nb_rx - nb_tx, 0); + } else { + uint16_t enq; + enq = rte_event_enqueue_burst(dev, port, ev, nb_rx); + while (enq < nb_rx) { + enq += rte_event_enqueue_burst(dev, port, ev + enq, nb_rx - enq); + } } } return 0; @@ -130,16 +140,26 @@ worker_wrapper(void *arg) const bool burst = evt_has_burst_mode(w->dev_id); const int fwd_latency = opt->fwd_latency; - + const bool internal_port = w->t->internal_port; + uint32_t flags; /* allow compiler to optimize */ if (!burst && !fwd_latency) return perf_queue_worker(arg, 0); else if (!burst && fwd_latency) return perf_queue_worker(arg, 1); - else if (burst && !fwd_latency) - return perf_queue_worker_burst(arg, 0); - else if (burst && fwd_latency) - return perf_queue_worker_burst(arg, 1); + else if (burst && !fwd_latency && internal_port) { + flags = TEST_PERF_EVENT_TX_DIRECT; + return perf_queue_worker_burst(arg, 0, flags); + } else if (burst && !fwd_latency && !internal_port) { + flags = TEST_PERF_EVENT_TX_ENQ; + return perf_queue_worker_burst(arg, 1, flags); + } else if (burst && fwd_latency && internal_port) { + flags = TEST_PERF_EVENT_TX_DIRECT; + return perf_queue_worker_burst(arg, 0, flags); + } else if (burst && fwd_latency && !internal_port) { + flags = TEST_PERF_EVENT_TX_ENQ; + return perf_queue_worker_burst(arg, 1, flags); + } rte_panic("invalid worker\n"); } -- 2.17.1