DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev]  [PATCH v2 1/4] app/test-eventdev: fix minor typos
@ 2018-09-04 14:12 Pavan Nikhilesh
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
                   ` (4 more replies)
  0 siblings, 5 replies; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-04 14:12 UTC (permalink / raw)
  To: jerin.jacob, anoob.joseph, nikhil.rao; +Cc: dev, Pavan Nikhilesh

Fix minor typos.

Fixes: 314bcf58ca8f ("app/eventdev: add pipeline queue worker functions")

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
 v2 Changes:
 - remove stray newlines in logs.
 - update pipeline description (Nikhil).
 - add Tx adapter error condition when some ethdev, eventdev pair have internal
 port capability and others don't (Nikhil).
 - cleanup code formatting, simplify worker logic.
 - update doc to reflect new pipeline flow with Tx adapter.

 app/test-eventdev/test_pipeline_atq.c    | 16 ++++++++--------
 app/test-eventdev/test_pipeline_common.h |  8 ++++----
 app/test-eventdev/test_pipeline_queue.c  | 16 ++++++++--------
 3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
index 26dc79f90..f0b2f9015 100644
--- a/app/test-eventdev/test_pipeline_atq.c
+++ b/app/test-eventdev/test_pipeline_atq.c
@@ -18,7 +18,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
 static int
 pipeline_atq_worker_single_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;

 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -43,7 +43,7 @@ pipeline_atq_worker_single_stage_tx(void *arg)
 static int
 pipeline_atq_worker_single_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -66,7 +66,7 @@ pipeline_atq_worker_single_stage_fwd(void *arg)
 static int
 pipeline_atq_worker_single_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;

 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -98,7 +98,7 @@ pipeline_atq_worker_single_stage_burst_tx(void *arg)
 static int
 pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -126,7 +126,7 @@ pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 static int
 pipeline_atq_worker_multi_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;


@@ -161,7 +161,7 @@ pipeline_atq_worker_multi_stage_tx(void *arg)
 static int
 pipeline_atq_worker_multi_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;
 	const uint8_t tx_queue = t->tx_service.queue_id;

@@ -192,7 +192,7 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 static int
 pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;

 	while (t->done == false) {
@@ -234,7 +234,7 @@ pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 static int
 pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;
 	const uint8_t tx_queue = t->tx_service.queue_id;

diff --git a/app/test-eventdev/test_pipeline_common.h b/app/test-eventdev/test_pipeline_common.h
index 5fb91607d..9cd6b905b 100644
--- a/app/test-eventdev/test_pipeline_common.h
+++ b/app/test-eventdev/test_pipeline_common.h
@@ -65,14 +65,14 @@ struct test_pipeline {

 #define BURST_SIZE 16

-#define PIPELINE_WROKER_SINGLE_STAGE_INIT \
+#define PIPELINE_WORKER_SINGLE_STAGE_INIT \
 	struct worker_data *w  = arg;     \
 	struct test_pipeline *t = w->t;   \
 	const uint8_t dev = w->dev_id;    \
 	const uint8_t port = w->port_id;  \
 	struct rte_event ev

-#define PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT \
+#define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
 	int i;                                  \
 	struct worker_data *w  = arg;           \
 	struct test_pipeline *t = w->t;         \
@@ -80,7 +80,7 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;        \
 	struct rte_event ev[BURST_SIZE + 1]

-#define PIPELINE_WROKER_MULTI_STAGE_INIT                         \
+#define PIPELINE_WORKER_MULTI_STAGE_INIT                         \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
 	uint8_t cq_id;                                           \
@@ -90,7 +90,7 @@ struct test_pipeline {
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
 	struct rte_event ev

-#define PIPELINE_WROKER_MULTI_STAGE_BURST_INIT                   \
+#define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT                   \
 	int i;                                  \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c
index ca5f4578e..2e0d93d99 100644
--- a/app/test-eventdev/test_pipeline_queue.c
+++ b/app/test-eventdev/test_pipeline_queue.c
@@ -18,7 +18,7 @@ pipeline_queue_nb_event_queues(struct evt_options *opt)
 static int
 pipeline_queue_worker_single_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;

 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -44,7 +44,7 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 static int
 pipeline_queue_worker_single_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -67,7 +67,7 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 static int
 pipeline_queue_worker_single_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;

 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -101,7 +101,7 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 static int
 pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -130,7 +130,7 @@ pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 static int
 pipeline_queue_worker_multi_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;

 	while (t->done == false) {
@@ -165,7 +165,7 @@ pipeline_queue_worker_multi_stage_tx(void *arg)
 static int
 pipeline_queue_worker_multi_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;
 	const uint8_t tx_queue = t->tx_service.queue_id;

@@ -196,7 +196,7 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 static int
 pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;

 	while (t->done == false) {
@@ -240,7 +240,7 @@ pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 static int
 pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;
 	const uint8_t tx_queue = t->tx_service.queue_id;

--
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v2 2/4] app/test-eventdev: remove redundant newlines
  2018-09-04 14:12 [dpdk-dev] [PATCH v2 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
@ 2018-09-04 14:12 ` Pavan Nikhilesh
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-04 14:12 UTC (permalink / raw)
  To: jerin.jacob, anoob.joseph, nikhil.rao; +Cc: dev, Pavan Nikhilesh

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
 app/test-eventdev/test_pipeline_common.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
index a54068df3..832ab8b6e 100644
--- a/app/test-eventdev/test_pipeline_common.c
+++ b/app/test-eventdev/test_pipeline_common.c
@@ -65,12 +65,12 @@ pipeline_test_result(struct evt_test *test, struct evt_options *opt)
 	uint64_t total = 0;
 	struct test_pipeline *t = evt_test_priv(test);
 
-	printf("Packet distribution across worker cores :\n");
+	evt_info("Packet distribution across worker cores :");
 	for (i = 0; i < t->nb_workers; i++)
 		total += t->worker[i].processed_pkts;
 	for (i = 0; i < t->nb_workers; i++)
-		printf("Worker %d packets: "CLGRN"%"PRIx64" "CLNRM"percentage:"
-				CLGRN" %3.2f\n"CLNRM, i,
+		evt_info("Worker %d packets: "CLGRN"%"PRIx64""CLNRM" percentage:"
+				CLGRN" %3.2f"CLNRM, i,
 				t->worker[i].processed_pkts,
 				(((double)t->worker[i].processed_pkts)/total)
 				* 100);
@@ -234,7 +234,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 
 	RTE_SET_USED(opt);
 	if (!rte_eth_dev_count_avail()) {
-		evt_err("No ethernet ports found.\n");
+		evt_err("No ethernet ports found.");
 		return -ENODEV;
 	}
 
@@ -253,7 +253,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
 				port_conf.rx_adv_conf.rss_conf.rss_hf) {
 			evt_info("Port %u modified RSS hash function based on hardware support,"
-				"requested:%#"PRIx64" configured:%#"PRIx64"\n",
+				"requested:%#"PRIx64" configured:%#"PRIx64"",
 				i,
 				port_conf.rx_adv_conf.rss_conf.rss_hf,
 				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
@@ -262,19 +262,19 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 		if (rte_eth_dev_configure(i, nb_queues, nb_queues,
 					&local_port_conf)
 				< 0) {
-			evt_err("Failed to configure eth port [%d]\n", i);
+			evt_err("Failed to configure eth port [%d]", i);
 			return -EINVAL;
 		}
 
 		if (rte_eth_rx_queue_setup(i, 0, NB_RX_DESC,
 				rte_socket_id(), &rx_conf, t->pool) < 0) {
-			evt_err("Failed to setup eth port [%d] rx_queue: %d.\n",
+			evt_err("Failed to setup eth port [%d] rx_queue: %d.",
 					i, 0);
 			return -EINVAL;
 		}
 		if (rte_eth_tx_queue_setup(i, 0, NB_TX_DESC,
 					rte_socket_id(), NULL) < 0) {
-			evt_err("Failed to setup eth port [%d] tx_queue: %d.\n",
+			evt_err("Failed to setup eth port [%d] tx_queue: %d.",
 					i, 0);
 			return -EINVAL;
 		}
@@ -380,7 +380,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			ret = evt_service_setup(service_id);
 			if (ret) {
 				evt_err("Failed to setup service core"
-						" for Rx adapter\n");
+						" for Rx adapter");
 				return ret;
 			}
 		}
@@ -397,8 +397,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			evt_err("Rx adapter[%d] start failed", prod);
 			return ret;
 		}
-		printf("%s: Port[%d] using Rx adapter[%d] started\n", __func__,
-				prod, prod);
+		evt_info("Port[%d] using Rx adapter[%d] started", prod, prod);
 	}
 
 	return ret;
-- 
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support
  2018-09-04 14:12 [dpdk-dev] [PATCH v2 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
@ 2018-09-04 14:12 ` Pavan Nikhilesh
  2018-09-05  6:54   ` Rao, Nikhil
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 4/4] doc: update eventdev application guide Pavan Nikhilesh
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-04 14:12 UTC (permalink / raw)
  To: jerin.jacob, anoob.joseph, nikhil.rao; +Cc: dev, Pavan Nikhilesh

Convert existing Tx service based pipeline to Tx adapter based APIs and
simplify worker functions.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
 app/test-eventdev/test_pipeline_atq.c    | 269 ++++++++++++-----------
 app/test-eventdev/test_pipeline_common.c | 206 +++++------------
 app/test-eventdev/test_pipeline_common.h |  62 +++---
 app/test-eventdev/test_pipeline_queue.c  | 241 ++++++++++----------
 4 files changed, 367 insertions(+), 411 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
index f0b2f9015..01af298f3 100644
--- a/app/test-eventdev/test_pipeline_atq.c
+++ b/app/test-eventdev/test_pipeline_atq.c
@@ -15,7 +15,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
 	return rte_eth_dev_count_avail();
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
@@ -28,23 +28,18 @@ pipeline_atq_worker_single_stage_tx(void *arg)
 			continue;
 		}
 
-		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-			pipeline_tx_pkt(ev.mbuf);
-			w->processed_pkts++;
-			continue;
-		}
-		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		pipeline_event_enqueue(dev, port, &ev);
+		pipeline_event_tx(dev, port, &ev);
+		w->processed_pkts++;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -54,16 +49,16 @@ pipeline_atq_worker_single_stage_fwd(void *arg)
 			continue;
 		}
 
-		w->processed_pkts++;
-		ev.queue_id = tx_queue;
+		ev.queue_id = tx_queue[ev.mbuf->port];
 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
+		w->processed_pkts++;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
@@ -79,27 +74,21 @@ pipeline_atq_worker_single_stage_burst_tx(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev[i].mbuf);
-				ev[i].op = RTE_EVENT_OP_RELEASE;
-				w->processed_pkts++;
-			} else
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 		}
 
-		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		pipeline_event_tx_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -112,23 +101,22 @@ pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			ev[i].queue_id = tx_queue;
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
+			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
-			w->processed_pkts++;
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -141,29 +129,24 @@ pipeline_atq_worker_multi_stage_tx(void *arg)
 		cq_id = ev.sub_event_type % nb_stages;
 
 		if (cq_id == last_queue) {
-			if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev.mbuf);
-				w->processed_pkts++;
-				continue;
-			}
-			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		} else {
-			ev.sub_event_type++;
-			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
+			pipeline_event_tx(dev, port, &ev);
+			w->processed_pkts++;
+			continue;
 		}
 
+		ev.sub_event_type++;
+		pipeline_fwd_event(&ev, sched_type_list[cq_id]);
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -176,9 +159,9 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 		cq_id = ev.sub_event_type % nb_stages;
 
 		if (cq_id == last_queue) {
-			w->processed_pkts++;
-			ev.queue_id = tx_queue;
+			ev.queue_id = tx_queue[ev.mbuf->port];
 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
+			w->processed_pkts++;
 		} else {
 			ev.sub_event_type++;
 			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
@@ -186,14 +169,14 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -209,34 +192,27 @@ pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 			cq_id = ev[i].sub_event_type % nb_stages;
 
 			if (cq_id == last_queue) {
-				if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-					pipeline_tx_pkt(ev[i].mbuf);
-					ev[i].op = RTE_EVENT_OP_RELEASE;
-					w->processed_pkts++;
-					continue;
-				}
-
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
-			} else {
-				ev[i].sub_event_type++;
-				pipeline_fwd_event(&ev[i],
-						sched_type_list[cq_id]);
+				pipeline_event_tx(dev, port, &ev[i]);
+				ev[i].op = RTE_EVENT_OP_RELEASE;
+				w->processed_pkts++;
+				continue;
 			}
+
+			ev[i].sub_event_type++;
+			pipeline_fwd_event(&ev[i], sched_type_list[cq_id]);
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -253,7 +229,7 @@ pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 
 			if (cq_id == last_queue) {
 				w->processed_pkts++;
-				ev[i].queue_id = tx_queue;
+				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
 				pipeline_fwd_event(&ev[i],
 						RTE_SCHED_TYPE_ATOMIC);
 			} else {
@@ -265,6 +241,7 @@ pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
@@ -274,39 +251,36 @@ worker_wrapper(void *arg)
 	struct worker_data *w  = arg;
 	struct evt_options *opt = w->t->opt;
 	const bool burst = evt_has_burst_mode(w->dev_id);
-	const bool mt_safe = !w->t->mt_unsafe;
+	const bool internal_port = w->t->internal_port;
 	const uint8_t nb_stages = opt->nb_stages;
 	RTE_SET_USED(opt);
 
 	if (nb_stages == 1) {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_atq_worker_single_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_atq_worker_single_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_atq_worker_single_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_atq_worker_single_stage_burst_fwd(arg);
 	} else {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_atq_worker_multi_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_atq_worker_multi_stage_fwd(arg);
-		if (burst && mt_safe)
+		if (burst && internal_port)
 			return pipeline_atq_worker_multi_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_atq_worker_multi_stage_burst_fwd(arg);
 	}
+
 	rte_panic("invalid worker\n");
 }
 
 static int
 pipeline_atq_launch_lcores(struct evt_test *test, struct evt_options *opt)
 {
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe)
-		rte_service_component_runstate_set(t->tx_service.service_id, 1);
 	return pipeline_launch_lcores(test, opt, worker_wrapper);
 }
 
@@ -317,34 +291,36 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	int nb_ports;
 	int nb_queues;
 	uint8_t queue;
-	struct rte_event_dev_info info;
-	struct test_pipeline *t = evt_test_priv(test);
-	uint8_t tx_evqueue_id = 0;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};
 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
 	uint8_t nb_worker_queues = 0;
+	uint8_t tx_evport_id = 0;
+	uint16_t prod = 0;
+	struct rte_event_dev_info info;
+	struct test_pipeline *t = evt_test_priv(test);
 
 	nb_ports = evt_nr_active_lcores(opt->wlcores);
 	nb_queues = rte_eth_dev_count_avail();
 
-	/* One extra port and queueu for Tx service */
-	if (t->mt_unsafe) {
-		tx_evqueue_id = nb_queues;
-		nb_ports++;
-		nb_queues++;
+	/* One queue for Tx adapter per port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			tx_evqueue_id[prod] = nb_queues;
+			nb_queues++;
+		}
 	}
 
-
 	rte_event_dev_info_get(opt->dev_id, &info);
 
 	const struct rte_event_dev_config config = {
-			.nb_event_queues = nb_queues,
-			.nb_event_ports = nb_ports,
-			.nb_events_limit  = info.max_num_events,
-			.nb_event_queue_flows = opt->nb_flows,
-			.nb_event_port_dequeue_depth =
-				info.max_event_port_dequeue_depth,
-			.nb_event_port_enqueue_depth =
-				info.max_event_port_enqueue_depth,
+		.nb_event_queues = nb_queues,
+		.nb_event_ports = nb_ports,
+		.nb_events_limit  = info.max_num_events,
+		.nb_event_queue_flows = opt->nb_flows,
+		.nb_event_port_dequeue_depth =
+			info.max_event_port_dequeue_depth,
+		.nb_event_port_enqueue_depth =
+			info.max_event_port_enqueue_depth,
 	};
 	ret = rte_event_dev_configure(opt->dev_id, &config);
 	if (ret) {
@@ -353,21 +329,23 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	}
 
 	struct rte_event_queue_conf q_conf = {
-			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
-			.nb_atomic_flows = opt->nb_flows,
-			.nb_atomic_order_sequences = opt->nb_flows,
+		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
+		.nb_atomic_flows = opt->nb_flows,
+		.nb_atomic_order_sequences = opt->nb_flows,
 	};
 	/* queue configurations */
 	for (queue = 0; queue < nb_queues; queue++) {
 		q_conf.event_queue_cfg = RTE_EVENT_QUEUE_CFG_ALL_TYPES;
 
-		if (t->mt_unsafe) {
-			if (queue == tx_evqueue_id) {
-				q_conf.event_queue_cfg =
-					RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
-			} else {
-				queue_arr[nb_worker_queues] = queue;
-				nb_worker_queues++;
+		if (!t->internal_port) {
+			RTE_ETH_FOREACH_DEV(prod) {
+				if (queue == tx_evqueue_id[prod]) {
+					q_conf.event_queue_cfg =
+						RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
+				} else {
+					queue_arr[nb_worker_queues] = queue;
+					nb_worker_queues++;
+				}
 			}
 		}
 
@@ -383,20 +361,15 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 
 	/* port configuration */
 	const struct rte_event_port_conf p_conf = {
-			.dequeue_depth = opt->wkr_deq_dep,
-			.enqueue_depth = info.max_event_port_dequeue_depth,
-			.new_event_threshold = info.max_num_events,
+		.dequeue_depth = opt->wkr_deq_dep,
+		.enqueue_depth = info.max_event_port_dequeue_depth,
+		.new_event_threshold = info.max_num_events,
 	};
 
-	if (t->mt_unsafe) {
+	if (!t->internal_port)
 		ret = pipeline_event_port_setup(test, opt, queue_arr,
 				nb_worker_queues, p_conf);
-		if (ret)
-			return ret;
-
-		ret = pipeline_event_tx_service_setup(test, opt, tx_evqueue_id,
-				nb_ports - 1, p_conf);
-	} else
+	else
 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
 				p_conf);
 
@@ -408,30 +381,32 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *
 	 * eth_dev_count = 2, nb_stages = 2, atq mode
 	 *
-	 * Multi thread safe :
+	 * eth0, eth1 have Internal port capability :
 	 *	queues = 2
 	 *	stride = 1
 	 *
 	 *	event queue pipelines:
-	 *	eth0 -> q0 ->tx
-	 *	eth1 -> q1 ->tx
+	 *	eth0 -> q0 ->Tx
+	 *	eth1 -> q1 ->Tx
 	 *
 	 *	q0, q1 are configured as ATQ so, all the different stages can
 	 *	be enqueued on the same queue.
 	 *
-	 * Multi thread unsafe :
-	 *	queues = 3
+	 * eth0, eth1 use Tx adapters service core :
+	 *	queues = 4
 	 *	stride = 1
 	 *
 	 *	event queue pipelines:
-	 *	eth0 -> q0
-	 *		  } (q3->tx) Tx service
-	 *	eth1 -> q1
+	 *	eth0 -> q0  -> q2 -> Tx
+	 *	eth1 -> q1  -> q3 -> Tx
 	 *
-	 *	q0,q1 are configured as stated above.
-	 *	q3 configured as SINGLE_LINK|ATOMIC.
+	 *	q0, q1 are configured as stated above.
+	 *	q2, q3 configured as SINGLE_LINK.
 	 */
 	ret = pipeline_event_rx_adapter_setup(opt, 1, p_conf);
+	if (ret)
+		return ret;
+	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
 	if (ret)
 		return ret;
 
@@ -445,12 +420,58 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 		}
 	}
 
+	/* Connect the tx_evqueue_id to the Tx adapter port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			ret = rte_event_eth_tx_adapter_event_port_get(prod,
+					&tx_evport_id);
+			if (ret) {
+				evt_err("Unable to get Tx adapter[%d]", prod);
+				return ret;
+			}
+
+			if (rte_event_port_link(opt->dev_id, tx_evport_id,
+						&tx_evqueue_id[prod],
+						NULL, 1) != 1) {
+				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+		}
+	}
+
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_eth_dev_start(prod);
+		if (ret) {
+			evt_err("Ethernet dev [%d] failed to start."
+					" Using synthetic producer", prod);
+			return ret;
+		}
+	}
+
 	ret = rte_event_dev_start(opt->dev_id);
 	if (ret) {
 		evt_err("failed to start eventdev %d", opt->dev_id);
 		return ret;
 	}
 
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_event_eth_rx_adapter_start(prod);
+		if (ret) {
+			evt_err("Rx adapter[%d] start failed", prod);
+			return ret;
+		}
+
+		ret = rte_event_eth_tx_adapter_start(prod);
+		if (ret) {
+			evt_err("Tx adapter[%d] start failed", prod);
+			return ret;
+		}
+	}
+
+	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
+			RTE_MAX_ETHPORTS);
+
 	return 0;
 }
 
diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
index 832ab8b6e..ab407dbbb 100644
--- a/app/test-eventdev/test_pipeline_common.c
+++ b/app/test-eventdev/test_pipeline_common.c
@@ -5,58 +5,6 @@
 
 #include "test_pipeline_common.h"
 
-static int32_t
-pipeline_event_tx_burst_service_func(void *args)
-{
-
-	int i;
-	struct tx_service_data *tx = args;
-	const uint8_t dev = tx->dev_id;
-	const uint8_t port = tx->port_id;
-	struct rte_event ev[BURST_SIZE + 1];
-
-	uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
-
-	if (!nb_rx) {
-		for (i = 0; i < tx->nb_ethports; i++)
-			rte_eth_tx_buffer_flush(i, 0, tx->tx_buf[i]);
-		return 0;
-	}
-
-	for (i = 0; i < nb_rx; i++) {
-		struct rte_mbuf *m = ev[i].mbuf;
-		rte_eth_tx_buffer(m->port, 0, tx->tx_buf[m->port], m);
-	}
-	tx->processed_pkts += nb_rx;
-
-	return 0;
-}
-
-static int32_t
-pipeline_event_tx_service_func(void *args)
-{
-
-	int i;
-	struct tx_service_data *tx = args;
-	const uint8_t dev = tx->dev_id;
-	const uint8_t port = tx->port_id;
-	struct rte_event ev;
-
-	uint16_t nb_rx = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
-
-	if (!nb_rx) {
-		for (i = 0; i < tx->nb_ethports; i++)
-			rte_eth_tx_buffer_flush(i, 0, tx->tx_buf[i]);
-		return 0;
-	}
-
-	struct rte_mbuf *m = ev.mbuf;
-	rte_eth_tx_buffer(m->port, 0, tx->tx_buf[m->port], m);
-	tx->processed_pkts++;
-
-	return 0;
-}
-
 int
 pipeline_test_result(struct evt_test *test, struct evt_options *opt)
 {
@@ -97,11 +45,8 @@ processed_pkts(struct test_pipeline *t)
 	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;
+	for (i = 0; i < t->nb_workers; i++)
+		total += t->worker[i].processed_pkts;
 
 	return total;
 }
@@ -215,7 +160,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 {
 	uint16_t i;
 	uint8_t nb_queues = 1;
-	uint8_t mt_state = 0;
 	struct test_pipeline *t = evt_test_priv(test);
 	struct rte_eth_rxconf rx_conf;
 	struct rte_eth_conf port_conf = {
@@ -238,13 +182,21 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 		return -ENODEV;
 	}
 
+	t->internal_port = 0;
 	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;
+
+		rte_event_eth_tx_adapter_caps_get(opt->dev_id, i, &caps);
+		if ((caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) {
+			t->internal_port = 1;
+		} else if (t->internal_port == 1) {
+			evt_err("Eventdev can't use %d port", i);
+			return -EINVAL;
+		}
 
 		rte_eth_dev_info_get(i, &dev_info);
-		mt_state = !(dev_info.tx_offload_capa &
-				DEV_TX_OFFLOAD_MT_LOCKFREE);
 		rx_conf = dev_info.default_rxconf;
 		rx_conf.offloads = port_conf.rxmode.offloads;
 
@@ -279,11 +231,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 			return -EINVAL;
 		}
 
-		t->mt_unsafe |= mt_state;
-		t->tx_service.tx_buf[i] =
-			rte_malloc(NULL, RTE_ETH_TX_BUFFER_SIZE(BURST_SIZE), 0);
-		if (t->tx_service.tx_buf[i] == NULL)
-			rte_panic("Unable to allocate Tx buffer memory.");
 		rte_eth_promiscuous_enable(i);
 	}
 
@@ -295,7 +242,6 @@ 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 i;
 	int ret;
 	uint8_t port;
 	struct test_pipeline *t = evt_test_priv(test);
@@ -316,23 +262,15 @@ pipeline_event_port_setup(struct evt_test *test, struct evt_options *opt,
 			return ret;
 		}
 
-		if (queue_arr == NULL) {
-			if (rte_event_port_link(opt->dev_id, port, NULL, NULL,
-						0) != nb_queues)
-				goto link_fail;
-		} else {
-			for (i = 0; i < nb_queues; i++) {
-				if (rte_event_port_link(opt->dev_id, port,
-						&queue_arr[i], NULL, 1) != 1)
-					goto link_fail;
-			}
-		}
+		if (rte_event_port_link(opt->dev_id, port, queue_arr, NULL,
+					0) != nb_queues)
+			goto link_fail;
 	}
 
 	return 0;
 
 link_fail:
-	evt_err("failed to link all queues to port %d", port);
+	evt_err("failed to link queues to port %d", port);
 	return -EINVAL;
 }
 
@@ -385,79 +323,64 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			}
 		}
 
-		ret = rte_eth_dev_start(prod);
-		if (ret) {
-			evt_err("Ethernet dev [%d] failed to start."
-					" Using synthetic producer", prod);
-			return ret;
-		}
-
-		ret = rte_event_eth_rx_adapter_start(prod);
-		if (ret) {
-			evt_err("Rx adapter[%d] start failed", prod);
-			return ret;
-		}
-		evt_info("Port[%d] using Rx adapter[%d] started", prod, prod);
+		evt_info("Port[%d] using Rx adapter[%d] configured", prod,
+				prod);
 	}
 
 	return ret;
 }
 
 int
-pipeline_event_tx_service_setup(struct evt_test *test, struct evt_options *opt,
-		uint8_t tx_queue_id, uint8_t tx_port_id,
-		const struct rte_event_port_conf p_conf)
+pipeline_event_tx_adapter_setup(struct evt_options *opt,
+		struct rte_event_port_conf port_conf)
 {
-	int ret;
-	struct rte_service_spec serv;
-	struct test_pipeline *t = evt_test_priv(test);
-	struct tx_service_data *tx = &t->tx_service;
+	int ret = 0;
+	uint16_t consm = 0;
 
-	ret = rte_event_port_setup(opt->dev_id, tx_port_id, &p_conf);
-	if (ret) {
-		evt_err("failed to setup port %d", tx_port_id);
-		return ret;
-	}
+	RTE_ETH_FOREACH_DEV(consm) {
+		uint32_t cap;
 
-	if (rte_event_port_link(opt->dev_id, tx_port_id, &tx_queue_id,
-				NULL, 1) != 1) {
-		evt_err("failed to link queues to port %d", tx_port_id);
-		return -EINVAL;
-	}
+		ret = rte_event_eth_tx_adapter_caps_get(opt->dev_id,
+				consm, &cap);
+		if (ret) {
+			evt_err("failed to get event tx adapter[%d] caps",
+					consm);
+			return ret;
+		}
 
-	tx->dev_id = opt->dev_id;
-	tx->queue_id = tx_queue_id;
-	tx->port_id = tx_port_id;
-	tx->nb_ethports = rte_eth_dev_count_avail();
-	tx->t = t;
-
-	/* Register Tx service */
-	memset(&serv, 0, sizeof(struct rte_service_spec));
-	snprintf(serv.name, sizeof(serv.name), "Tx_service");
-
-	if (evt_has_burst_mode(opt->dev_id))
-		serv.callback = pipeline_event_tx_burst_service_func;
-	else
-		serv.callback = pipeline_event_tx_service_func;
-
-	serv.callback_userdata = (void *)tx;
-	ret = rte_service_component_register(&serv, &tx->service_id);
-	if (ret) {
-		evt_err("failed to register Tx service");
-		return ret;
-	}
+		ret = rte_event_eth_tx_adapter_create(consm, opt->dev_id,
+				&port_conf);
+		if (ret) {
+			evt_err("failed to create tx adapter[%d]", consm);
+			return ret;
+		}
 
-	ret = evt_service_setup(tx->service_id);
-	if (ret) {
-		evt_err("Failed to setup service core for Tx service\n");
-		return ret;
-	}
+		ret = rte_event_eth_tx_adapter_queue_add(consm, consm, -1);
+		if (ret) {
+			evt_err("failed to add tx queues to adapter[%d]",
+					consm);
+			return ret;
+		}
 
-	rte_service_runstate_set(tx->service_id, 1);
+		if (!(cap & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) {
+			uint32_t service_id;
 
-	return 0;
-}
+			rte_event_eth_tx_adapter_service_id_get(consm,
+					&service_id);
+			ret = evt_service_setup(service_id);
+			if (ret) {
+				evt_err("Failed to setup service core"
+						" for Tx adapter\n");
+				return ret;
+			}
+		}
 
+		evt_info("Port[%d] using Tx adapter[%d] Configured", consm,
+				consm);
+	}
+
+	return ret;
+}
 
 void
 pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
@@ -465,16 +388,10 @@ pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
 	uint16_t i;
 	RTE_SET_USED(test);
 	RTE_SET_USED(opt);
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe) {
-		rte_service_component_runstate_set(t->tx_service.service_id, 0);
-		rte_service_runstate_set(t->tx_service.service_id, 0);
-		rte_service_component_unregister(t->tx_service.service_id);
-	}
 
 	RTE_ETH_FOREACH_DEV(i) {
 		rte_event_eth_rx_adapter_stop(i);
+		rte_event_eth_tx_adapter_stop(i);
 		rte_eth_dev_stop(i);
 	}
 }
@@ -484,7 +401,6 @@ pipeline_eventdev_destroy(struct evt_test *test, struct evt_options *opt)
 {
 	RTE_SET_USED(test);
 
-	rte_event_dev_stop(opt->dev_id);
 	rte_event_dev_close(opt->dev_id);
 }
 
diff --git a/app/test-eventdev/test_pipeline_common.h b/app/test-eventdev/test_pipeline_common.h
index 9cd6b905b..0440b9e29 100644
--- a/app/test-eventdev/test_pipeline_common.h
+++ b/app/test-eventdev/test_pipeline_common.h
@@ -14,6 +14,7 @@
 #include <rte_ethdev.h>
 #include <rte_eventdev.h>
 #include <rte_event_eth_rx_adapter.h>
+#include <rte_event_eth_tx_adapter.h>
 #include <rte_lcore.h>
 #include <rte_malloc.h>
 #include <rte_mempool.h>
@@ -35,30 +36,19 @@ struct worker_data {
 	struct test_pipeline *t;
 } __rte_cache_aligned;
 
-struct tx_service_data {
-	uint8_t dev_id;
-	uint8_t queue_id;
-	uint8_t port_id;
-	uint32_t service_id;
-	uint64_t processed_pkts;
-	uint16_t nb_ethports;
-	struct rte_eth_dev_tx_buffer *tx_buf[RTE_MAX_ETHPORTS];
-	struct test_pipeline *t;
-} __rte_cache_aligned;
-
 struct test_pipeline {
 	/* Don't change the offset of "done". Signal handler use this memory
 	 * to terminate all lcores work.
 	 */
 	int done;
 	uint8_t nb_workers;
-	uint8_t mt_unsafe;
+	uint8_t internal_port;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
 	enum evt_test_result result;
 	uint32_t nb_flows;
 	uint64_t outstand_pkts;
 	struct rte_mempool *pool;
 	struct worker_data worker[EVT_MAX_PORTS];
-	struct tx_service_data tx_service;
 	struct evt_options *opt;
 	uint8_t sched_type_list[EVT_MAX_STAGES] __rte_cache_aligned;
 } __rte_cache_aligned;
@@ -70,7 +60,7 @@ struct test_pipeline {
 	struct test_pipeline *t = w->t;   \
 	const uint8_t dev = w->dev_id;    \
 	const uint8_t port = w->port_id;  \
-	struct rte_event ev
+	struct rte_event ev __rte_cache_aligned
 
 #define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
 	int i;                                  \
@@ -78,7 +68,7 @@ struct test_pipeline {
 	struct test_pipeline *t = w->t;         \
 	const uint8_t dev = w->dev_id;          \
 	const uint8_t port = w->port_id;        \
-	struct rte_event ev[BURST_SIZE + 1]
+	struct rte_event ev[BURST_SIZE + 1] __rte_cache_aligned
 
 #define PIPELINE_WORKER_MULTI_STAGE_INIT                         \
 	struct worker_data *w  = arg;                            \
@@ -88,10 +78,11 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;                         \
 	const uint8_t last_queue = t->opt->nb_stages - 1;        \
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
-	struct rte_event ev
+	const uint8_t nb_stages = t->opt->nb_stages + 1;	 \
+	struct rte_event ev __rte_cache_aligned
 
 #define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT                   \
-	int i;                                  \
+	int i;                                                   \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
 	uint8_t cq_id;                                           \
@@ -99,7 +90,8 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;                         \
 	const uint8_t last_queue = t->opt->nb_stages - 1;        \
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
-	struct rte_event ev[BURST_SIZE + 1]
+	const uint8_t nb_stages = t->opt->nb_stages + 1;	 \
+	struct rte_event ev[BURST_SIZE + 1] __rte_cache_aligned
 
 static __rte_always_inline void
 pipeline_fwd_event(struct rte_event *ev, uint8_t sched)
@@ -109,6 +101,28 @@ pipeline_fwd_event(struct rte_event *ev, uint8_t sched)
 	ev->sched_type = sched;
 }
 
+static __rte_always_inline void
+pipeline_event_tx(const uint8_t dev, const uint8_t port,
+		struct rte_event * const ev)
+{
+	rte_event_eth_tx_adapter_txq_set(ev->mbuf, 0);
+	while (!rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1))
+		rte_pause();
+}
+
+static __rte_always_inline void
+pipeline_event_tx_burst(const uint8_t dev, const uint8_t port,
+		struct rte_event *ev, const uint16_t nb_rx)
+{
+	uint16_t enq;
+
+	enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, nb_rx);
+	while (enq < nb_rx) {
+		enq += rte_event_eth_tx_adapter_enqueue(dev, port,
+				ev + enq, nb_rx - enq);
+	}
+}
+
 static __rte_always_inline void
 pipeline_event_enqueue(const uint8_t dev, const uint8_t port,
 		struct rte_event *ev)
@@ -130,13 +144,6 @@ pipeline_event_enqueue_burst(const uint8_t dev, const uint8_t port,
 	}
 }
 
-static __rte_always_inline void
-pipeline_tx_pkt(struct rte_mbuf *mbuf)
-{
-	while (rte_eth_tx_burst(mbuf->port, 0, &mbuf, 1) != 1)
-		rte_pause();
-}
-
 static inline int
 pipeline_nb_event_ports(struct evt_options *opt)
 {
@@ -149,9 +156,8 @@ int pipeline_test_setup(struct evt_test *test, struct evt_options *opt);
 int pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt);
 int pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 		struct rte_event_port_conf prod_conf);
-int pipeline_event_tx_service_setup(struct evt_test *test,
-		struct evt_options *opt, uint8_t tx_queue_id,
-		uint8_t tx_port_id, const struct rte_event_port_conf p_conf);
+int pipeline_event_tx_adapter_setup(struct evt_options *opt,
+		struct rte_event_port_conf prod_conf);
 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,
diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c
index 2e0d93d99..1156c2555 100644
--- a/app/test-eventdev/test_pipeline_queue.c
+++ b/app/test-eventdev/test_pipeline_queue.c
@@ -15,7 +15,7 @@ pipeline_queue_nb_event_queues(struct evt_options *opt)
 	return (eth_count * opt->nb_stages) + eth_count;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
@@ -29,7 +29,7 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 		}
 
 		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-			pipeline_tx_pkt(ev.mbuf);
+			pipeline_event_tx(dev, port, &ev);
 			w->processed_pkts++;
 		} else {
 			ev.queue_id++;
@@ -41,11 +41,11 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -55,7 +55,8 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 			continue;
 		}
 
-		ev.queue_id = tx_queue;
+		ev.queue_id = tx_queue[ev.mbuf->port];
+		rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
 		w->processed_pkts++;
@@ -64,7 +65,7 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
@@ -81,8 +82,7 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
 			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev[i].mbuf);
+				pipeline_event_tx(dev, port, &ev[i]);
 				ev[i].op = RTE_EVENT_OP_RELEASE;
 				w->processed_pkts++;
 			} else {
@@ -98,11 +98,11 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -115,23 +115,24 @@ pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			ev[i].queue_id = tx_queue;
+			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
-			w->processed_pkts++;
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -143,31 +144,27 @@ pipeline_queue_worker_multi_stage_tx(void *arg)
 
 		cq_id = ev.queue_id % nb_stages;
 
-		if (cq_id >= last_queue) {
-			if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev.mbuf);
-				w->processed_pkts++;
-				continue;
-			}
-			ev.queue_id += (cq_id == last_queue) ? 1 : 0;
-			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		} else {
-			ev.queue_id++;
-			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
+		if (ev.queue_id == tx_queue[ev.mbuf->port]) {
+			pipeline_event_tx(dev, port, &ev);
+			w->processed_pkts++;
+			continue;
 		}
 
+		ev.queue_id++;
+		pipeline_fwd_event(&ev, cq_id != last_queue ?
+				sched_type_list[cq_id] :
+				RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -180,7 +177,8 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 		cq_id = ev.queue_id % nb_stages;
 
 		if (cq_id == last_queue) {
-			ev.queue_id = tx_queue;
+			ev.queue_id = tx_queue[ev.mbuf->port];
+			rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 			w->processed_pkts++;
 		} else {
@@ -190,14 +188,15 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -212,37 +211,30 @@ pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 			rte_prefetch0(ev[i + 1].mbuf);
 			cq_id = ev[i].queue_id % nb_stages;
 
-			if (cq_id >= last_queue) {
-				if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-					pipeline_tx_pkt(ev[i].mbuf);
-					ev[i].op = RTE_EVENT_OP_RELEASE;
-					w->processed_pkts++;
-					continue;
-				}
-
-				ev[i].queue_id += (cq_id == last_queue) ? 1 : 0;
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
-			} else {
-				ev[i].queue_id++;
-				pipeline_fwd_event(&ev[i],
-						sched_type_list[cq_id]);
+			if (ev[i].queue_id == tx_queue[ev[i].mbuf->port]) {
+				pipeline_event_tx(dev, port, &ev[i]);
+				ev[i].op = RTE_EVENT_OP_RELEASE;
+				w->processed_pkts++;
+				continue;
 			}
 
+			ev[i].queue_id++;
+			pipeline_fwd_event(&ev[i], cq_id != last_queue ?
+					sched_type_list[cq_id] :
+					RTE_SCHED_TYPE_ATOMIC);
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -258,7 +250,8 @@ pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 			cq_id = ev[i].queue_id % nb_stages;
 
 			if (cq_id == last_queue) {
-				ev[i].queue_id = tx_queue;
+				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
+				rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 				pipeline_fwd_event(&ev[i],
 						RTE_SCHED_TYPE_ATOMIC);
 				w->processed_pkts++;
@@ -271,6 +264,7 @@ pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
@@ -280,28 +274,28 @@ worker_wrapper(void *arg)
 	struct worker_data *w  = arg;
 	struct evt_options *opt = w->t->opt;
 	const bool burst = evt_has_burst_mode(w->dev_id);
-	const bool mt_safe = !w->t->mt_unsafe;
+	const bool internal_port = w->t->internal_port;
 	const uint8_t nb_stages = opt->nb_stages;
 	RTE_SET_USED(opt);
 
 	if (nb_stages == 1) {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_queue_worker_single_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_queue_worker_single_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_queue_worker_single_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_queue_worker_single_stage_burst_fwd(
 					arg);
 	} else {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_queue_worker_multi_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_queue_worker_multi_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_queue_worker_multi_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_queue_worker_multi_stage_burst_fwd(arg);
 
 	}
@@ -311,10 +305,6 @@ worker_wrapper(void *arg)
 static int
 pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt)
 {
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe)
-		rte_service_component_runstate_set(t->tx_service.service_id, 1);
 	return pipeline_launch_lcores(test, opt, worker_wrapper);
 }
 
@@ -326,25 +316,21 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	int nb_queues;
 	int nb_stages = opt->nb_stages;
 	uint8_t queue;
-	struct rte_event_dev_info info;
-	struct test_pipeline *t = evt_test_priv(test);
-	uint8_t tx_evqueue_id = 0;
+	uint8_t tx_evport_id = 0;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};
 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
 	uint8_t nb_worker_queues = 0;
+	uint16_t prod = 0;
+	struct rte_event_dev_info info;
+	struct test_pipeline *t = evt_test_priv(test);
 
 	nb_ports = evt_nr_active_lcores(opt->wlcores);
 	nb_queues = rte_eth_dev_count_avail() * (nb_stages);
 
-	/* Extra port for Tx service. */
-	if (t->mt_unsafe) {
-		tx_evqueue_id = nb_queues;
-		nb_ports++;
-		nb_queues++;
-	} else
-		nb_queues += rte_eth_dev_count_avail();
+	/* One queue for Tx adapter per port */
+	nb_queues += rte_eth_dev_count_avail();
 
 	rte_event_dev_info_get(opt->dev_id, &info);
-
 	const struct rte_event_dev_config config = {
 			.nb_event_queues = nb_queues,
 			.nb_event_ports = nb_ports,
@@ -370,24 +356,19 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	for (queue = 0; queue < nb_queues; queue++) {
 		uint8_t slot;
 
-		if (!t->mt_unsafe) {
-			slot = queue % (nb_stages + 1);
-			q_conf.schedule_type = slot == nb_stages ?
-				RTE_SCHED_TYPE_ATOMIC :
-				opt->sched_type_list[slot];
-		} else {
-			slot = queue % nb_stages;
-
-			if (queue == tx_evqueue_id) {
-				q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
+		q_conf.event_queue_cfg = 0;
+		slot = queue % (nb_stages + 1);
+		if (slot == nb_stages) {
+			q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
+			if (!t->internal_port) {
 				q_conf.event_queue_cfg =
 					RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
-			} else {
-				q_conf.schedule_type =
-					opt->sched_type_list[slot];
-				queue_arr[nb_worker_queues] = queue;
-				nb_worker_queues++;
 			}
+			tx_evqueue_id[prod++] = queue;
+		} else {
+			q_conf.schedule_type = opt->sched_type_list[slot];
+			queue_arr[nb_worker_queues] = queue;
+			nb_worker_queues++;
 		}
 
 		ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf);
@@ -407,19 +388,11 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 			.new_event_threshold = info.max_num_events,
 	};
 
-	/*
-	 * If tx is multi thread safe then allow workers to do Tx else use Tx
-	 * service to Tx packets.
-	 */
-	if (t->mt_unsafe) {
+	if (!t->internal_port) {
 		ret = pipeline_event_port_setup(test, opt, queue_arr,
 				nb_worker_queues, p_conf);
 		if (ret)
 			return ret;
-
-		ret = pipeline_event_tx_service_setup(test, opt, tx_evqueue_id,
-				nb_ports - 1, p_conf);
-
 	} else
 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
 				p_conf);
@@ -431,7 +404,6 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *
 	 * eth_dev_count = 2, nb_stages = 2.
 	 *
-	 * Multi thread safe :
 	 *	queues = 6
 	 *	stride = 3
 	 *
@@ -439,21 +411,14 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *	eth0 -> q0 -> q1 -> (q2->tx)
 	 *	eth1 -> q3 -> q4 -> (q5->tx)
 	 *
-	 *	q2, q5 configured as ATOMIC
-	 *
-	 * Multi thread unsafe :
-	 *	queues = 5
-	 *	stride = 2
+	 *	q2, q5 configured as ATOMIC | SINGLE_LINK
 	 *
-	 *	event queue pipelines:
-	 *	eth0 -> q0 -> q1
-	 *			} (q4->tx) Tx service
-	 *	eth1 -> q2 -> q3
-	 *
-	 *	q4 configured as SINGLE_LINK|ATOMIC
 	 */
-	ret = pipeline_event_rx_adapter_setup(opt,
-			t->mt_unsafe ? nb_stages : nb_stages + 1, p_conf);
+	ret = pipeline_event_rx_adapter_setup(opt, nb_stages + 1, p_conf);
+	if (ret)
+		return ret;
+
+	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
 	if (ret)
 		return ret;
 
@@ -467,12 +432,60 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 		}
 	}
 
+	/* Connect the tx_evqueue_id to the Tx adapter port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			ret = rte_event_eth_tx_adapter_event_port_get(prod,
+					&tx_evport_id);
+			if (ret) {
+				evt_err("Unable to get Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+
+			if (rte_event_port_link(opt->dev_id, tx_evport_id,
+						&tx_evqueue_id[prod],
+						NULL, 1) != 1) {
+				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+		}
+	}
+
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_eth_dev_start(prod);
+		if (ret) {
+			evt_err("Ethernet dev [%d] failed to start."
+					" Using synthetic producer", prod);
+			return ret;
+		}
+
+	}
+
 	ret = rte_event_dev_start(opt->dev_id);
 	if (ret) {
 		evt_err("failed to start eventdev %d", opt->dev_id);
 		return ret;
 	}
 
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_event_eth_rx_adapter_start(prod);
+		if (ret) {
+			evt_err("Rx adapter[%d] start failed", prod);
+			return ret;
+		}
+
+		ret = rte_event_eth_tx_adapter_start(prod);
+		if (ret) {
+			evt_err("Tx adapter[%d] start failed", prod);
+			return ret;
+		}
+	}
+
+	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
+			RTE_MAX_ETHPORTS);
+
 	return 0;
 }
 
-- 
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev]  [PATCH v2 4/4] doc: update eventdev application guide
  2018-09-04 14:12 [dpdk-dev] [PATCH v2 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
@ 2018-09-04 14:12 ` Pavan Nikhilesh
  2018-09-19 22:22 ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
  2018-09-24  8:02 ` [dpdk-dev] [PATCH v4 " Pavan Nikhilesh
  4 siblings, 0 replies; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-04 14:12 UTC (permalink / raw)
  To: jerin.jacob, anoob.joseph, nikhil.rao; +Cc: dev, Pavan Nikhilesh

Update eventdev application guide to reflect Tx adapter related changes.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
 .../eventdev_pipeline_atq_test_generic.svg    | 848 +++++++++++-------
 ...ntdev_pipeline_atq_test_internal_port.svg} |  26 +-
 .../eventdev_pipeline_queue_test_generic.svg  | 570 +++++++-----
 ...dev_pipeline_queue_test_internal_port.svg} |  22 +-
 doc/guides/tools/testeventdev.rst             |  42 +-
 5 files changed, 930 insertions(+), 578 deletions(-)
 rename doc/guides/tools/img/{eventdev_pipeline_atq_test_lockfree.svg => eventdev_pipeline_atq_test_internal_port.svg} (99%)
 rename doc/guides/tools/img/{eventdev_pipeline_queue_test_lockfree.svg => eventdev_pipeline_queue_test_internal_port.svg} (99%)

diff --git a/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg b/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
index e33367989..707b9b56b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
@@ -20,7 +20,7 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
    sodipodi:docname="eventdev_pipeline_atq_test_generic.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
@@ -42,22 +42,6 @@
          d="M 5.77,0 -2.88,5 V -5 Z"
          id="path39725" />
     </marker>
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <marker
        inkscape:isstock="true"
        style="overflow:visible"
@@ -1430,9 +1414,9 @@
        x2="677.85718"
        y2="244.50504"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.78263355,0,0,0.98605918,90.06838,5.0013749)" />
+       gradientTransform="matrix(0.84881476,0,0,0.98593266,86.966576,5.0323108)" />
     <linearGradient
-       gradientTransform="matrix(0.78674479,0,0,1.0000825,87.83543,1.2279738)"
+       gradientTransform="matrix(0.85327366,0,0,0.99995418,84.544803,1.2593939)"
        inkscape:collect="always"
        xlink:href="#linearGradient6391"
        id="linearGradient2965"
@@ -1865,36 +1849,6 @@
        effect="spiro"
        id="path-effect14461-7-5-6"
        is_visible="true" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(454.68566,-41.755492)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5-6"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(373.71198,205.50594)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5-6-4"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(454.58517,69.679557)" />
     <inkscape:path-effect
        effect="bspline"
        id="path-effect2658-8"
@@ -2048,16 +2002,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3438"
-       id="linearGradient16362"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(2.283166,-2.283166)"
-       x1="534.06958"
-       y1="163.49922"
-       x2="580.73291"
-       y2="163.49922" />
     <marker
        inkscape:stockid="Arrow1Mend"
        orient="auto"
@@ -2293,25 +2237,80 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker32613-8-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="TriangleOutM">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(0.4)"
+         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         id="path32611-8-0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-4-4"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1"
+       id="TriangleOutM-5-2-3"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2"
+       id="path-effect5228-5-1-61"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2324,20 +2323,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-6"
+       id="TriangleOutM-5-2-3-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-8"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
+       id="path-effect5228-5-1-61-1"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2350,20 +2349,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-6-6"
+       id="TriangleOutM-5-2-3-9"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-8-6"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20-4"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
+       id="path-effect5228-5-1-61-9"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2371,24 +2370,45 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(454.68566,-41.755492)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.08991,-43.80364)" />
     <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker32613-8-5"
-       refX="0"
-       refY="0"
+       inkscape:stockid="TriangleOutM"
        orient="auto"
-       inkscape:stockid="TriangleOutM">
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         transform="scale(0.4)"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         id="path35933-49-8-6-2-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         id="path32611-8-0" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-4-4"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2396,35 +2416,25 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient1920-1"
-       x1="475.00314"
-       y1="156.97769"
-       x2="515.13684"
-       y2="156.97769"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6515192,0,0,1.0041442,189.20967,67.917365)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3"
+       id="marker35935-1-6-5-1-0-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20"
+         id="path35933-49-8-6-2-3-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2432,25 +2442,45 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5-6"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(373.71198,205.50594)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5-6-4"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(454.58517,69.679557)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3-0"
+       id="marker35935-1-6-5-1-0-06"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20-6"
+         id="path35933-49-8-6-2-3-1"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61-1"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2458,25 +2488,55 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.25651,68.385308)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.88878,12.631328)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient1760-3"
+       x1="405.34961"
+       y1="243.36557"
+       x2="651.55652"
+       y2="243.36557"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65213006,0,0,0.72134316,230.98899,64.590305)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3-9"
+       id="marker35935-1-6-5"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20-4"
+         id="path35933-49-8-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61-9"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2484,25 +2544,77 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-9"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-3"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="1.53467"
-     inkscape:cx="477.6217"
-     inkscape:cy="141.14731"
+     inkscape:zoom="2.200307"
+     inkscape:cx="336.61535"
+     inkscape:cy="145.77389"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -2530,12 +2642,12 @@
      transform="translate(-46.542857,-100.33361)"
      style="display:inline;opacity:1">
     <rect
-       style="fill:url(#linearGradient4519);fill-opacity:1;stroke:url(#linearGradient2965);stroke-width:0.87847757;stroke-opacity:1"
+       style="fill:url(#linearGradient4519);fill-opacity:1;stroke:url(#linearGradient2965);stroke-width:0.91480815;stroke-opacity:1"
        id="rect3697"
-       width="493.61813"
-       height="283.13986"
-       x="126.96397"
-       y="104.52792"
+       width="535.35956"
+       height="283.10355"
+       x="126.98213"
+       y="104.54609"
        rx="0"
        ry="0" />
     <text
@@ -2706,7 +2818,7 @@
          x="199.44385"
          y="188.49918"
          id="tspan5223-0-9"
-         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+1</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4"
@@ -2777,7 +2889,7 @@
          x="199.35846"
          y="244.55573"
          id="tspan5223-0-9-0"
-         style="font-size:10px;line-height:1.25">port n+3</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-2);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4-6"
@@ -2882,7 +2994,7 @@
          x="242.32845"
          y="123.36828"
          id="tspan5223-10"
-         style="font-size:10px;line-height:1.25">total queues = number of ethernet dev + 1</tspan></text>
+         style="font-size:10px;line-height:1.25">total queues = 2 * number of ethernet dev </tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
@@ -2957,9 +3069,109 @@
          x="285.26294"
          y="240.01315"
          style="stroke-width:0.68894428" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="259.86884"
+       y="164.78368"
+       id="text5219-2-3-7-2-1"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="259.86884"
+         y="164.78368"
+         id="tspan5223-0-6-5-9-5"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="259.86884"
+         y="174.78368"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9">Rx adptr 0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="260.25055"
+       y="217.84813"
+       id="text5219-2-3-7-2-1-4"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="217.84813"
+         id="tspan5223-0-6-5-9-5-4"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="227.84813"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9-4">Rx adptr 1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="260.25055"
+       y="271.71359"
+       id="text5219-2-3-7-2-1-47"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="271.71359"
+         id="tspan5223-0-6-5-9-5-6"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="281.71359"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9-3">Rx adptr q</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="595.27808"
+       y="136.64076"
+       id="text5219-2-4-3-3-4-54-8-8"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="595.27808"
+         y="139.22064"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-7" /></text>
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3)"
+       d="m 356.74765,186.83153 c 15.88009,-0.11696 31.75919,-0.23391 47.6373,-0.35085"
+       id="path5226-6-2-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61"
+       inkscape:original-d="m 356.74765,186.83153 c 15.88008,-0.11795 31.75918,-0.2349 47.6373,-0.35085"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-0)"
+       d="m 357.05625,242.97941 c 15.74231,0.0176 31.48469,0.0352 47.22712,0.0528"
+       id="path5226-6-2-5-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61-1"
+       inkscape:original-d="m 357.05625,242.97941 c 15.74231,0.0166 31.48469,0.0342 47.22712,0.0528"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89337438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.57349763, 0.89337441;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-9)"
+       d="m 356.67155,297.12049 c 15.97521,0.0733 31.94945,0.14663 47.92273,0.21994"
+       id="path5226-6-2-5-0"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61-9"
+       inkscape:original-d="m 356.67155,297.12049 c 15.97521,0.0723 31.94945,0.14563 47.92273,0.21994"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="606.06958"
+       y="346.46628"
+       id="text5219-2-4-3-3-4-54-8-7"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="606.06958"
+         y="346.46628"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
     <g
+       style="display:inline;opacity:1"
        id="g20550"
-       transform="translate(25.709043,-190.70754)">
+       transform="translate(69.258261,-194.86398)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -2988,8 +3200,9 @@
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
     <g
+       style="display:inline;opacity:1"
        id="g13899"
-       transform="translate(-54.904385,-3.0966742)">
+       transform="translate(-12.211349,-3.253112)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3018,8 +3231,9 @@
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
     <g
+       style="display:inline;opacity:1"
        id="g13911"
-       transform="translate(-54.904385,-1.0966741)">
+       transform="translate(-10.498979,-2.682322)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3047,217 +3261,205 @@
            x="621.71729"
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="259.86884"
-       y="164.78368"
-       id="text5219-2-3-7-2-1"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="259.86884"
-         y="164.78368"
-         id="tspan5223-0-6-5-9-5"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="259.86884"
-         y="174.78368"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9">Rx adptr 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="260.25055"
-       y="217.84813"
-       id="text5219-2-3-7-2-1-4"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="217.84813"
-         id="tspan5223-0-6-5-9-5-4"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="227.84813"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9-4">Rx adptr 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="260.25055"
-       y="271.71359"
-       id="text5219-2-3-7-2-1-47"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="271.71359"
-         id="tspan5223-0-6-5-9-5-6"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="281.71359"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9-3">Rx adptr q</tspan></text>
-    <g
-       id="g16360"
-       transform="matrix(1.0874414,0,0,0.99912695,-98.49816,-6.4077434)">
-      <ellipse
-         ry="24.258638"
-         rx="22.831659"
-         cy="161.21605"
-         cx="559.68445"
-         id="path8843"
-         style="fill:#ffffff;fill-opacity:0.98039216;stroke:url(#linearGradient16362);stroke-opacity:1" />
-      <text
-         transform="scale(0.92048084,1.0863887)"
-         id="text5219-2-4-3-3-4-5"
-         y="146.21904"
-         x="588.44147"
-         style="font-style:normal;font-weight:normal;font-size:11.04576969px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92048085"
-         xml:space="preserve"><tspan
-           id="tspan1265-5"
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="146.21904"
-           x="588.44147"
-           sodipodi:role="line">Tx Service</tspan><tspan
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="152.00201"
-           x="588.44147"
-           sodipodi:role="line"
-           id="tspan39139" /><tspan
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="156.19092"
-           x="588.44147"
-           sodipodi:role="line"
-           id="tspan39141">port n + 1</tspan></text>
-    </g>
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.22799993, 1.61399996;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker32613)"
-       d="m 511.70299,212.50867 c -0.1614,-10.49392 -0.32276,-20.98539 -0.48409,-31.47439"
-       id="path5226-6-2-1-2-4-5-1"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6"
-       inkscape:original-d="m 511.70299,212.50867 c -0.16039,-10.49394 -0.32175,-20.98541 -0.48409,-31.47439"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935)"
-       d="m 523.50111,175.62989 c 10.13298,2.21215 20.26379,4.42384 30.39241,6.63504"
-       id="path5226-6-2-1-2-4-5-1-5"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1"
-       inkscape:original-d="m 523.50111,175.62989 c 10.13323,2.21099 20.26404,4.42267 30.39241,6.63504"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-5)"
-       d="m 523.50111,175.62989 c 9.91161,22.53065 19.82206,45.05865 29.73129,67.58389"
-       id="path5226-6-2-1-2-4-5-1-5-6"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-7"
-       inkscape:original-d="m 523.50111,175.62989 c 9.91282,22.53012 19.82327,45.05812 29.73129,67.58389"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-5-5)"
-       d="m 523.50111,175.62989 c 10.16587,40.76181 20.3305,81.51868 30.49385,122.27042"
-       id="path5226-6-2-1-2-4-5-1-5-6-3"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-7-9"
-       inkscape:original-d="m 523.50111,175.62989 c 10.16704,40.76152 20.33167,81.51839 30.49385,122.27042"
-       sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.88;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.52, 0.88;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1)"
-       d="m 457.99431,185.46823 c 13.07561,8.94945 26.1492,17.89751 39.22072,26.84415"
-       id="path5226-6-2-1-2-4-5-1-5-0"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.75503534;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.02014133, 0.75503534;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5)"
+       d="m 459.25963,298.68538 c 12.4298,0.0326 24.85706,0.0653 37.28169,0.0979"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2"
-       inkscape:original-d="m 457.99431,185.46823 c 13.0764,8.9483 26.14999,17.89636 39.22072,26.84415"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
+       inkscape:original-d="m 459.25963,298.68538 c 12.4298,0.0316 24.85706,0.0643 37.28169,0.0979"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6)"
-       d="m 459.47717,245.71809 c 12.28232,-4.96638 24.56173,-9.93159 36.83817,-14.89559"
-       id="path5226-6-2-1-2-4-5-1-5-0-2"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77332252;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.09329006, 0.77332252;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1)"
+       d="m 458.61908,243.27181 c 12.91755,-0.0156 25.83246,-0.0312 38.74462,-0.0468"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9"
-       inkscape:original-d="m 459.47717,245.71809 c 12.28211,-4.96689 24.56152,-9.9321 36.83817,-14.89559"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       inkscape:original-d="m 458.61908,243.27181 c 12.91755,-0.0166 25.83246,-0.0322 38.74462,-0.0468"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-6)"
-       d="m 459.54824,301.10401 c 12.64219,-20.37548 25.28189,-40.74696 37.91905,-61.11434"
-       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77624762;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10499055, 0.77624764;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-9)"
+       d="m 457.5506,186.45733 c 12.95011,-0.0208 25.89755,-0.0415 38.84226,-0.0623"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-06"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
-       inkscape:original-d="M 459.54824,301.10401 C 472.1907,280.7287 484.8304,260.35722 497.46729,239.98967"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       inkscape:original-d="m 457.5506,186.45733 c 12.95011,-0.0218 25.89755,-0.0426 38.84226,-0.0623"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79"
+       width="72.081367"
+       height="32.405426"
+       x="499.14511"
+       y="170.31314"
+       rx="16.175425"
+       ry="16.202713" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="595.27808"
-       y="136.64076"
-       id="text5219-2-4-3-3-4-54-8-8"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="502.77109"
+       y="189.40137"
+       id="text5219-2-6-2"><tspan
          sodipodi:role="line"
-         x="595.27808"
-         y="139.22064"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-7" /></text>
+         x="502.77109"
+         y="189.40137"
+         id="tspan5223-0-9-02"
+         style="font-size:10px;line-height:1.25">port n+m+1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="514.66077"
+       y="225.14934"
+       id="text5219-2-3-7-2-1-8-3"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="514.66077"
+         y="225.14934"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6">Single link</tspan></text>
     <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-1);stroke-width:0.86395979;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3736-8-4-9"
-       width="25.451954"
-       height="24.448395"
-       x="499.03128"
-       y="213.32141" />
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1"
+       width="72.081367"
+       height="32.405426"
+       x="499.944"
+       y="226.74811"
+       rx="16.175425"
+       ry="16.202713" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="548.03668"
-       y="204.31348"
-       id="text5219-2-4-3-3-4-54-8"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="504.46329"
+       y="246.05832"
+       id="text5219-2-6-1-7"><tspan
          sodipodi:role="line"
-         x="548.03668"
-         y="204.31348"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6">Single </tspan><tspan
+         x="504.46329"
+         y="246.05832"
+         id="tspan5223-0-9-0-5"
+         style="font-size:10px;line-height:1.25">port n+m+2</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1-7"
+       width="72.081367"
+       height="32.405426"
+       x="499.31168"
+       y="282.50211"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="512.51819"
+       y="301.5791"
+       id="text5219-2-6-1-6-2"><tspan
          sodipodi:role="line"
-         x="548.03668"
-         y="213.27945"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan57836">Link Q</tspan></text>
+         x="512.51819"
+         y="301.5791"
+         id="tspan5223-0-9-0-4-2"
+         style="font-size:10px;line-height:1.25">port n+o</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3)"
-       d="m 356.74765,186.83153 c 15.88009,-0.11696 31.75919,-0.23391 47.6373,-0.35085"
-       id="path5226-6-2-5"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0)"
+       d="m 571.86582,186.42744 c 7.95108,0.0405 15.90052,0.0811 23.84823,0.12159"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61"
-       inkscape:original-d="m 356.74765,186.83153 c 15.88008,-0.11795 31.75918,-0.2349 47.6373,-0.35085"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       inkscape:original-d="m 571.86582,186.42744 c 7.95109,0.0395 15.90052,0.0801 23.84823,0.12159"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-0)"
-       d="m 357.05625,242.97941 c 15.74231,0.0176 31.48469,0.0352 47.22712,0.0528"
-       id="path5226-6-2-5-5"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-0)"
+       d="m 572.74002,242.8173 c 7.86699,0.091 15.73233,0.18199 23.59597,0.27295"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-2"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61-1"
-       inkscape:original-d="m 357.05625,242.97941 c 15.74231,0.0166 31.48469,0.0342 47.22712,0.0528"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       inkscape:original-d="m 572.74002,242.8173 c 7.867,0.09 15.73234,0.18097 23.59597,0.27295"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89337438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.57349763, 0.89337441;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-9)"
-       d="m 356.67155,297.12049 c 15.97521,0.0733 31.94945,0.14663 47.92273,0.21994"
-       id="path5226-6-2-5-0"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-06)"
+       d="m 571.86429,299.00558 c 8.49934,0.0508 16.99697,0.10162 25.49284,0.15242"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-5"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61-9"
-       inkscape:original-d="m 356.67155,297.12049 c 15.97521,0.0723 31.94945,0.14563 47.92273,0.21994"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
+       inkscape:original-d="m 571.86429,299.00558 c 8.49935,0.0498 16.99698,0.10062 25.49284,0.15242"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760-3);stroke-width:0.67135191;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2896-6-7"
+       width="159.92059"
+       height="161.38417"
+       x="495.64883"
+       y="159.4483"
+       ry="4.080533"
+       rx="5.9213624"
+       inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
+       inkscape:export-xdpi="112"
+       inkscape:export-ydpi="112" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="606.06958"
-       y="346.46628"
-       id="text5219-2-4-3-3-4-54-8-7"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="515.76257"
+       y="175.4832"
+       id="text5219-2-3-7-2-1-8-3-5"
+       transform="scale(0.89243778,1.1205263)"><tspan
          sodipodi:role="line"
-         x="606.06958"
-         y="346.46628"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
+         x="515.76257"
+         y="175.4832"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-3">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="515.76501"
+       y="274.05133"
+       id="text5219-2-3-7-2-1-8-3-56"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="515.76501"
+         y="274.05133"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-2">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="546.92126"
+       y="155.57758"
+       id="text5219-2-4-2"><tspan
+         sodipodi:role="line"
+         x="546.92126"
+         y="155.57758"
+         id="tspan5223-0-7-70"
+         style="font-size:10px;line-height:1.25">Tx adapter</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="468.36612"
+       y="180.9222"
+       id="text5219-1-9-4-9-3"><tspan
+         sodipodi:role="line"
+         x="468.36612"
+         y="180.9222"
+         id="tspan5223-2-3-5-0-6"
+         style="font-size:10px;line-height:1.25">q3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="467.61584"
+       y="239.3683"
+       id="text5219-1-9-4-9-3-0"><tspan
+         sodipodi:role="line"
+         x="467.61584"
+         y="239.3683"
+         id="tspan5223-2-3-5-0-6-6"
+         style="font-size:10px;line-height:1.25">q4</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="468.70688"
+       y="294.45236"
+       id="text5219-1-9-4-9-3-2"><tspan
+         sodipodi:role="line"
+         x="468.70688"
+         y="294.45236"
+         id="tspan5223-2-3-5-0-6-61"
+         style="font-size:10px;line-height:1.25">q5</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg b/doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
similarity index 99%
rename from doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg
rename to doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
index d7f10de3e..f4393327b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
@@ -20,8 +20,8 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="eventdev_pipeline_atq_test_lockfree.svg"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
+   sodipodi:docname="eventdev_pipeline_atq_test_internal_port.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
@@ -2612,17 +2612,17 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="1.7519532"
-     inkscape:cx="479.73438"
-     inkscape:cy="163.58755"
+     inkscape:zoom="2.0977641"
+     inkscape:cx="432.03729"
+     inkscape:cy="135.16016"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="0"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -3331,14 +3331,14 @@
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="602.09888"
+       x="604.28497"
        y="347.66293"
        id="text5219-2-4-3-3-4-54"
        transform="scale(0.91487885,1.0930409)"><tspan
          sodipodi:role="line"
-         x="602.09888"
+         x="604.28497"
          y="347.66293"
          style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4">(Tx Lock free)</tspan></text>
+         id="tspan1265-4">(Internal port)</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg b/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
index 732d48867..9fe743f3b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
@@ -20,13 +20,21 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
    sodipodi:docname="eventdev_pipeline_queue_test_generic.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
   <defs
      id="defs3870">
+    <linearGradient
+       id="linearGradient6820"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#008080;stop-opacity:1;"
+         offset="0"
+         id="stop6818" />
+    </linearGradient>
     <linearGradient
        id="linearGradient6916"
        osb:paint="solid">
@@ -1312,7 +1320,7 @@
        x2="651.55652"
        y2="243.36557"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.76448972,0,0,0.86504892,-92.637138,19.716473)" />
+       gradientTransform="matrix(0.76448972,0,0,0.78486608,-92.637138,48.19976)" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#linearGradient3808"
@@ -2175,22 +2183,6 @@
        y2="232.36095"
        gradientUnits="userSpaceOnUse"
        gradientTransform="translate(17.692568,-46.20799)" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2"
@@ -2201,22 +2193,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49-8"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
@@ -2227,22 +2203,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1-6-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49-8-6"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14e4;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
@@ -2403,16 +2363,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3438"
-       id="linearGradient16362"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(2.283166,-2.283166)"
-       x1="534.06958"
-       y1="163.49922"
-       x2="580.73291"
-       y2="163.49922" />
     <marker
        inkscape:isstock="true"
        style="overflow:visible"
@@ -2488,16 +2438,6 @@
        effect="spiro"
        id="path-effect14461-7-5-1"
        is_visible="true" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient1924-3"
-       x1="597.00317"
-       y1="156.97769"
-       x2="637.13684"
-       y2="156.97769"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.78531244,0,0,1,50.143534,82.69878)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
@@ -2576,25 +2516,75 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-5"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-2"
+       id="marker35935-1-6-5"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-6"
+         id="path35933-49-8-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-6"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2607,20 +2597,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9"
+       id="marker35935-1-6-5-1"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5"
+         id="path35933-49-8-6-2"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2633,20 +2623,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9-7"
+       id="marker35935-1-6-5-9"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5-1"
+         id="path35933-49-8-6-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2654,25 +2644,107 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,300.23326,-43.855196)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,301.03213,12.579775)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,300.39986,68.333755)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9-72"
+       id="marker35935-1-6-5-1-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5-2"
+         id="path35933-49-8-6-2-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0-0"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2-3-6"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0-06"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2-3-1"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2680,6 +2752,16 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient1760-3"
+       x1="405.34961"
+       y1="243.36557"
+       x2="651.55652"
+       y2="243.36557"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65213006,0,0,0.72134316,249.13234,64.538752)" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -2689,16 +2771,16 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="1.7519532"
-     inkscape:cx="423.24137"
-     inkscape:cy="157.27924"
+     inkscape:cx="265.48225"
+     inkscape:cy="64.618341"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -2762,13 +2844,13 @@
          id="tspan5223-0"
          style="font-size:10px;line-height:1.25">producer 0</tspan></text>
     <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760);stroke-width:0.7960096;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760);stroke-width:0.75822091;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect2896-6"
        width="187.47435"
-       height="193.53508"
+       height="175.59599"
        x="217.62262"
-       y="133.47206"
-       ry="4.8934555"
+       y="151.41115"
+       ry="4.4398727"
        rx="6.9415913"
        inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
        inkscape:export-xdpi="112"
@@ -2824,7 +2906,7 @@
          x="115.44385"
          y="186.49918"
          id="tspan5223-0-9"
-         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+1</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4"
@@ -2940,7 +3022,7 @@
          x="115.35846"
          y="242.55573"
          id="tspan5223-0-9-0"
-         style="font-size:10px;line-height:1.25">port n+3</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-2);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4-6"
@@ -3098,7 +3180,7 @@
          x="199.11482"
          y="111.36845"
          id="tspan5223-10"
-         style="font-size:9.02731705px;line-height:1.25;stroke-width:0.90273178">total queues = (number of stages * number of ethernet dev) + 1</tspan></text>
+         style="font-size:9.02731705px;line-height:1.25;stroke-width:0.90273178">total queues = (number of stages * number of ethernet dev) + number of ethernet dev</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:11.11939621px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92661637"
@@ -3243,33 +3325,33 @@
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="426.57141"
+       x="428.57141"
        y="167.14041"
        id="text5219-2-4"><tspan
          sodipodi:role="line"
-         x="426.57141"
+         x="428.57141"
          y="167.14041"
          id="tspan5223-0-7"
          style="font-size:10px;line-height:1.25">worker 0</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="428.30768"
+       x="430.30768"
        y="223.46143"
        id="text5219-2-4-3"><tspan
          sodipodi:role="line"
-         x="428.30768"
+         x="430.30768"
          y="223.46143"
          id="tspan5223-0-7-7"
          style="font-size:10px;line-height:1.25">worker 1</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="426.30768"
+       x="428.30768"
        y="279.46143"
        id="text5219-2-4-3-4-2"><tspan
          sodipodi:role="line"
-         x="426.30768"
+         x="428.30768"
          y="279.46143"
          id="tspan5223-0-7-7-5-5"
          style="font-size:10px;line-height:1.25">worker n</tspan></text>
@@ -3309,7 +3391,7 @@
     <g
        style="display:inline;opacity:1"
        id="g20550"
-       transform="translate(65.401608,-190.91553)">
+       transform="translate(87.401608,-194.91553)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3340,7 +3422,7 @@
     <g
        style="display:inline;opacity:1"
        id="g13899"
-       transform="translate(-17.21182,-3.304662)">
+       transform="translate(5.9319927,-3.304662)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3371,7 +3453,7 @@
     <g
        style="display:inline;opacity:1"
        id="g13911"
-       transform="translate(-15.21182,-1.304662)">
+       transform="translate(7.6443673,-2.7338705)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3399,83 +3481,6 @@
            x="621.71729"
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
-    <g
-       style="display:inline;opacity:1"
-       id="g16360"
-       transform="matrix(1.0983058,0,0,1.0572541,-82.192809,-6.5664741)">
-      <ellipse
-         ry="24.258638"
-         rx="22.831659"
-         cy="161.21605"
-         cx="559.68445"
-         id="path8843"
-         style="fill:#ffffff;fill-opacity:0.98039216;stroke:url(#linearGradient16362);stroke-opacity:1" />
-      <text
-         transform="scale(0.94727182,1.0556632)"
-         id="text5219-2-4-3-3-4-5"
-         y="151.93637"
-         x="571.61011"
-         style="font-style:normal;font-weight:normal;font-size:10.76524448px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89710373"
-         xml:space="preserve"><tspan
-           id="tspan1265-5"
-           style="font-size:7.77489901px;line-height:1.25;stroke-width:0.89710373"
-           y="151.93637"
-           x="571.61011"
-           sodipodi:role="line">Tx Service</tspan><tspan
-           style="font-size:7.77489901px;line-height:1.25;stroke-width:0.89710373"
-           y="161.655"
-           x="571.61011"
-           sodipodi:role="line"
-           id="tspan40484">port n + 1</tspan></text>
-    </g>
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1)"
-       d="m 475.41709,184.68945 c 14.66204,14.27312 29.32201,28.54422 43.97988,42.81328"
-       id="path5226-6-2-1-2-4-5-1-5-0"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2"
-       inkscape:original-d="m 475.41709,184.68945 c 14.66303,14.2721 29.323,28.54321 43.97988,42.81328"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6)"
-       d="m 476.32916,241.51456 c 13.86102,-0.34 27.7191,-0.67992 41.57417,-1.01977"
-       id="path5226-6-2-1-2-4-5-1-5-0-2"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9"
-       inkscape:original-d="m 476.32916,241.51456 c 13.861,-0.34097 27.71908,-0.6809 41.57417,-1.01977"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14e4;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-6)"
-       d="m 474.31327,298.61285 c 15.031,-15.59075 30.05891,-31.17831 45.0837,-46.76263"
-       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
-       inkscape:original-d="m 474.31327,298.61285 c 15.03102,-15.59073 30.05893,-31.17829 45.0837,-46.76263"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1924-3);stroke-width:0.94657081;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3736-8-0-1-7-7"
-       width="30.678661"
-       height="24.347494"
-       x="519.39697"
-       y="227.50273" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="571.69696"
-       y="217.79964"
-       id="text5219-2-4-3-3-4-54-8-7-5"
-       transform="scale(0.91487885,1.0930409)"><tspan
-         sodipodi:role="line"
-         x="571.69696"
-         y="217.79964"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2-3">Single</tspan><tspan
-         sodipodi:role="line"
-         x="571.69696"
-         y="226.76561"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan6344">Link Q</tspan></text>
     <path
        style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:1.01153409;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-6-6)"
        d="m 391.11413,240.54267 c 10.00574,0.0714 20.0096,0.14275 30.01154,0.21411"
@@ -3500,49 +3505,184 @@
        inkscape:path-effect="#path-effect5228-5-1-6-84-8"
        inkscape:original-d="m 389.52644,184.04076 c 10.2068,0.0715 20.41172,0.14408 30.61473,0.21761"
        sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="665.00641"
+       y="346.51425"
+       id="text5219-2-4-3-3-4-54-8-7"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="665.00641"
+         y="346.51425"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-2)"
-       d="m 533.61005,227.17178 c -0.11895,-11.90475 -0.23788,-23.80683 -0.35678,-35.70623"
-       id="path5226-6-2-1-2-4-5-1-5-0-4"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77748054;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10992218, 0.77748055;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5)"
+       d="m 475.15346,298.63383 c 13.1798,0.0326 26.3569,0.0653 39.53121,0.0979"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-6"
-       inkscape:original-d="m 533.61005,227.17178 c -0.11794,-11.90476 -0.23687,-23.80684 -0.35678,-35.70623"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
+       inkscape:original-d="m 475.15346,298.63383 c 13.1798,0.0316 26.3569,0.0643 39.53121,0.0979"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9)"
-       d="m 554.18303,173.89676 c 12.12572,3.64515 24.2491,7.2896 36.37012,10.93334"
-       id="path5226-6-2-1-2-4-5-1-5-0-48"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77332252;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.09329006, 0.77332252;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1)"
+       d="m 476.76243,243.22025 c 12.91755,-0.0156 25.83246,-0.0312 38.74462,-0.0468"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0"
-       inkscape:original-d="m 554.18303,173.89676 c 12.12608,3.64396 24.24946,7.28841 36.37012,10.93334"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       inkscape:original-d="m 476.76243,243.22025 c 12.91755,-0.0166 25.83246,-0.0322 38.74462,-0.0468"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9-7)"
-       d="m 554.18303,173.89676 c 12.8469,22.86455 25.6922,45.72625 38.53585,68.585"
-       id="path5226-6-2-1-2-4-5-1-5-0-48-2"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77624762;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10499055, 0.77624764;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-9)"
+       d="m 475.69395,186.40577 c 12.95011,-0.0208 25.89755,-0.0415 38.84226,-0.0623"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-06"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
-       inkscape:original-d="m 554.18303,173.89676 c 12.84809,22.86388 25.69339,45.72558 38.53585,68.585"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       inkscape:original-d="m 475.69395,186.40577 c 12.95011,-0.0218 25.89755,-0.0426 38.84226,-0.0623"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79"
+       width="72.081367"
+       height="32.405426"
+       x="517.28845"
+       y="170.26158"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="520.91443"
+       y="189.34982"
+       id="text5219-2-6-2"><tspan
+         sodipodi:role="line"
+         x="520.91443"
+         y="189.34982"
+         id="tspan5223-0-9-02"
+         style="font-size:10px;line-height:1.25">port n+m+1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="534.99072"
+       y="225.10315"
+       id="text5219-2-3-7-2-1-8-3"
+       transform="scale(0.89243779,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="534.99072"
+         y="225.10315"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6">Single link</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1"
+       width="72.081367"
+       height="32.405426"
+       x="518.08734"
+       y="226.69656"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="522.60663"
+       y="246.00677"
+       id="text5219-2-6-1-7"><tspan
+         sodipodi:role="line"
+         x="522.60663"
+         y="246.00677"
+         id="tspan5223-0-9-0-5"
+         style="font-size:10px;line-height:1.25">port n+m+2</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1-7"
+       width="72.081367"
+       height="32.405426"
+       x="517.45502"
+       y="282.45056"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="530.6615"
+       y="301.52756"
+       id="text5219-2-6-1-6-2"><tspan
+         sodipodi:role="line"
+         x="530.6615"
+         y="301.52756"
+         id="tspan5223-0-9-0-4-2"
+         style="font-size:10px;line-height:1.25">port n+o</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9-72)"
-       d="m 554.18303,173.89676 c 12.65661,41.60787 25.31164,83.21054 37.96507,124.80795"
-       id="path5226-6-2-1-2-4-5-1-5-0-48-1"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0)"
+       d="m 590.00917,186.37588 c 7.95108,0.0405 15.90052,0.0811 23.84823,0.12159"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
-       inkscape:original-d="m 554.18303,173.89676 c 12.65781,41.6075 25.31284,83.21018 37.96507,124.80795"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       inkscape:original-d="m 590.00917,186.37588 c 7.95109,0.0395 15.90052,0.0801 23.84823,0.12159"
        sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-0)"
+       d="m 590.88337,242.76574 c 7.86699,0.091 15.73233,0.18199 23.59597,0.27295"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-2"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       inkscape:original-d="m 590.88337,242.76574 c 7.867,0.09 15.73234,0.18097 23.59597,0.27295"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-06)"
+       d="m 590.00764,298.95403 c 8.49934,0.0508 16.99697,0.10162 25.49284,0.15242"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
+       inkscape:original-d="m 590.00764,298.95403 c 8.49935,0.0498 16.99698,0.10062 25.49284,0.15242"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760-3);stroke-width:0.67135191;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2896-6-7"
+       width="159.92059"
+       height="161.38417"
+       x="513.79218"
+       y="159.39674"
+       ry="4.080533"
+       rx="5.9213624"
+       inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
+       inkscape:export-xdpi="112"
+       inkscape:export-ydpi="112" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="665.00641"
-       y="346.51425"
-       id="text5219-2-4-3-3-4-54-8-7"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="536.09253"
+       y="175.43703"
+       id="text5219-2-3-7-2-1-8-3-5"
+       transform="scale(0.89243778,1.1205263)"><tspan
          sodipodi:role="line"
-         x="665.00641"
-         y="346.51425"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
+         x="536.09253"
+         y="175.43703"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-3">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="533.85394"
+       y="274.00516"
+       id="text5219-2-3-7-2-1-8-3-56"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="533.85394"
+         y="274.00516"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-2">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="575.06464"
+       y="155.52603"
+       id="text5219-2-4-2"><tspan
+         sodipodi:role="line"
+         x="575.06464"
+         y="155.52603"
+         id="tspan5223-0-7-70"
+         style="font-size:10px;line-height:1.25">Tx adapter</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg b/doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
similarity index 99%
rename from doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg
rename to doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
index c0a365c7b..3036ad663 100644
--- a/doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
@@ -20,8 +20,8 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="eventdev_pipeline_queue_test_lockfree.svg"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
+   sodipodi:docname="eventdev_pipeline_queue_test_internal_port.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
@@ -2853,17 +2853,17 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="2.0000001"
-     inkscape:cx="394.32532"
-     inkscape:cy="122.70585"
+     inkscape:zoom="1.6933595"
+     inkscape:cx="466.69113"
+     inkscape:cy="93.384431"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -3809,7 +3809,7 @@
          x="670.83521"
          y="349.11719"
          style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4">(Tx Lock free)</tspan></text>
+         id="tspan1265-4">(Internal port)</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:11.11939621px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92661637"
diff --git a/doc/guides/tools/testeventdev.rst b/doc/guides/tools/testeventdev.rst
index 46effd871..143d7800b 100644
--- a/doc/guides/tools/testeventdev.rst
+++ b/doc/guides/tools/testeventdev.rst
@@ -521,8 +521,9 @@ This is a pipeline test case that aims at testing the following:
    +===+==============+================+=========================================+
    | 1 | nb_queues    | (nb_producers  | Queues will be configured based on the  |
    |   |              | * nb_stages) + | user requested sched type list(--stlist)|
-   |   |              | x              | Here value of x is 1 in generic pipeline|
-   |   |              |                | and nb_producers in lockfree pipeline   |
+   |   |              | nb_producers   | At the last stage of the schedule list  |
+   |   |              |                | the event is enqueued onto per port     |
+   |   |              |                | unique queue which is then Transmitted. |
    +---+--------------+----------------+-----------------------------------------+
    | 2 | nb_producers | >= 1           | Producers will be configured based on   |
    |   |              |                | the number of detected ethernet devices.|
@@ -533,17 +534,19 @@ This is a pipeline test case that aims at testing the following:
    |   |              |                | argument                                |
    +---+--------------+----------------+-----------------------------------------+
    | 4 | nb_ports     | nb_workers +   | Workers use port 0 to port n.           |
-   |   |              | nb_producers   | Producers use port n+1 to port n+m,     |
-   |   |              |                | depending on the Rx adapter capability. |
+   |   |              | (nb_produces * | Producers use port n+1 to port n+m,     |
+   |   |              | 2)             | depending on the Rx adapter capability. |
+   |   |              |                | Consumers use port n+m+1 to port n+o    |
+   |   |              |                | depending on the Tx adapter capability. |
    +---+--------------+----------------+-----------------------------------------+
 
 .. _figure_eventdev_pipeline_queue_test_generic:
 
 .. figure:: img/eventdev_pipeline_queue_test_generic.*
 
-.. _figure_eventdev_pipeline_queue_test_lockfree:
+.. _figure_eventdev_pipeline_queue_test_internal_port:
 
-.. figure:: img/eventdev_pipeline_queue_test_lockfree.*
+.. figure:: img/eventdev_pipeline_queue_test_internal_port.*
 
    pipeline queue test operation.
 
@@ -568,10 +571,11 @@ the last stage in the pipeline if the event type is ``atomic`` it is enqueued
 onto ethdev Tx queue else to maintain ordering the event type is set to
 ``atomic`` and enqueued onto the last stage queue.
 
-If the ethernet has ``DEV_TX_OFFLOAD_MT_LOCKFREE`` capability then the worker
-cores transmit the packets directly. Else the worker cores enqueue the packet
-onto the ``SINGLE_LINK_QUEUE`` that is managed by a Tx service. The Tx service
-dequeues the packet and transmits it.
+If the ethdev and eventdev pair have ``RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT``
+capability then the worker cores enqueue the packets to the eventdev directly
+using ``rte_event_eth_tx_adapter_enqueue`` else the worker cores enqueue the
+packet onto the ``SINGLE_LINK_QUEUE`` that is managed by the Tx adapter.
+The Tx adapter dequeues the packet and transmits it.
 
 On packet Tx, application increments the number events processed and print
 periodically in one second to get the number of events processed in one
@@ -628,8 +632,9 @@ This is a pipeline test case that aims at testing the following with
    +===+==============+================+=========================================+
    | 1 | nb_queues    | nb_producers + | Queues will be configured based on the  |
    |   |              | x              | user requested sched type list(--stlist)|
-   |   |              |                | where x = 1 in generic pipeline and 0   |
-   |   |              |                | in lockfree pipeline                    |
+   |   |              |                | where x = nb_producers in generic       |
+   |   |              |                | pipeline and 0 if all the ethdev        |
+   |   |              |                | being used have Internal port capability|
    +---+--------------+----------------+-----------------------------------------+
    | 2 | nb_producers | >= 1           | Producers will be configured based on   |
    |   |              |                | the number of detected ethernet devices.|
@@ -640,17 +645,22 @@ This is a pipeline test case that aims at testing the following with
    |   |              |                | argument                                |
    +---+--------------+----------------+-----------------------------------------+
    | 4 | nb_ports     | nb_workers +   | Workers use port 0 to port n.           |
-   |   |              | nb_producers   | Producers use port n+1 to port n+m,     |
-   |   |              |                | depending on the Rx adapter capability. |
+   |   |              | nb_producers + | Producers use port n+1 to port n+m,     |
+   |   |              | x              | depending on the Rx adapter capability. |
+   |   |              |                | x = nb_producers in generic pipeline and|
+   |   |              |                | 0 if all the ethdev being used have     |
+   |   |              |                | Internal port capability.               |
+   |   |              |                | Consumers may use port n+m+1 to port n+o|
+   |   |              |                | depending on the Tx adapter capability. |
    +---+--------------+----------------+-----------------------------------------+
 
 .. _figure_eventdev_pipeline_atq_test_generic:
 
 .. figure:: img/eventdev_pipeline_atq_test_generic.*
 
-.. _figure_eventdev_pipeline_atq_test_lockfree:
+.. _figure_eventdev_pipeline_atq_test_internal_port:
 
-.. figure:: img/eventdev_pipeline_atq_test_lockfree.*
+.. figure:: img/eventdev_pipeline_atq_test_internal_port.*
 
    pipeline atq test operation.
 
-- 
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
@ 2018-09-05  6:54   ` Rao, Nikhil
  2018-09-05  8:54     ` Pavan Nikhilesh
  0 siblings, 1 reply; 22+ messages in thread
From: Rao, Nikhil @ 2018-09-05  6:54 UTC (permalink / raw)
  To: Pavan Nikhilesh, jerin.jacob, anoob.joseph; +Cc: dev, Rao, Nikhil

On 9/4/2018 7:42 PM, Pavan Nikhilesh wrote:
> Convert existing Tx service based pipeline to Tx adapter based APIs and
> simplify worker functions.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> ---
>   app/test-eventdev/test_pipeline_atq.c    | 269 ++++++++++++-----------
>   app/test-eventdev/test_pipeline_common.c | 206 +++++------------
>   app/test-eventdev/test_pipeline_common.h |  62 +++---
>   app/test-eventdev/test_pipeline_queue.c  | 241 ++++++++++----------
>   4 files changed, 367 insertions(+), 411 deletions(-)
>    
> diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
> index 832ab8b6e..ab407dbbb 100644
> --- a/app/test-eventdev/test_pipeline_common.c
> +++ b/app/test-eventdev/test_pipeline_common.c
> @@ -5,58 +5,6 @@
>   
> 
> @@ -215,7 +160,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
>   {
>   	uint16_t i;
>   	uint8_t nb_queues = 1;
> -	uint8_t mt_state = 0;
>   	struct test_pipeline *t = evt_test_priv(test);
>   	struct rte_eth_rxconf rx_conf;
>   	struct rte_eth_conf port_conf = {
> @@ -238,13 +182,21 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
>   		return -ENODEV;
>   	}
>   
> +	t->internal_port = 0;
>   	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;
> +
> +		rte_event_eth_tx_adapter_caps_get(opt->dev_id, i, &caps);
> +		if ((caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) {
> +			t->internal_port = 1;
> +		} else if (t->internal_port == 1) {
> +			evt_err("Eventdev can't use %d port", i);
> +			return -EINVAL;
> +		}
>   
Shouldn't this function also return -EINVAL for the case where 
internal_port = 0 for i = 0, and internal_port = 1 for i = 1 ?

Nikhil

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support
  2018-09-05  6:54   ` Rao, Nikhil
@ 2018-09-05  8:54     ` Pavan Nikhilesh
  2018-09-05  9:37       ` Rao, Nikhil
  0 siblings, 1 reply; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-05  8:54 UTC (permalink / raw)
  To: Rao, Nikhil, jerin.jacob, anoob.joseph; +Cc: dev

On Wed, Sep 05, 2018 at 12:24:18PM +0530, Rao, Nikhil wrote:
> On 9/4/2018 7:42 PM, Pavan Nikhilesh wrote:
> > Convert existing Tx service based pipeline to Tx adapter based APIs and
> > simplify worker functions.
> >
> > Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> > ---
> >   app/test-eventdev/test_pipeline_atq.c    | 269 ++++++++++++-----------
> >   app/test-eventdev/test_pipeline_common.c | 206 +++++------------
> >   app/test-eventdev/test_pipeline_common.h |  62 +++---
> >   app/test-eventdev/test_pipeline_queue.c  | 241 ++++++++++----------
> >   4 files changed, 367 insertions(+), 411 deletions(-)
> >
> > diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
> > index 832ab8b6e..ab407dbbb 100644
> > --- a/app/test-eventdev/test_pipeline_common.c
> > +++ b/app/test-eventdev/test_pipeline_common.c
> > @@ -5,58 +5,6 @@
> >
> >
> > @@ -215,7 +160,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
> >   {
> >       uint16_t i;
> >       uint8_t nb_queues = 1;
> > -     uint8_t mt_state = 0;
> >       struct test_pipeline *t = evt_test_priv(test);
> >       struct rte_eth_rxconf rx_conf;
> >       struct rte_eth_conf port_conf = {
> > @@ -238,13 +182,21 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
> >               return -ENODEV;
> >       }
> >
> > +     t->internal_port = 0;
> >       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;
> > +
> > +             rte_event_eth_tx_adapter_caps_get(opt->dev_id, i, &caps);
> > +             if ((caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) {
> > +                     t->internal_port = 1;
> > +             } else if (t->internal_port == 1) {
> > +                     evt_err("Eventdev can't use %d port", i);
> > +                     return -EINVAL;
> > +             }
> >
> Shouldn't this function also return -EINVAL for the case where
> internal_port = 0 for i = 0, and internal_port = 1 for i = 1 ?

I think it would be better to force all the ports to use the non-internal cap
mode when we detect that one of the port doesn't have internal port capability
rather than exiting. This was the behaviour previously it will leave room to
support both the pipeline models in future.

>
> Nikhil
>

Thanks,
Pavan.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support
  2018-09-05  8:54     ` Pavan Nikhilesh
@ 2018-09-05  9:37       ` Rao, Nikhil
  0 siblings, 0 replies; 22+ messages in thread
From: Rao, Nikhil @ 2018-09-05  9:37 UTC (permalink / raw)
  To: Pavan Nikhilesh, jerin.jacob, anoob.joseph; +Cc: dev

On 9/5/2018 2:24 PM, Pavan Nikhilesh wrote:
> On Wed, Sep 05, 2018 at 12:24:18PM +0530, Rao, Nikhil wrote:
>> On 9/4/2018 7:42 PM, Pavan Nikhilesh wrote:
>>> Convert existing Tx service based pipeline to Tx adapter based APIs and
>>> simplify worker functions.
>>>
>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
>>> ---
>>>    app/test-eventdev/test_pipeline_atq.c    | 269 ++++++++++++-----------
>>>    app/test-eventdev/test_pipeline_common.c | 206 +++++------------
>>>    app/test-eventdev/test_pipeline_common.h |  62 +++---
>>>    app/test-eventdev/test_pipeline_queue.c  | 241 ++++++++++----------
>>>    4 files changed, 367 insertions(+), 411 deletions(-)
>>>
>>> diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
>>> index 832ab8b6e..ab407dbbb 100644
>>> --- a/app/test-eventdev/test_pipeline_common.c
>>> +++ b/app/test-eventdev/test_pipeline_common.c
>>> @@ -5,58 +5,6 @@
>>>
>>>
>>> @@ -215,7 +160,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
>>>    {
>>>        uint16_t i;
>>>        uint8_t nb_queues = 1;
>>> -     uint8_t mt_state = 0;
>>>        struct test_pipeline *t = evt_test_priv(test);
>>>        struct rte_eth_rxconf rx_conf;
>>>        struct rte_eth_conf port_conf = {
>>> @@ -238,13 +182,21 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
>>>                return -ENODEV;
>>>        }
>>>
>>> +     t->internal_port = 0;
>>>        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;
>>> +
>>> +             rte_event_eth_tx_adapter_caps_get(opt->dev_id, i, &caps);
>>> +             if ((caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) {
>>> +                     t->internal_port = 1;
>>> +             } else if (t->internal_port == 1) {
>>> +                     evt_err("Eventdev can't use %d port", i);
>>> +                     return -EINVAL;
>>> +             }
>>>
>> Shouldn't this function also return -EINVAL for the case where
>> internal_port = 0 for i = 0, and internal_port = 1 for i = 1 ?
> 
> I think it would be better to force all the ports to use the non-internal cap
> mode when we detect that one of the port doesn't have internal port capability
> rather than exiting. This was the behaviour previously it will leave room to
> support both the pipeline models in future.

Agreed.

Nikhil

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev]  [PATCH v3 1/4] app/test-eventdev: fix minor typos
  2018-09-04 14:12 [dpdk-dev] [PATCH v2 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
                   ` (2 preceding siblings ...)
  2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 4/4] doc: update eventdev application guide Pavan Nikhilesh
@ 2018-09-19 22:22 ` Pavan Nikhilesh
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
                     ` (3 more replies)
  2018-09-24  8:02 ` [dpdk-dev] [PATCH v4 " Pavan Nikhilesh
  4 siblings, 4 replies; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-19 22:22 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh

Fix minor typos.

Fixes: 314bcf58ca8f ("app/eventdev: add pipeline queue worker functions")

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---

 v3 Changes:
 - Force all the ports to use the non-internal cap mode when we detect
 that one of the port doesn't have internal port capability.

 app/test-eventdev/test_pipeline_atq.c    | 16 ++++++++--------
 app/test-eventdev/test_pipeline_common.h |  8 ++++----
 app/test-eventdev/test_pipeline_queue.c  | 16 ++++++++--------
 3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
index 26dc79f90..f0b2f9015 100644
--- a/app/test-eventdev/test_pipeline_atq.c
+++ b/app/test-eventdev/test_pipeline_atq.c
@@ -18,7 +18,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
 static int
 pipeline_atq_worker_single_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;

 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -43,7 +43,7 @@ pipeline_atq_worker_single_stage_tx(void *arg)
 static int
 pipeline_atq_worker_single_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -66,7 +66,7 @@ pipeline_atq_worker_single_stage_fwd(void *arg)
 static int
 pipeline_atq_worker_single_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;

 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -98,7 +98,7 @@ pipeline_atq_worker_single_stage_burst_tx(void *arg)
 static int
 pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -126,7 +126,7 @@ pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 static int
 pipeline_atq_worker_multi_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;


@@ -161,7 +161,7 @@ pipeline_atq_worker_multi_stage_tx(void *arg)
 static int
 pipeline_atq_worker_multi_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;
 	const uint8_t tx_queue = t->tx_service.queue_id;

@@ -192,7 +192,7 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 static int
 pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;

 	while (t->done == false) {
@@ -234,7 +234,7 @@ pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 static int
 pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;
 	const uint8_t tx_queue = t->tx_service.queue_id;

diff --git a/app/test-eventdev/test_pipeline_common.h b/app/test-eventdev/test_pipeline_common.h
index 5fb91607d..9cd6b905b 100644
--- a/app/test-eventdev/test_pipeline_common.h
+++ b/app/test-eventdev/test_pipeline_common.h
@@ -65,14 +65,14 @@ struct test_pipeline {

 #define BURST_SIZE 16

-#define PIPELINE_WROKER_SINGLE_STAGE_INIT \
+#define PIPELINE_WORKER_SINGLE_STAGE_INIT \
 	struct worker_data *w  = arg;     \
 	struct test_pipeline *t = w->t;   \
 	const uint8_t dev = w->dev_id;    \
 	const uint8_t port = w->port_id;  \
 	struct rte_event ev

-#define PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT \
+#define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
 	int i;                                  \
 	struct worker_data *w  = arg;           \
 	struct test_pipeline *t = w->t;         \
@@ -80,7 +80,7 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;        \
 	struct rte_event ev[BURST_SIZE + 1]

-#define PIPELINE_WROKER_MULTI_STAGE_INIT                         \
+#define PIPELINE_WORKER_MULTI_STAGE_INIT                         \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
 	uint8_t cq_id;                                           \
@@ -90,7 +90,7 @@ struct test_pipeline {
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
 	struct rte_event ev

-#define PIPELINE_WROKER_MULTI_STAGE_BURST_INIT                   \
+#define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT                   \
 	int i;                                  \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c
index ca5f4578e..2e0d93d99 100644
--- a/app/test-eventdev/test_pipeline_queue.c
+++ b/app/test-eventdev/test_pipeline_queue.c
@@ -18,7 +18,7 @@ pipeline_queue_nb_event_queues(struct evt_options *opt)
 static int
 pipeline_queue_worker_single_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;

 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -44,7 +44,7 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 static int
 pipeline_queue_worker_single_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -67,7 +67,7 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 static int
 pipeline_queue_worker_single_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;

 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -101,7 +101,7 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 static int
 pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -130,7 +130,7 @@ pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 static int
 pipeline_queue_worker_multi_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;

 	while (t->done == false) {
@@ -165,7 +165,7 @@ pipeline_queue_worker_multi_stage_tx(void *arg)
 static int
 pipeline_queue_worker_multi_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;
 	const uint8_t tx_queue = t->tx_service.queue_id;

@@ -196,7 +196,7 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 static int
 pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;

 	while (t->done == false) {
@@ -240,7 +240,7 @@ pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 static int
 pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;
 	const uint8_t tx_queue = t->tx_service.queue_id;

--
2.19.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant newlines
  2018-09-19 22:22 ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
@ 2018-09-19 22:22   ` Pavan Nikhilesh
  2018-09-23 10:31     ` Jerin Jacob
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-19 22:22 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
 app/test-eventdev/test_pipeline_common.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
index 12a58fbbf..cdf9010b4 100644
--- a/app/test-eventdev/test_pipeline_common.c
+++ b/app/test-eventdev/test_pipeline_common.c
@@ -65,12 +65,12 @@ pipeline_test_result(struct evt_test *test, struct evt_options *opt)
 	uint64_t total = 0;
 	struct test_pipeline *t = evt_test_priv(test);
 
-	printf("Packet distribution across worker cores :\n");
+	evt_info("Packet distribution across worker cores :");
 	for (i = 0; i < t->nb_workers; i++)
 		total += t->worker[i].processed_pkts;
 	for (i = 0; i < t->nb_workers; i++)
-		printf("Worker %d packets: "CLGRN"%"PRIx64" "CLNRM"percentage:"
-				CLGRN" %3.2f\n"CLNRM, i,
+		evt_info("Worker %d packets: "CLGRN"%"PRIx64""CLNRM" percentage:"
+				CLGRN" %3.2f"CLNRM, i,
 				t->worker[i].processed_pkts,
 				(((double)t->worker[i].processed_pkts)/total)
 				* 100);
@@ -233,7 +233,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 
 	RTE_SET_USED(opt);
 	if (!rte_eth_dev_count_avail()) {
-		evt_err("No ethernet ports found.\n");
+		evt_err("No ethernet ports found.");
 		return -ENODEV;
 	}
 
@@ -252,7 +252,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
 				port_conf.rx_adv_conf.rss_conf.rss_hf) {
 			evt_info("Port %u modified RSS hash function based on hardware support,"
-				"requested:%#"PRIx64" configured:%#"PRIx64"\n",
+				"requested:%#"PRIx64" configured:%#"PRIx64"",
 				i,
 				port_conf.rx_adv_conf.rss_conf.rss_hf,
 				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
@@ -261,19 +261,19 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 		if (rte_eth_dev_configure(i, nb_queues, nb_queues,
 					&local_port_conf)
 				< 0) {
-			evt_err("Failed to configure eth port [%d]\n", i);
+			evt_err("Failed to configure eth port [%d]", i);
 			return -EINVAL;
 		}
 
 		if (rte_eth_rx_queue_setup(i, 0, NB_RX_DESC,
 				rte_socket_id(), &rx_conf, t->pool) < 0) {
-			evt_err("Failed to setup eth port [%d] rx_queue: %d.\n",
+			evt_err("Failed to setup eth port [%d] rx_queue: %d.",
 					i, 0);
 			return -EINVAL;
 		}
 		if (rte_eth_tx_queue_setup(i, 0, NB_TX_DESC,
 					rte_socket_id(), NULL) < 0) {
-			evt_err("Failed to setup eth port [%d] tx_queue: %d.\n",
+			evt_err("Failed to setup eth port [%d] tx_queue: %d.",
 					i, 0);
 			return -EINVAL;
 		}
@@ -379,7 +379,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			ret = evt_service_setup(service_id);
 			if (ret) {
 				evt_err("Failed to setup service core"
-						" for Rx adapter\n");
+						" for Rx adapter");
 				return ret;
 			}
 		}
@@ -396,8 +396,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			evt_err("Rx adapter[%d] start failed", prod);
 			return ret;
 		}
-		printf("%s: Port[%d] using Rx adapter[%d] started\n", __func__,
-				prod, prod);
+		evt_info("Port[%d] using Rx adapter[%d] started", prod, prod);
 	}
 
 	return ret;
-- 
2.19.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support
  2018-09-19 22:22 ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
@ 2018-09-19 22:22   ` Pavan Nikhilesh
  2018-09-23 11:35     ` Jerin Jacob
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 4/4] doc: update eventdev application guide Pavan Nikhilesh
  2018-09-23 10:28   ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Jerin Jacob
  3 siblings, 1 reply; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-19 22:22 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh

Convert existing Tx service based pipeline to Tx adapter based APIs and
simplify worker functions.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
 app/test-eventdev/test_pipeline_atq.c    | 269 ++++++++++++-----------
 app/test-eventdev/test_pipeline_common.c | 202 +++++------------
 app/test-eventdev/test_pipeline_common.h |  62 +++---
 app/test-eventdev/test_pipeline_queue.c  | 241 ++++++++++----------
 4 files changed, 363 insertions(+), 411 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
index f0b2f9015..01af298f3 100644
--- a/app/test-eventdev/test_pipeline_atq.c
+++ b/app/test-eventdev/test_pipeline_atq.c
@@ -15,7 +15,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
 	return rte_eth_dev_count_avail();
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
@@ -28,23 +28,18 @@ pipeline_atq_worker_single_stage_tx(void *arg)
 			continue;
 		}
 
-		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-			pipeline_tx_pkt(ev.mbuf);
-			w->processed_pkts++;
-			continue;
-		}
-		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		pipeline_event_enqueue(dev, port, &ev);
+		pipeline_event_tx(dev, port, &ev);
+		w->processed_pkts++;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -54,16 +49,16 @@ pipeline_atq_worker_single_stage_fwd(void *arg)
 			continue;
 		}
 
-		w->processed_pkts++;
-		ev.queue_id = tx_queue;
+		ev.queue_id = tx_queue[ev.mbuf->port];
 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
+		w->processed_pkts++;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
@@ -79,27 +74,21 @@ pipeline_atq_worker_single_stage_burst_tx(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev[i].mbuf);
-				ev[i].op = RTE_EVENT_OP_RELEASE;
-				w->processed_pkts++;
-			} else
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 		}
 
-		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		pipeline_event_tx_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -112,23 +101,22 @@ pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			ev[i].queue_id = tx_queue;
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
+			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
-			w->processed_pkts++;
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -141,29 +129,24 @@ pipeline_atq_worker_multi_stage_tx(void *arg)
 		cq_id = ev.sub_event_type % nb_stages;
 
 		if (cq_id == last_queue) {
-			if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev.mbuf);
-				w->processed_pkts++;
-				continue;
-			}
-			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		} else {
-			ev.sub_event_type++;
-			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
+			pipeline_event_tx(dev, port, &ev);
+			w->processed_pkts++;
+			continue;
 		}
 
+		ev.sub_event_type++;
+		pipeline_fwd_event(&ev, sched_type_list[cq_id]);
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -176,9 +159,9 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 		cq_id = ev.sub_event_type % nb_stages;
 
 		if (cq_id == last_queue) {
-			w->processed_pkts++;
-			ev.queue_id = tx_queue;
+			ev.queue_id = tx_queue[ev.mbuf->port];
 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
+			w->processed_pkts++;
 		} else {
 			ev.sub_event_type++;
 			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
@@ -186,14 +169,14 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -209,34 +192,27 @@ pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 			cq_id = ev[i].sub_event_type % nb_stages;
 
 			if (cq_id == last_queue) {
-				if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-					pipeline_tx_pkt(ev[i].mbuf);
-					ev[i].op = RTE_EVENT_OP_RELEASE;
-					w->processed_pkts++;
-					continue;
-				}
-
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
-			} else {
-				ev[i].sub_event_type++;
-				pipeline_fwd_event(&ev[i],
-						sched_type_list[cq_id]);
+				pipeline_event_tx(dev, port, &ev[i]);
+				ev[i].op = RTE_EVENT_OP_RELEASE;
+				w->processed_pkts++;
+				continue;
 			}
+
+			ev[i].sub_event_type++;
+			pipeline_fwd_event(&ev[i], sched_type_list[cq_id]);
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -253,7 +229,7 @@ pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 
 			if (cq_id == last_queue) {
 				w->processed_pkts++;
-				ev[i].queue_id = tx_queue;
+				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
 				pipeline_fwd_event(&ev[i],
 						RTE_SCHED_TYPE_ATOMIC);
 			} else {
@@ -265,6 +241,7 @@ pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
@@ -274,39 +251,36 @@ worker_wrapper(void *arg)
 	struct worker_data *w  = arg;
 	struct evt_options *opt = w->t->opt;
 	const bool burst = evt_has_burst_mode(w->dev_id);
-	const bool mt_safe = !w->t->mt_unsafe;
+	const bool internal_port = w->t->internal_port;
 	const uint8_t nb_stages = opt->nb_stages;
 	RTE_SET_USED(opt);
 
 	if (nb_stages == 1) {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_atq_worker_single_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_atq_worker_single_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_atq_worker_single_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_atq_worker_single_stage_burst_fwd(arg);
 	} else {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_atq_worker_multi_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_atq_worker_multi_stage_fwd(arg);
-		if (burst && mt_safe)
+		if (burst && internal_port)
 			return pipeline_atq_worker_multi_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_atq_worker_multi_stage_burst_fwd(arg);
 	}
+
 	rte_panic("invalid worker\n");
 }
 
 static int
 pipeline_atq_launch_lcores(struct evt_test *test, struct evt_options *opt)
 {
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe)
-		rte_service_component_runstate_set(t->tx_service.service_id, 1);
 	return pipeline_launch_lcores(test, opt, worker_wrapper);
 }
 
@@ -317,34 +291,36 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	int nb_ports;
 	int nb_queues;
 	uint8_t queue;
-	struct rte_event_dev_info info;
-	struct test_pipeline *t = evt_test_priv(test);
-	uint8_t tx_evqueue_id = 0;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};
 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
 	uint8_t nb_worker_queues = 0;
+	uint8_t tx_evport_id = 0;
+	uint16_t prod = 0;
+	struct rte_event_dev_info info;
+	struct test_pipeline *t = evt_test_priv(test);
 
 	nb_ports = evt_nr_active_lcores(opt->wlcores);
 	nb_queues = rte_eth_dev_count_avail();
 
-	/* One extra port and queueu for Tx service */
-	if (t->mt_unsafe) {
-		tx_evqueue_id = nb_queues;
-		nb_ports++;
-		nb_queues++;
+	/* One queue for Tx adapter per port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			tx_evqueue_id[prod] = nb_queues;
+			nb_queues++;
+		}
 	}
 
-
 	rte_event_dev_info_get(opt->dev_id, &info);
 
 	const struct rte_event_dev_config config = {
-			.nb_event_queues = nb_queues,
-			.nb_event_ports = nb_ports,
-			.nb_events_limit  = info.max_num_events,
-			.nb_event_queue_flows = opt->nb_flows,
-			.nb_event_port_dequeue_depth =
-				info.max_event_port_dequeue_depth,
-			.nb_event_port_enqueue_depth =
-				info.max_event_port_enqueue_depth,
+		.nb_event_queues = nb_queues,
+		.nb_event_ports = nb_ports,
+		.nb_events_limit  = info.max_num_events,
+		.nb_event_queue_flows = opt->nb_flows,
+		.nb_event_port_dequeue_depth =
+			info.max_event_port_dequeue_depth,
+		.nb_event_port_enqueue_depth =
+			info.max_event_port_enqueue_depth,
 	};
 	ret = rte_event_dev_configure(opt->dev_id, &config);
 	if (ret) {
@@ -353,21 +329,23 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	}
 
 	struct rte_event_queue_conf q_conf = {
-			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
-			.nb_atomic_flows = opt->nb_flows,
-			.nb_atomic_order_sequences = opt->nb_flows,
+		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
+		.nb_atomic_flows = opt->nb_flows,
+		.nb_atomic_order_sequences = opt->nb_flows,
 	};
 	/* queue configurations */
 	for (queue = 0; queue < nb_queues; queue++) {
 		q_conf.event_queue_cfg = RTE_EVENT_QUEUE_CFG_ALL_TYPES;
 
-		if (t->mt_unsafe) {
-			if (queue == tx_evqueue_id) {
-				q_conf.event_queue_cfg =
-					RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
-			} else {
-				queue_arr[nb_worker_queues] = queue;
-				nb_worker_queues++;
+		if (!t->internal_port) {
+			RTE_ETH_FOREACH_DEV(prod) {
+				if (queue == tx_evqueue_id[prod]) {
+					q_conf.event_queue_cfg =
+						RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
+				} else {
+					queue_arr[nb_worker_queues] = queue;
+					nb_worker_queues++;
+				}
 			}
 		}
 
@@ -383,20 +361,15 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 
 	/* port configuration */
 	const struct rte_event_port_conf p_conf = {
-			.dequeue_depth = opt->wkr_deq_dep,
-			.enqueue_depth = info.max_event_port_dequeue_depth,
-			.new_event_threshold = info.max_num_events,
+		.dequeue_depth = opt->wkr_deq_dep,
+		.enqueue_depth = info.max_event_port_dequeue_depth,
+		.new_event_threshold = info.max_num_events,
 	};
 
-	if (t->mt_unsafe) {
+	if (!t->internal_port)
 		ret = pipeline_event_port_setup(test, opt, queue_arr,
 				nb_worker_queues, p_conf);
-		if (ret)
-			return ret;
-
-		ret = pipeline_event_tx_service_setup(test, opt, tx_evqueue_id,
-				nb_ports - 1, p_conf);
-	} else
+	else
 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
 				p_conf);
 
@@ -408,30 +381,32 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *
 	 * eth_dev_count = 2, nb_stages = 2, atq mode
 	 *
-	 * Multi thread safe :
+	 * eth0, eth1 have Internal port capability :
 	 *	queues = 2
 	 *	stride = 1
 	 *
 	 *	event queue pipelines:
-	 *	eth0 -> q0 ->tx
-	 *	eth1 -> q1 ->tx
+	 *	eth0 -> q0 ->Tx
+	 *	eth1 -> q1 ->Tx
 	 *
 	 *	q0, q1 are configured as ATQ so, all the different stages can
 	 *	be enqueued on the same queue.
 	 *
-	 * Multi thread unsafe :
-	 *	queues = 3
+	 * eth0, eth1 use Tx adapters service core :
+	 *	queues = 4
 	 *	stride = 1
 	 *
 	 *	event queue pipelines:
-	 *	eth0 -> q0
-	 *		  } (q3->tx) Tx service
-	 *	eth1 -> q1
+	 *	eth0 -> q0  -> q2 -> Tx
+	 *	eth1 -> q1  -> q3 -> Tx
 	 *
-	 *	q0,q1 are configured as stated above.
-	 *	q3 configured as SINGLE_LINK|ATOMIC.
+	 *	q0, q1 are configured as stated above.
+	 *	q2, q3 configured as SINGLE_LINK.
 	 */
 	ret = pipeline_event_rx_adapter_setup(opt, 1, p_conf);
+	if (ret)
+		return ret;
+	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
 	if (ret)
 		return ret;
 
@@ -445,12 +420,58 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 		}
 	}
 
+	/* Connect the tx_evqueue_id to the Tx adapter port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			ret = rte_event_eth_tx_adapter_event_port_get(prod,
+					&tx_evport_id);
+			if (ret) {
+				evt_err("Unable to get Tx adapter[%d]", prod);
+				return ret;
+			}
+
+			if (rte_event_port_link(opt->dev_id, tx_evport_id,
+						&tx_evqueue_id[prod],
+						NULL, 1) != 1) {
+				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+		}
+	}
+
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_eth_dev_start(prod);
+		if (ret) {
+			evt_err("Ethernet dev [%d] failed to start."
+					" Using synthetic producer", prod);
+			return ret;
+		}
+	}
+
 	ret = rte_event_dev_start(opt->dev_id);
 	if (ret) {
 		evt_err("failed to start eventdev %d", opt->dev_id);
 		return ret;
 	}
 
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_event_eth_rx_adapter_start(prod);
+		if (ret) {
+			evt_err("Rx adapter[%d] start failed", prod);
+			return ret;
+		}
+
+		ret = rte_event_eth_tx_adapter_start(prod);
+		if (ret) {
+			evt_err("Tx adapter[%d] start failed", prod);
+			return ret;
+		}
+	}
+
+	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
+			RTE_MAX_ETHPORTS);
+
 	return 0;
 }
 
diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
index cdf9010b4..398b0010e 100644
--- a/app/test-eventdev/test_pipeline_common.c
+++ b/app/test-eventdev/test_pipeline_common.c
@@ -5,58 +5,6 @@
 
 #include "test_pipeline_common.h"
 
-static int32_t
-pipeline_event_tx_burst_service_func(void *args)
-{
-
-	int i;
-	struct tx_service_data *tx = args;
-	const uint8_t dev = tx->dev_id;
-	const uint8_t port = tx->port_id;
-	struct rte_event ev[BURST_SIZE + 1];
-
-	uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
-
-	if (!nb_rx) {
-		for (i = 0; i < tx->nb_ethports; i++)
-			rte_eth_tx_buffer_flush(i, 0, tx->tx_buf[i]);
-		return 0;
-	}
-
-	for (i = 0; i < nb_rx; i++) {
-		struct rte_mbuf *m = ev[i].mbuf;
-		rte_eth_tx_buffer(m->port, 0, tx->tx_buf[m->port], m);
-	}
-	tx->processed_pkts += nb_rx;
-
-	return 0;
-}
-
-static int32_t
-pipeline_event_tx_service_func(void *args)
-{
-
-	int i;
-	struct tx_service_data *tx = args;
-	const uint8_t dev = tx->dev_id;
-	const uint8_t port = tx->port_id;
-	struct rte_event ev;
-
-	uint16_t nb_rx = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
-
-	if (!nb_rx) {
-		for (i = 0; i < tx->nb_ethports; i++)
-			rte_eth_tx_buffer_flush(i, 0, tx->tx_buf[i]);
-		return 0;
-	}
-
-	struct rte_mbuf *m = ev.mbuf;
-	rte_eth_tx_buffer(m->port, 0, tx->tx_buf[m->port], m);
-	tx->processed_pkts++;
-
-	return 0;
-}
-
 int
 pipeline_test_result(struct evt_test *test, struct evt_options *opt)
 {
@@ -97,11 +45,8 @@ processed_pkts(struct test_pipeline *t)
 	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;
+	for (i = 0; i < t->nb_workers; i++)
+		total += t->worker[i].processed_pkts;
 
 	return total;
 }
@@ -215,7 +160,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 {
 	uint16_t i;
 	uint8_t nb_queues = 1;
-	uint8_t mt_state = 0;
 	struct test_pipeline *t = evt_test_priv(test);
 	struct rte_eth_rxconf rx_conf;
 	struct rte_eth_conf port_conf = {
@@ -237,13 +181,17 @@ pipeline_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;
+
+		rte_event_eth_tx_adapter_caps_get(opt->dev_id, i, &caps);
+		if (!(caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT))
+			t->internal_port = 0;
 
 		rte_eth_dev_info_get(i, &dev_info);
-		mt_state = !(dev_info.tx_offload_capa &
-				DEV_TX_OFFLOAD_MT_LOCKFREE);
 		rx_conf = dev_info.default_rxconf;
 		rx_conf.offloads = port_conf.rxmode.offloads;
 
@@ -278,11 +226,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 			return -EINVAL;
 		}
 
-		t->mt_unsafe |= mt_state;
-		t->tx_service.tx_buf[i] =
-			rte_malloc(NULL, RTE_ETH_TX_BUFFER_SIZE(BURST_SIZE), 0);
-		if (t->tx_service.tx_buf[i] == NULL)
-			rte_panic("Unable to allocate Tx buffer memory.");
 		rte_eth_promiscuous_enable(i);
 	}
 
@@ -294,7 +237,6 @@ 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 i;
 	int ret;
 	uint8_t port;
 	struct test_pipeline *t = evt_test_priv(test);
@@ -315,23 +257,15 @@ pipeline_event_port_setup(struct evt_test *test, struct evt_options *opt,
 			return ret;
 		}
 
-		if (queue_arr == NULL) {
-			if (rte_event_port_link(opt->dev_id, port, NULL, NULL,
-						0) != nb_queues)
-				goto link_fail;
-		} else {
-			for (i = 0; i < nb_queues; i++) {
-				if (rte_event_port_link(opt->dev_id, port,
-						&queue_arr[i], NULL, 1) != 1)
-					goto link_fail;
-			}
-		}
+		if (rte_event_port_link(opt->dev_id, port, queue_arr, NULL,
+					nb_queues) != nb_queues)
+			goto link_fail;
 	}
 
 	return 0;
 
 link_fail:
-	evt_err("failed to link all queues to port %d", port);
+	evt_err("failed to link queues to port %d", port);
 	return -EINVAL;
 }
 
@@ -384,79 +318,64 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			}
 		}
 
-		ret = rte_eth_dev_start(prod);
-		if (ret) {
-			evt_err("Ethernet dev [%d] failed to start."
-					" Using synthetic producer", prod);
-			return ret;
-		}
-
-		ret = rte_event_eth_rx_adapter_start(prod);
-		if (ret) {
-			evt_err("Rx adapter[%d] start failed", prod);
-			return ret;
-		}
-		evt_info("Port[%d] using Rx adapter[%d] started", prod, prod);
+		evt_info("Port[%d] using Rx adapter[%d] configured", prod,
+				prod);
 	}
 
 	return ret;
 }
 
 int
-pipeline_event_tx_service_setup(struct evt_test *test, struct evt_options *opt,
-		uint8_t tx_queue_id, uint8_t tx_port_id,
-		const struct rte_event_port_conf p_conf)
+pipeline_event_tx_adapter_setup(struct evt_options *opt,
+		struct rte_event_port_conf port_conf)
 {
-	int ret;
-	struct rte_service_spec serv;
-	struct test_pipeline *t = evt_test_priv(test);
-	struct tx_service_data *tx = &t->tx_service;
+	int ret = 0;
+	uint16_t consm = 0;
 
-	ret = rte_event_port_setup(opt->dev_id, tx_port_id, &p_conf);
-	if (ret) {
-		evt_err("failed to setup port %d", tx_port_id);
-		return ret;
-	}
+	RTE_ETH_FOREACH_DEV(consm) {
+		uint32_t cap;
 
-	if (rte_event_port_link(opt->dev_id, tx_port_id, &tx_queue_id,
-				NULL, 1) != 1) {
-		evt_err("failed to link queues to port %d", tx_port_id);
-		return -EINVAL;
-	}
+		ret = rte_event_eth_tx_adapter_caps_get(opt->dev_id,
+				consm, &cap);
+		if (ret) {
+			evt_err("failed to get event tx adapter[%d] caps",
+					consm);
+			return ret;
+		}
 
-	tx->dev_id = opt->dev_id;
-	tx->queue_id = tx_queue_id;
-	tx->port_id = tx_port_id;
-	tx->nb_ethports = rte_eth_dev_count_avail();
-	tx->t = t;
-
-	/* Register Tx service */
-	memset(&serv, 0, sizeof(struct rte_service_spec));
-	snprintf(serv.name, sizeof(serv.name), "Tx_service");
-
-	if (evt_has_burst_mode(opt->dev_id))
-		serv.callback = pipeline_event_tx_burst_service_func;
-	else
-		serv.callback = pipeline_event_tx_service_func;
-
-	serv.callback_userdata = (void *)tx;
-	ret = rte_service_component_register(&serv, &tx->service_id);
-	if (ret) {
-		evt_err("failed to register Tx service");
-		return ret;
-	}
+		ret = rte_event_eth_tx_adapter_create(consm, opt->dev_id,
+				&port_conf);
+		if (ret) {
+			evt_err("failed to create tx adapter[%d]", consm);
+			return ret;
+		}
 
-	ret = evt_service_setup(tx->service_id);
-	if (ret) {
-		evt_err("Failed to setup service core for Tx service\n");
-		return ret;
-	}
+		ret = rte_event_eth_tx_adapter_queue_add(consm, consm, -1);
+		if (ret) {
+			evt_err("failed to add tx queues to adapter[%d]",
+					consm);
+			return ret;
+		}
 
-	rte_service_runstate_set(tx->service_id, 1);
+		if (!(cap & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) {
+			uint32_t service_id;
 
-	return 0;
-}
+			rte_event_eth_tx_adapter_service_id_get(consm,
+					&service_id);
+			ret = evt_service_setup(service_id);
+			if (ret) {
+				evt_err("Failed to setup service core"
+						" for Tx adapter\n");
+				return ret;
+			}
+		}
+
+		evt_info("Port[%d] using Tx adapter[%d] Configured", consm,
+				consm);
+	}
 
+	return ret;
+}
 
 void
 pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
@@ -464,16 +383,10 @@ pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
 	uint16_t i;
 	RTE_SET_USED(test);
 	RTE_SET_USED(opt);
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe) {
-		rte_service_component_runstate_set(t->tx_service.service_id, 0);
-		rte_service_runstate_set(t->tx_service.service_id, 0);
-		rte_service_component_unregister(t->tx_service.service_id);
-	}
 
 	RTE_ETH_FOREACH_DEV(i) {
 		rte_event_eth_rx_adapter_stop(i);
+		rte_event_eth_tx_adapter_stop(i);
 		rte_eth_dev_stop(i);
 	}
 }
@@ -483,7 +396,6 @@ pipeline_eventdev_destroy(struct evt_test *test, struct evt_options *opt)
 {
 	RTE_SET_USED(test);
 
-	rte_event_dev_stop(opt->dev_id);
 	rte_event_dev_close(opt->dev_id);
 }
 
diff --git a/app/test-eventdev/test_pipeline_common.h b/app/test-eventdev/test_pipeline_common.h
index 9cd6b905b..0440b9e29 100644
--- a/app/test-eventdev/test_pipeline_common.h
+++ b/app/test-eventdev/test_pipeline_common.h
@@ -14,6 +14,7 @@
 #include <rte_ethdev.h>
 #include <rte_eventdev.h>
 #include <rte_event_eth_rx_adapter.h>
+#include <rte_event_eth_tx_adapter.h>
 #include <rte_lcore.h>
 #include <rte_malloc.h>
 #include <rte_mempool.h>
@@ -35,30 +36,19 @@ struct worker_data {
 	struct test_pipeline *t;
 } __rte_cache_aligned;
 
-struct tx_service_data {
-	uint8_t dev_id;
-	uint8_t queue_id;
-	uint8_t port_id;
-	uint32_t service_id;
-	uint64_t processed_pkts;
-	uint16_t nb_ethports;
-	struct rte_eth_dev_tx_buffer *tx_buf[RTE_MAX_ETHPORTS];
-	struct test_pipeline *t;
-} __rte_cache_aligned;
-
 struct test_pipeline {
 	/* Don't change the offset of "done". Signal handler use this memory
 	 * to terminate all lcores work.
 	 */
 	int done;
 	uint8_t nb_workers;
-	uint8_t mt_unsafe;
+	uint8_t internal_port;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
 	enum evt_test_result result;
 	uint32_t nb_flows;
 	uint64_t outstand_pkts;
 	struct rte_mempool *pool;
 	struct worker_data worker[EVT_MAX_PORTS];
-	struct tx_service_data tx_service;
 	struct evt_options *opt;
 	uint8_t sched_type_list[EVT_MAX_STAGES] __rte_cache_aligned;
 } __rte_cache_aligned;
@@ -70,7 +60,7 @@ struct test_pipeline {
 	struct test_pipeline *t = w->t;   \
 	const uint8_t dev = w->dev_id;    \
 	const uint8_t port = w->port_id;  \
-	struct rte_event ev
+	struct rte_event ev __rte_cache_aligned
 
 #define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
 	int i;                                  \
@@ -78,7 +68,7 @@ struct test_pipeline {
 	struct test_pipeline *t = w->t;         \
 	const uint8_t dev = w->dev_id;          \
 	const uint8_t port = w->port_id;        \
-	struct rte_event ev[BURST_SIZE + 1]
+	struct rte_event ev[BURST_SIZE + 1] __rte_cache_aligned
 
 #define PIPELINE_WORKER_MULTI_STAGE_INIT                         \
 	struct worker_data *w  = arg;                            \
@@ -88,10 +78,11 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;                         \
 	const uint8_t last_queue = t->opt->nb_stages - 1;        \
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
-	struct rte_event ev
+	const uint8_t nb_stages = t->opt->nb_stages + 1;	 \
+	struct rte_event ev __rte_cache_aligned
 
 #define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT                   \
-	int i;                                  \
+	int i;                                                   \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
 	uint8_t cq_id;                                           \
@@ -99,7 +90,8 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;                         \
 	const uint8_t last_queue = t->opt->nb_stages - 1;        \
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
-	struct rte_event ev[BURST_SIZE + 1]
+	const uint8_t nb_stages = t->opt->nb_stages + 1;	 \
+	struct rte_event ev[BURST_SIZE + 1] __rte_cache_aligned
 
 static __rte_always_inline void
 pipeline_fwd_event(struct rte_event *ev, uint8_t sched)
@@ -109,6 +101,28 @@ pipeline_fwd_event(struct rte_event *ev, uint8_t sched)
 	ev->sched_type = sched;
 }
 
+static __rte_always_inline void
+pipeline_event_tx(const uint8_t dev, const uint8_t port,
+		struct rte_event * const ev)
+{
+	rte_event_eth_tx_adapter_txq_set(ev->mbuf, 0);
+	while (!rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1))
+		rte_pause();
+}
+
+static __rte_always_inline void
+pipeline_event_tx_burst(const uint8_t dev, const uint8_t port,
+		struct rte_event *ev, const uint16_t nb_rx)
+{
+	uint16_t enq;
+
+	enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, nb_rx);
+	while (enq < nb_rx) {
+		enq += rte_event_eth_tx_adapter_enqueue(dev, port,
+				ev + enq, nb_rx - enq);
+	}
+}
+
 static __rte_always_inline void
 pipeline_event_enqueue(const uint8_t dev, const uint8_t port,
 		struct rte_event *ev)
@@ -130,13 +144,6 @@ pipeline_event_enqueue_burst(const uint8_t dev, const uint8_t port,
 	}
 }
 
-static __rte_always_inline void
-pipeline_tx_pkt(struct rte_mbuf *mbuf)
-{
-	while (rte_eth_tx_burst(mbuf->port, 0, &mbuf, 1) != 1)
-		rte_pause();
-}
-
 static inline int
 pipeline_nb_event_ports(struct evt_options *opt)
 {
@@ -149,9 +156,8 @@ int pipeline_test_setup(struct evt_test *test, struct evt_options *opt);
 int pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt);
 int pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 		struct rte_event_port_conf prod_conf);
-int pipeline_event_tx_service_setup(struct evt_test *test,
-		struct evt_options *opt, uint8_t tx_queue_id,
-		uint8_t tx_port_id, const struct rte_event_port_conf p_conf);
+int pipeline_event_tx_adapter_setup(struct evt_options *opt,
+		struct rte_event_port_conf prod_conf);
 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,
diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c
index 2e0d93d99..1156c2555 100644
--- a/app/test-eventdev/test_pipeline_queue.c
+++ b/app/test-eventdev/test_pipeline_queue.c
@@ -15,7 +15,7 @@ pipeline_queue_nb_event_queues(struct evt_options *opt)
 	return (eth_count * opt->nb_stages) + eth_count;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
@@ -29,7 +29,7 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 		}
 
 		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-			pipeline_tx_pkt(ev.mbuf);
+			pipeline_event_tx(dev, port, &ev);
 			w->processed_pkts++;
 		} else {
 			ev.queue_id++;
@@ -41,11 +41,11 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -55,7 +55,8 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 			continue;
 		}
 
-		ev.queue_id = tx_queue;
+		ev.queue_id = tx_queue[ev.mbuf->port];
+		rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
 		w->processed_pkts++;
@@ -64,7 +65,7 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
@@ -81,8 +82,7 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
 			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev[i].mbuf);
+				pipeline_event_tx(dev, port, &ev[i]);
 				ev[i].op = RTE_EVENT_OP_RELEASE;
 				w->processed_pkts++;
 			} else {
@@ -98,11 +98,11 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -115,23 +115,24 @@ pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			ev[i].queue_id = tx_queue;
+			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
-			w->processed_pkts++;
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -143,31 +144,27 @@ pipeline_queue_worker_multi_stage_tx(void *arg)
 
 		cq_id = ev.queue_id % nb_stages;
 
-		if (cq_id >= last_queue) {
-			if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev.mbuf);
-				w->processed_pkts++;
-				continue;
-			}
-			ev.queue_id += (cq_id == last_queue) ? 1 : 0;
-			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		} else {
-			ev.queue_id++;
-			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
+		if (ev.queue_id == tx_queue[ev.mbuf->port]) {
+			pipeline_event_tx(dev, port, &ev);
+			w->processed_pkts++;
+			continue;
 		}
 
+		ev.queue_id++;
+		pipeline_fwd_event(&ev, cq_id != last_queue ?
+				sched_type_list[cq_id] :
+				RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -180,7 +177,8 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 		cq_id = ev.queue_id % nb_stages;
 
 		if (cq_id == last_queue) {
-			ev.queue_id = tx_queue;
+			ev.queue_id = tx_queue[ev.mbuf->port];
+			rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 			w->processed_pkts++;
 		} else {
@@ -190,14 +188,15 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -212,37 +211,30 @@ pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 			rte_prefetch0(ev[i + 1].mbuf);
 			cq_id = ev[i].queue_id % nb_stages;
 
-			if (cq_id >= last_queue) {
-				if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-					pipeline_tx_pkt(ev[i].mbuf);
-					ev[i].op = RTE_EVENT_OP_RELEASE;
-					w->processed_pkts++;
-					continue;
-				}
-
-				ev[i].queue_id += (cq_id == last_queue) ? 1 : 0;
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
-			} else {
-				ev[i].queue_id++;
-				pipeline_fwd_event(&ev[i],
-						sched_type_list[cq_id]);
+			if (ev[i].queue_id == tx_queue[ev[i].mbuf->port]) {
+				pipeline_event_tx(dev, port, &ev[i]);
+				ev[i].op = RTE_EVENT_OP_RELEASE;
+				w->processed_pkts++;
+				continue;
 			}
 
+			ev[i].queue_id++;
+			pipeline_fwd_event(&ev[i], cq_id != last_queue ?
+					sched_type_list[cq_id] :
+					RTE_SCHED_TYPE_ATOMIC);
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -258,7 +250,8 @@ pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 			cq_id = ev[i].queue_id % nb_stages;
 
 			if (cq_id == last_queue) {
-				ev[i].queue_id = tx_queue;
+				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
+				rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 				pipeline_fwd_event(&ev[i],
 						RTE_SCHED_TYPE_ATOMIC);
 				w->processed_pkts++;
@@ -271,6 +264,7 @@ pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
@@ -280,28 +274,28 @@ worker_wrapper(void *arg)
 	struct worker_data *w  = arg;
 	struct evt_options *opt = w->t->opt;
 	const bool burst = evt_has_burst_mode(w->dev_id);
-	const bool mt_safe = !w->t->mt_unsafe;
+	const bool internal_port = w->t->internal_port;
 	const uint8_t nb_stages = opt->nb_stages;
 	RTE_SET_USED(opt);
 
 	if (nb_stages == 1) {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_queue_worker_single_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_queue_worker_single_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_queue_worker_single_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_queue_worker_single_stage_burst_fwd(
 					arg);
 	} else {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_queue_worker_multi_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_queue_worker_multi_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_queue_worker_multi_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_queue_worker_multi_stage_burst_fwd(arg);
 
 	}
@@ -311,10 +305,6 @@ worker_wrapper(void *arg)
 static int
 pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt)
 {
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe)
-		rte_service_component_runstate_set(t->tx_service.service_id, 1);
 	return pipeline_launch_lcores(test, opt, worker_wrapper);
 }
 
@@ -326,25 +316,21 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	int nb_queues;
 	int nb_stages = opt->nb_stages;
 	uint8_t queue;
-	struct rte_event_dev_info info;
-	struct test_pipeline *t = evt_test_priv(test);
-	uint8_t tx_evqueue_id = 0;
+	uint8_t tx_evport_id = 0;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};
 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
 	uint8_t nb_worker_queues = 0;
+	uint16_t prod = 0;
+	struct rte_event_dev_info info;
+	struct test_pipeline *t = evt_test_priv(test);
 
 	nb_ports = evt_nr_active_lcores(opt->wlcores);
 	nb_queues = rte_eth_dev_count_avail() * (nb_stages);
 
-	/* Extra port for Tx service. */
-	if (t->mt_unsafe) {
-		tx_evqueue_id = nb_queues;
-		nb_ports++;
-		nb_queues++;
-	} else
-		nb_queues += rte_eth_dev_count_avail();
+	/* One queue for Tx adapter per port */
+	nb_queues += rte_eth_dev_count_avail();
 
 	rte_event_dev_info_get(opt->dev_id, &info);
-
 	const struct rte_event_dev_config config = {
 			.nb_event_queues = nb_queues,
 			.nb_event_ports = nb_ports,
@@ -370,24 +356,19 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	for (queue = 0; queue < nb_queues; queue++) {
 		uint8_t slot;
 
-		if (!t->mt_unsafe) {
-			slot = queue % (nb_stages + 1);
-			q_conf.schedule_type = slot == nb_stages ?
-				RTE_SCHED_TYPE_ATOMIC :
-				opt->sched_type_list[slot];
-		} else {
-			slot = queue % nb_stages;
-
-			if (queue == tx_evqueue_id) {
-				q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
+		q_conf.event_queue_cfg = 0;
+		slot = queue % (nb_stages + 1);
+		if (slot == nb_stages) {
+			q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
+			if (!t->internal_port) {
 				q_conf.event_queue_cfg =
 					RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
-			} else {
-				q_conf.schedule_type =
-					opt->sched_type_list[slot];
-				queue_arr[nb_worker_queues] = queue;
-				nb_worker_queues++;
 			}
+			tx_evqueue_id[prod++] = queue;
+		} else {
+			q_conf.schedule_type = opt->sched_type_list[slot];
+			queue_arr[nb_worker_queues] = queue;
+			nb_worker_queues++;
 		}
 
 		ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf);
@@ -407,19 +388,11 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 			.new_event_threshold = info.max_num_events,
 	};
 
-	/*
-	 * If tx is multi thread safe then allow workers to do Tx else use Tx
-	 * service to Tx packets.
-	 */
-	if (t->mt_unsafe) {
+	if (!t->internal_port) {
 		ret = pipeline_event_port_setup(test, opt, queue_arr,
 				nb_worker_queues, p_conf);
 		if (ret)
 			return ret;
-
-		ret = pipeline_event_tx_service_setup(test, opt, tx_evqueue_id,
-				nb_ports - 1, p_conf);
-
 	} else
 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
 				p_conf);
@@ -431,7 +404,6 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *
 	 * eth_dev_count = 2, nb_stages = 2.
 	 *
-	 * Multi thread safe :
 	 *	queues = 6
 	 *	stride = 3
 	 *
@@ -439,21 +411,14 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *	eth0 -> q0 -> q1 -> (q2->tx)
 	 *	eth1 -> q3 -> q4 -> (q5->tx)
 	 *
-	 *	q2, q5 configured as ATOMIC
-	 *
-	 * Multi thread unsafe :
-	 *	queues = 5
-	 *	stride = 2
+	 *	q2, q5 configured as ATOMIC | SINGLE_LINK
 	 *
-	 *	event queue pipelines:
-	 *	eth0 -> q0 -> q1
-	 *			} (q4->tx) Tx service
-	 *	eth1 -> q2 -> q3
-	 *
-	 *	q4 configured as SINGLE_LINK|ATOMIC
 	 */
-	ret = pipeline_event_rx_adapter_setup(opt,
-			t->mt_unsafe ? nb_stages : nb_stages + 1, p_conf);
+	ret = pipeline_event_rx_adapter_setup(opt, nb_stages + 1, p_conf);
+	if (ret)
+		return ret;
+
+	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
 	if (ret)
 		return ret;
 
@@ -467,12 +432,60 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 		}
 	}
 
+	/* Connect the tx_evqueue_id to the Tx adapter port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			ret = rte_event_eth_tx_adapter_event_port_get(prod,
+					&tx_evport_id);
+			if (ret) {
+				evt_err("Unable to get Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+
+			if (rte_event_port_link(opt->dev_id, tx_evport_id,
+						&tx_evqueue_id[prod],
+						NULL, 1) != 1) {
+				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+		}
+	}
+
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_eth_dev_start(prod);
+		if (ret) {
+			evt_err("Ethernet dev [%d] failed to start."
+					" Using synthetic producer", prod);
+			return ret;
+		}
+
+	}
+
 	ret = rte_event_dev_start(opt->dev_id);
 	if (ret) {
 		evt_err("failed to start eventdev %d", opt->dev_id);
 		return ret;
 	}
 
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_event_eth_rx_adapter_start(prod);
+		if (ret) {
+			evt_err("Rx adapter[%d] start failed", prod);
+			return ret;
+		}
+
+		ret = rte_event_eth_tx_adapter_start(prod);
+		if (ret) {
+			evt_err("Tx adapter[%d] start failed", prod);
+			return ret;
+		}
+	}
+
+	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
+			RTE_MAX_ETHPORTS);
+
 	return 0;
 }
 
-- 
2.19.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev]  [PATCH v3 4/4] doc: update eventdev application guide
  2018-09-19 22:22 ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
@ 2018-09-19 22:22   ` Pavan Nikhilesh
  2018-09-23 10:46     ` Jerin Jacob
  2018-09-23 10:28   ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Jerin Jacob
  3 siblings, 1 reply; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-19 22:22 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh, john.mcnamara

Update eventdev application guide to reflect Tx adapter related changes.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
---
cc: <john.mcnamara@intel.com>

 .../eventdev_pipeline_atq_test_generic.svg    | 848 +++++++++++-------
 ...ntdev_pipeline_atq_test_internal_port.svg} |  26 +-
 .../eventdev_pipeline_queue_test_generic.svg  | 570 +++++++-----
 ...dev_pipeline_queue_test_internal_port.svg} |  22 +-
 doc/guides/tools/testeventdev.rst             |  42 +-
 5 files changed, 930 insertions(+), 578 deletions(-)
 rename doc/guides/tools/img/{eventdev_pipeline_atq_test_lockfree.svg => eventdev_pipeline_atq_test_internal_port.svg} (99%)
 rename doc/guides/tools/img/{eventdev_pipeline_queue_test_lockfree.svg => eventdev_pipeline_queue_test_internal_port.svg} (99%)

diff --git a/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg b/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
index e33367989..707b9b56b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
@@ -20,7 +20,7 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
    sodipodi:docname="eventdev_pipeline_atq_test_generic.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
@@ -42,22 +42,6 @@
          d="M 5.77,0 -2.88,5 V -5 Z"
          id="path39725" />
     </marker>
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <marker
        inkscape:isstock="true"
        style="overflow:visible"
@@ -1430,9 +1414,9 @@
        x2="677.85718"
        y2="244.50504"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.78263355,0,0,0.98605918,90.06838,5.0013749)" />
+       gradientTransform="matrix(0.84881476,0,0,0.98593266,86.966576,5.0323108)" />
     <linearGradient
-       gradientTransform="matrix(0.78674479,0,0,1.0000825,87.83543,1.2279738)"
+       gradientTransform="matrix(0.85327366,0,0,0.99995418,84.544803,1.2593939)"
        inkscape:collect="always"
        xlink:href="#linearGradient6391"
        id="linearGradient2965"
@@ -1865,36 +1849,6 @@
        effect="spiro"
        id="path-effect14461-7-5-6"
        is_visible="true" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(454.68566,-41.755492)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5-6"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(373.71198,205.50594)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5-6-4"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(454.58517,69.679557)" />
     <inkscape:path-effect
        effect="bspline"
        id="path-effect2658-8"
@@ -2048,16 +2002,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3438"
-       id="linearGradient16362"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(2.283166,-2.283166)"
-       x1="534.06958"
-       y1="163.49922"
-       x2="580.73291"
-       y2="163.49922" />
     <marker
        inkscape:stockid="Arrow1Mend"
        orient="auto"
@@ -2293,25 +2237,80 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker32613-8-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="TriangleOutM">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(0.4)"
+         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         id="path32611-8-0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-4-4"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1"
+       id="TriangleOutM-5-2-3"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2"
+       id="path-effect5228-5-1-61"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2324,20 +2323,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-6"
+       id="TriangleOutM-5-2-3-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-8"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
+       id="path-effect5228-5-1-61-1"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2350,20 +2349,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-6-6"
+       id="TriangleOutM-5-2-3-9"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-8-6"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20-4"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
+       id="path-effect5228-5-1-61-9"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2371,24 +2370,45 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(454.68566,-41.755492)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.08991,-43.80364)" />
     <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker32613-8-5"
-       refX="0"
-       refY="0"
+       inkscape:stockid="TriangleOutM"
        orient="auto"
-       inkscape:stockid="TriangleOutM">
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         transform="scale(0.4)"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         id="path35933-49-8-6-2-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         id="path32611-8-0" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-4-4"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2396,35 +2416,25 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient1920-1"
-       x1="475.00314"
-       y1="156.97769"
-       x2="515.13684"
-       y2="156.97769"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6515192,0,0,1.0041442,189.20967,67.917365)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3"
+       id="marker35935-1-6-5-1-0-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20"
+         id="path35933-49-8-6-2-3-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2432,25 +2442,45 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5-6"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(373.71198,205.50594)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5-6-4"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(454.58517,69.679557)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3-0"
+       id="marker35935-1-6-5-1-0-06"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20-6"
+         id="path35933-49-8-6-2-3-1"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61-1"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2458,25 +2488,55 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.25651,68.385308)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.88878,12.631328)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient1760-3"
+       x1="405.34961"
+       y1="243.36557"
+       x2="651.55652"
+       y2="243.36557"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65213006,0,0,0.72134316,230.98899,64.590305)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3-9"
+       id="marker35935-1-6-5"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20-4"
+         id="path35933-49-8-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61-9"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2484,25 +2544,77 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-9"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-3"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="1.53467"
-     inkscape:cx="477.6217"
-     inkscape:cy="141.14731"
+     inkscape:zoom="2.200307"
+     inkscape:cx="336.61535"
+     inkscape:cy="145.77389"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -2530,12 +2642,12 @@
      transform="translate(-46.542857,-100.33361)"
      style="display:inline;opacity:1">
     <rect
-       style="fill:url(#linearGradient4519);fill-opacity:1;stroke:url(#linearGradient2965);stroke-width:0.87847757;stroke-opacity:1"
+       style="fill:url(#linearGradient4519);fill-opacity:1;stroke:url(#linearGradient2965);stroke-width:0.91480815;stroke-opacity:1"
        id="rect3697"
-       width="493.61813"
-       height="283.13986"
-       x="126.96397"
-       y="104.52792"
+       width="535.35956"
+       height="283.10355"
+       x="126.98213"
+       y="104.54609"
        rx="0"
        ry="0" />
     <text
@@ -2706,7 +2818,7 @@
          x="199.44385"
          y="188.49918"
          id="tspan5223-0-9"
-         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+1</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4"
@@ -2777,7 +2889,7 @@
          x="199.35846"
          y="244.55573"
          id="tspan5223-0-9-0"
-         style="font-size:10px;line-height:1.25">port n+3</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-2);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4-6"
@@ -2882,7 +2994,7 @@
          x="242.32845"
          y="123.36828"
          id="tspan5223-10"
-         style="font-size:10px;line-height:1.25">total queues = number of ethernet dev + 1</tspan></text>
+         style="font-size:10px;line-height:1.25">total queues = 2 * number of ethernet dev </tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
@@ -2957,9 +3069,109 @@
          x="285.26294"
          y="240.01315"
          style="stroke-width:0.68894428" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="259.86884"
+       y="164.78368"
+       id="text5219-2-3-7-2-1"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="259.86884"
+         y="164.78368"
+         id="tspan5223-0-6-5-9-5"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="259.86884"
+         y="174.78368"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9">Rx adptr 0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="260.25055"
+       y="217.84813"
+       id="text5219-2-3-7-2-1-4"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="217.84813"
+         id="tspan5223-0-6-5-9-5-4"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="227.84813"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9-4">Rx adptr 1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="260.25055"
+       y="271.71359"
+       id="text5219-2-3-7-2-1-47"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="271.71359"
+         id="tspan5223-0-6-5-9-5-6"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="281.71359"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9-3">Rx adptr q</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="595.27808"
+       y="136.64076"
+       id="text5219-2-4-3-3-4-54-8-8"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="595.27808"
+         y="139.22064"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-7" /></text>
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3)"
+       d="m 356.74765,186.83153 c 15.88009,-0.11696 31.75919,-0.23391 47.6373,-0.35085"
+       id="path5226-6-2-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61"
+       inkscape:original-d="m 356.74765,186.83153 c 15.88008,-0.11795 31.75918,-0.2349 47.6373,-0.35085"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-0)"
+       d="m 357.05625,242.97941 c 15.74231,0.0176 31.48469,0.0352 47.22712,0.0528"
+       id="path5226-6-2-5-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61-1"
+       inkscape:original-d="m 357.05625,242.97941 c 15.74231,0.0166 31.48469,0.0342 47.22712,0.0528"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89337438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.57349763, 0.89337441;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-9)"
+       d="m 356.67155,297.12049 c 15.97521,0.0733 31.94945,0.14663 47.92273,0.21994"
+       id="path5226-6-2-5-0"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61-9"
+       inkscape:original-d="m 356.67155,297.12049 c 15.97521,0.0723 31.94945,0.14563 47.92273,0.21994"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="606.06958"
+       y="346.46628"
+       id="text5219-2-4-3-3-4-54-8-7"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="606.06958"
+         y="346.46628"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
     <g
+       style="display:inline;opacity:1"
        id="g20550"
-       transform="translate(25.709043,-190.70754)">
+       transform="translate(69.258261,-194.86398)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -2988,8 +3200,9 @@
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
     <g
+       style="display:inline;opacity:1"
        id="g13899"
-       transform="translate(-54.904385,-3.0966742)">
+       transform="translate(-12.211349,-3.253112)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3018,8 +3231,9 @@
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
     <g
+       style="display:inline;opacity:1"
        id="g13911"
-       transform="translate(-54.904385,-1.0966741)">
+       transform="translate(-10.498979,-2.682322)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3047,217 +3261,205 @@
            x="621.71729"
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="259.86884"
-       y="164.78368"
-       id="text5219-2-3-7-2-1"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="259.86884"
-         y="164.78368"
-         id="tspan5223-0-6-5-9-5"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="259.86884"
-         y="174.78368"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9">Rx adptr 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="260.25055"
-       y="217.84813"
-       id="text5219-2-3-7-2-1-4"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="217.84813"
-         id="tspan5223-0-6-5-9-5-4"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="227.84813"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9-4">Rx adptr 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="260.25055"
-       y="271.71359"
-       id="text5219-2-3-7-2-1-47"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="271.71359"
-         id="tspan5223-0-6-5-9-5-6"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="281.71359"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9-3">Rx adptr q</tspan></text>
-    <g
-       id="g16360"
-       transform="matrix(1.0874414,0,0,0.99912695,-98.49816,-6.4077434)">
-      <ellipse
-         ry="24.258638"
-         rx="22.831659"
-         cy="161.21605"
-         cx="559.68445"
-         id="path8843"
-         style="fill:#ffffff;fill-opacity:0.98039216;stroke:url(#linearGradient16362);stroke-opacity:1" />
-      <text
-         transform="scale(0.92048084,1.0863887)"
-         id="text5219-2-4-3-3-4-5"
-         y="146.21904"
-         x="588.44147"
-         style="font-style:normal;font-weight:normal;font-size:11.04576969px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92048085"
-         xml:space="preserve"><tspan
-           id="tspan1265-5"
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="146.21904"
-           x="588.44147"
-           sodipodi:role="line">Tx Service</tspan><tspan
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="152.00201"
-           x="588.44147"
-           sodipodi:role="line"
-           id="tspan39139" /><tspan
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="156.19092"
-           x="588.44147"
-           sodipodi:role="line"
-           id="tspan39141">port n + 1</tspan></text>
-    </g>
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.22799993, 1.61399996;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker32613)"
-       d="m 511.70299,212.50867 c -0.1614,-10.49392 -0.32276,-20.98539 -0.48409,-31.47439"
-       id="path5226-6-2-1-2-4-5-1"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6"
-       inkscape:original-d="m 511.70299,212.50867 c -0.16039,-10.49394 -0.32175,-20.98541 -0.48409,-31.47439"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935)"
-       d="m 523.50111,175.62989 c 10.13298,2.21215 20.26379,4.42384 30.39241,6.63504"
-       id="path5226-6-2-1-2-4-5-1-5"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1"
-       inkscape:original-d="m 523.50111,175.62989 c 10.13323,2.21099 20.26404,4.42267 30.39241,6.63504"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-5)"
-       d="m 523.50111,175.62989 c 9.91161,22.53065 19.82206,45.05865 29.73129,67.58389"
-       id="path5226-6-2-1-2-4-5-1-5-6"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-7"
-       inkscape:original-d="m 523.50111,175.62989 c 9.91282,22.53012 19.82327,45.05812 29.73129,67.58389"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-5-5)"
-       d="m 523.50111,175.62989 c 10.16587,40.76181 20.3305,81.51868 30.49385,122.27042"
-       id="path5226-6-2-1-2-4-5-1-5-6-3"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-7-9"
-       inkscape:original-d="m 523.50111,175.62989 c 10.16704,40.76152 20.33167,81.51839 30.49385,122.27042"
-       sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.88;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.52, 0.88;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1)"
-       d="m 457.99431,185.46823 c 13.07561,8.94945 26.1492,17.89751 39.22072,26.84415"
-       id="path5226-6-2-1-2-4-5-1-5-0"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.75503534;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.02014133, 0.75503534;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5)"
+       d="m 459.25963,298.68538 c 12.4298,0.0326 24.85706,0.0653 37.28169,0.0979"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2"
-       inkscape:original-d="m 457.99431,185.46823 c 13.0764,8.9483 26.14999,17.89636 39.22072,26.84415"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
+       inkscape:original-d="m 459.25963,298.68538 c 12.4298,0.0316 24.85706,0.0643 37.28169,0.0979"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6)"
-       d="m 459.47717,245.71809 c 12.28232,-4.96638 24.56173,-9.93159 36.83817,-14.89559"
-       id="path5226-6-2-1-2-4-5-1-5-0-2"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77332252;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.09329006, 0.77332252;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1)"
+       d="m 458.61908,243.27181 c 12.91755,-0.0156 25.83246,-0.0312 38.74462,-0.0468"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9"
-       inkscape:original-d="m 459.47717,245.71809 c 12.28211,-4.96689 24.56152,-9.9321 36.83817,-14.89559"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       inkscape:original-d="m 458.61908,243.27181 c 12.91755,-0.0166 25.83246,-0.0322 38.74462,-0.0468"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-6)"
-       d="m 459.54824,301.10401 c 12.64219,-20.37548 25.28189,-40.74696 37.91905,-61.11434"
-       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77624762;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10499055, 0.77624764;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-9)"
+       d="m 457.5506,186.45733 c 12.95011,-0.0208 25.89755,-0.0415 38.84226,-0.0623"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-06"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
-       inkscape:original-d="M 459.54824,301.10401 C 472.1907,280.7287 484.8304,260.35722 497.46729,239.98967"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       inkscape:original-d="m 457.5506,186.45733 c 12.95011,-0.0218 25.89755,-0.0426 38.84226,-0.0623"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79"
+       width="72.081367"
+       height="32.405426"
+       x="499.14511"
+       y="170.31314"
+       rx="16.175425"
+       ry="16.202713" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="595.27808"
-       y="136.64076"
-       id="text5219-2-4-3-3-4-54-8-8"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="502.77109"
+       y="189.40137"
+       id="text5219-2-6-2"><tspan
          sodipodi:role="line"
-         x="595.27808"
-         y="139.22064"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-7" /></text>
+         x="502.77109"
+         y="189.40137"
+         id="tspan5223-0-9-02"
+         style="font-size:10px;line-height:1.25">port n+m+1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="514.66077"
+       y="225.14934"
+       id="text5219-2-3-7-2-1-8-3"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="514.66077"
+         y="225.14934"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6">Single link</tspan></text>
     <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-1);stroke-width:0.86395979;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3736-8-4-9"
-       width="25.451954"
-       height="24.448395"
-       x="499.03128"
-       y="213.32141" />
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1"
+       width="72.081367"
+       height="32.405426"
+       x="499.944"
+       y="226.74811"
+       rx="16.175425"
+       ry="16.202713" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="548.03668"
-       y="204.31348"
-       id="text5219-2-4-3-3-4-54-8"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="504.46329"
+       y="246.05832"
+       id="text5219-2-6-1-7"><tspan
          sodipodi:role="line"
-         x="548.03668"
-         y="204.31348"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6">Single </tspan><tspan
+         x="504.46329"
+         y="246.05832"
+         id="tspan5223-0-9-0-5"
+         style="font-size:10px;line-height:1.25">port n+m+2</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1-7"
+       width="72.081367"
+       height="32.405426"
+       x="499.31168"
+       y="282.50211"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="512.51819"
+       y="301.5791"
+       id="text5219-2-6-1-6-2"><tspan
          sodipodi:role="line"
-         x="548.03668"
-         y="213.27945"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan57836">Link Q</tspan></text>
+         x="512.51819"
+         y="301.5791"
+         id="tspan5223-0-9-0-4-2"
+         style="font-size:10px;line-height:1.25">port n+o</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3)"
-       d="m 356.74765,186.83153 c 15.88009,-0.11696 31.75919,-0.23391 47.6373,-0.35085"
-       id="path5226-6-2-5"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0)"
+       d="m 571.86582,186.42744 c 7.95108,0.0405 15.90052,0.0811 23.84823,0.12159"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61"
-       inkscape:original-d="m 356.74765,186.83153 c 15.88008,-0.11795 31.75918,-0.2349 47.6373,-0.35085"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       inkscape:original-d="m 571.86582,186.42744 c 7.95109,0.0395 15.90052,0.0801 23.84823,0.12159"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-0)"
-       d="m 357.05625,242.97941 c 15.74231,0.0176 31.48469,0.0352 47.22712,0.0528"
-       id="path5226-6-2-5-5"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-0)"
+       d="m 572.74002,242.8173 c 7.86699,0.091 15.73233,0.18199 23.59597,0.27295"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-2"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61-1"
-       inkscape:original-d="m 357.05625,242.97941 c 15.74231,0.0166 31.48469,0.0342 47.22712,0.0528"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       inkscape:original-d="m 572.74002,242.8173 c 7.867,0.09 15.73234,0.18097 23.59597,0.27295"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89337438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.57349763, 0.89337441;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-9)"
-       d="m 356.67155,297.12049 c 15.97521,0.0733 31.94945,0.14663 47.92273,0.21994"
-       id="path5226-6-2-5-0"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-06)"
+       d="m 571.86429,299.00558 c 8.49934,0.0508 16.99697,0.10162 25.49284,0.15242"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-5"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61-9"
-       inkscape:original-d="m 356.67155,297.12049 c 15.97521,0.0723 31.94945,0.14563 47.92273,0.21994"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
+       inkscape:original-d="m 571.86429,299.00558 c 8.49935,0.0498 16.99698,0.10062 25.49284,0.15242"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760-3);stroke-width:0.67135191;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2896-6-7"
+       width="159.92059"
+       height="161.38417"
+       x="495.64883"
+       y="159.4483"
+       ry="4.080533"
+       rx="5.9213624"
+       inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
+       inkscape:export-xdpi="112"
+       inkscape:export-ydpi="112" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="606.06958"
-       y="346.46628"
-       id="text5219-2-4-3-3-4-54-8-7"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="515.76257"
+       y="175.4832"
+       id="text5219-2-3-7-2-1-8-3-5"
+       transform="scale(0.89243778,1.1205263)"><tspan
          sodipodi:role="line"
-         x="606.06958"
-         y="346.46628"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
+         x="515.76257"
+         y="175.4832"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-3">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="515.76501"
+       y="274.05133"
+       id="text5219-2-3-7-2-1-8-3-56"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="515.76501"
+         y="274.05133"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-2">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="546.92126"
+       y="155.57758"
+       id="text5219-2-4-2"><tspan
+         sodipodi:role="line"
+         x="546.92126"
+         y="155.57758"
+         id="tspan5223-0-7-70"
+         style="font-size:10px;line-height:1.25">Tx adapter</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="468.36612"
+       y="180.9222"
+       id="text5219-1-9-4-9-3"><tspan
+         sodipodi:role="line"
+         x="468.36612"
+         y="180.9222"
+         id="tspan5223-2-3-5-0-6"
+         style="font-size:10px;line-height:1.25">q3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="467.61584"
+       y="239.3683"
+       id="text5219-1-9-4-9-3-0"><tspan
+         sodipodi:role="line"
+         x="467.61584"
+         y="239.3683"
+         id="tspan5223-2-3-5-0-6-6"
+         style="font-size:10px;line-height:1.25">q4</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="468.70688"
+       y="294.45236"
+       id="text5219-1-9-4-9-3-2"><tspan
+         sodipodi:role="line"
+         x="468.70688"
+         y="294.45236"
+         id="tspan5223-2-3-5-0-6-61"
+         style="font-size:10px;line-height:1.25">q5</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg b/doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
similarity index 99%
rename from doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg
rename to doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
index d7f10de3e..f4393327b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
@@ -20,8 +20,8 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="eventdev_pipeline_atq_test_lockfree.svg"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
+   sodipodi:docname="eventdev_pipeline_atq_test_internal_port.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
@@ -2612,17 +2612,17 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="1.7519532"
-     inkscape:cx="479.73438"
-     inkscape:cy="163.58755"
+     inkscape:zoom="2.0977641"
+     inkscape:cx="432.03729"
+     inkscape:cy="135.16016"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="0"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -3331,14 +3331,14 @@
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="602.09888"
+       x="604.28497"
        y="347.66293"
        id="text5219-2-4-3-3-4-54"
        transform="scale(0.91487885,1.0930409)"><tspan
          sodipodi:role="line"
-         x="602.09888"
+         x="604.28497"
          y="347.66293"
          style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4">(Tx Lock free)</tspan></text>
+         id="tspan1265-4">(Internal port)</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg b/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
index 732d48867..9fe743f3b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
@@ -20,13 +20,21 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
    sodipodi:docname="eventdev_pipeline_queue_test_generic.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
   <defs
      id="defs3870">
+    <linearGradient
+       id="linearGradient6820"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#008080;stop-opacity:1;"
+         offset="0"
+         id="stop6818" />
+    </linearGradient>
     <linearGradient
        id="linearGradient6916"
        osb:paint="solid">
@@ -1312,7 +1320,7 @@
        x2="651.55652"
        y2="243.36557"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.76448972,0,0,0.86504892,-92.637138,19.716473)" />
+       gradientTransform="matrix(0.76448972,0,0,0.78486608,-92.637138,48.19976)" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#linearGradient3808"
@@ -2175,22 +2183,6 @@
        y2="232.36095"
        gradientUnits="userSpaceOnUse"
        gradientTransform="translate(17.692568,-46.20799)" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2"
@@ -2201,22 +2193,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49-8"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
@@ -2227,22 +2203,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1-6-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49-8-6"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14e4;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
@@ -2403,16 +2363,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3438"
-       id="linearGradient16362"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(2.283166,-2.283166)"
-       x1="534.06958"
-       y1="163.49922"
-       x2="580.73291"
-       y2="163.49922" />
     <marker
        inkscape:isstock="true"
        style="overflow:visible"
@@ -2488,16 +2438,6 @@
        effect="spiro"
        id="path-effect14461-7-5-1"
        is_visible="true" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient1924-3"
-       x1="597.00317"
-       y1="156.97769"
-       x2="637.13684"
-       y2="156.97769"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.78531244,0,0,1,50.143534,82.69878)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
@@ -2576,25 +2516,75 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-5"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-2"
+       id="marker35935-1-6-5"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-6"
+         id="path35933-49-8-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-6"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2607,20 +2597,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9"
+       id="marker35935-1-6-5-1"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5"
+         id="path35933-49-8-6-2"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2633,20 +2623,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9-7"
+       id="marker35935-1-6-5-9"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5-1"
+         id="path35933-49-8-6-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2654,25 +2644,107 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,300.23326,-43.855196)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,301.03213,12.579775)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,300.39986,68.333755)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9-72"
+       id="marker35935-1-6-5-1-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5-2"
+         id="path35933-49-8-6-2-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0-0"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2-3-6"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0-06"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2-3-1"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2680,6 +2752,16 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient1760-3"
+       x1="405.34961"
+       y1="243.36557"
+       x2="651.55652"
+       y2="243.36557"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65213006,0,0,0.72134316,249.13234,64.538752)" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -2689,16 +2771,16 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="1.7519532"
-     inkscape:cx="423.24137"
-     inkscape:cy="157.27924"
+     inkscape:cx="265.48225"
+     inkscape:cy="64.618341"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -2762,13 +2844,13 @@
          id="tspan5223-0"
          style="font-size:10px;line-height:1.25">producer 0</tspan></text>
     <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760);stroke-width:0.7960096;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760);stroke-width:0.75822091;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect2896-6"
        width="187.47435"
-       height="193.53508"
+       height="175.59599"
        x="217.62262"
-       y="133.47206"
-       ry="4.8934555"
+       y="151.41115"
+       ry="4.4398727"
        rx="6.9415913"
        inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
        inkscape:export-xdpi="112"
@@ -2824,7 +2906,7 @@
          x="115.44385"
          y="186.49918"
          id="tspan5223-0-9"
-         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+1</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4"
@@ -2940,7 +3022,7 @@
          x="115.35846"
          y="242.55573"
          id="tspan5223-0-9-0"
-         style="font-size:10px;line-height:1.25">port n+3</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-2);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4-6"
@@ -3098,7 +3180,7 @@
          x="199.11482"
          y="111.36845"
          id="tspan5223-10"
-         style="font-size:9.02731705px;line-height:1.25;stroke-width:0.90273178">total queues = (number of stages * number of ethernet dev) + 1</tspan></text>
+         style="font-size:9.02731705px;line-height:1.25;stroke-width:0.90273178">total queues = (number of stages * number of ethernet dev) + number of ethernet dev</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:11.11939621px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92661637"
@@ -3243,33 +3325,33 @@
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="426.57141"
+       x="428.57141"
        y="167.14041"
        id="text5219-2-4"><tspan
          sodipodi:role="line"
-         x="426.57141"
+         x="428.57141"
          y="167.14041"
          id="tspan5223-0-7"
          style="font-size:10px;line-height:1.25">worker 0</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="428.30768"
+       x="430.30768"
        y="223.46143"
        id="text5219-2-4-3"><tspan
          sodipodi:role="line"
-         x="428.30768"
+         x="430.30768"
          y="223.46143"
          id="tspan5223-0-7-7"
          style="font-size:10px;line-height:1.25">worker 1</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="426.30768"
+       x="428.30768"
        y="279.46143"
        id="text5219-2-4-3-4-2"><tspan
          sodipodi:role="line"
-         x="426.30768"
+         x="428.30768"
          y="279.46143"
          id="tspan5223-0-7-7-5-5"
          style="font-size:10px;line-height:1.25">worker n</tspan></text>
@@ -3309,7 +3391,7 @@
     <g
        style="display:inline;opacity:1"
        id="g20550"
-       transform="translate(65.401608,-190.91553)">
+       transform="translate(87.401608,-194.91553)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3340,7 +3422,7 @@
     <g
        style="display:inline;opacity:1"
        id="g13899"
-       transform="translate(-17.21182,-3.304662)">
+       transform="translate(5.9319927,-3.304662)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3371,7 +3453,7 @@
     <g
        style="display:inline;opacity:1"
        id="g13911"
-       transform="translate(-15.21182,-1.304662)">
+       transform="translate(7.6443673,-2.7338705)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3399,83 +3481,6 @@
            x="621.71729"
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
-    <g
-       style="display:inline;opacity:1"
-       id="g16360"
-       transform="matrix(1.0983058,0,0,1.0572541,-82.192809,-6.5664741)">
-      <ellipse
-         ry="24.258638"
-         rx="22.831659"
-         cy="161.21605"
-         cx="559.68445"
-         id="path8843"
-         style="fill:#ffffff;fill-opacity:0.98039216;stroke:url(#linearGradient16362);stroke-opacity:1" />
-      <text
-         transform="scale(0.94727182,1.0556632)"
-         id="text5219-2-4-3-3-4-5"
-         y="151.93637"
-         x="571.61011"
-         style="font-style:normal;font-weight:normal;font-size:10.76524448px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89710373"
-         xml:space="preserve"><tspan
-           id="tspan1265-5"
-           style="font-size:7.77489901px;line-height:1.25;stroke-width:0.89710373"
-           y="151.93637"
-           x="571.61011"
-           sodipodi:role="line">Tx Service</tspan><tspan
-           style="font-size:7.77489901px;line-height:1.25;stroke-width:0.89710373"
-           y="161.655"
-           x="571.61011"
-           sodipodi:role="line"
-           id="tspan40484">port n + 1</tspan></text>
-    </g>
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1)"
-       d="m 475.41709,184.68945 c 14.66204,14.27312 29.32201,28.54422 43.97988,42.81328"
-       id="path5226-6-2-1-2-4-5-1-5-0"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2"
-       inkscape:original-d="m 475.41709,184.68945 c 14.66303,14.2721 29.323,28.54321 43.97988,42.81328"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6)"
-       d="m 476.32916,241.51456 c 13.86102,-0.34 27.7191,-0.67992 41.57417,-1.01977"
-       id="path5226-6-2-1-2-4-5-1-5-0-2"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9"
-       inkscape:original-d="m 476.32916,241.51456 c 13.861,-0.34097 27.71908,-0.6809 41.57417,-1.01977"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14e4;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-6)"
-       d="m 474.31327,298.61285 c 15.031,-15.59075 30.05891,-31.17831 45.0837,-46.76263"
-       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
-       inkscape:original-d="m 474.31327,298.61285 c 15.03102,-15.59073 30.05893,-31.17829 45.0837,-46.76263"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1924-3);stroke-width:0.94657081;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3736-8-0-1-7-7"
-       width="30.678661"
-       height="24.347494"
-       x="519.39697"
-       y="227.50273" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="571.69696"
-       y="217.79964"
-       id="text5219-2-4-3-3-4-54-8-7-5"
-       transform="scale(0.91487885,1.0930409)"><tspan
-         sodipodi:role="line"
-         x="571.69696"
-         y="217.79964"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2-3">Single</tspan><tspan
-         sodipodi:role="line"
-         x="571.69696"
-         y="226.76561"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan6344">Link Q</tspan></text>
     <path
        style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:1.01153409;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-6-6)"
        d="m 391.11413,240.54267 c 10.00574,0.0714 20.0096,0.14275 30.01154,0.21411"
@@ -3500,49 +3505,184 @@
        inkscape:path-effect="#path-effect5228-5-1-6-84-8"
        inkscape:original-d="m 389.52644,184.04076 c 10.2068,0.0715 20.41172,0.14408 30.61473,0.21761"
        sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="665.00641"
+       y="346.51425"
+       id="text5219-2-4-3-3-4-54-8-7"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="665.00641"
+         y="346.51425"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-2)"
-       d="m 533.61005,227.17178 c -0.11895,-11.90475 -0.23788,-23.80683 -0.35678,-35.70623"
-       id="path5226-6-2-1-2-4-5-1-5-0-4"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77748054;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10992218, 0.77748055;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5)"
+       d="m 475.15346,298.63383 c 13.1798,0.0326 26.3569,0.0653 39.53121,0.0979"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-6"
-       inkscape:original-d="m 533.61005,227.17178 c -0.11794,-11.90476 -0.23687,-23.80684 -0.35678,-35.70623"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
+       inkscape:original-d="m 475.15346,298.63383 c 13.1798,0.0316 26.3569,0.0643 39.53121,0.0979"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9)"
-       d="m 554.18303,173.89676 c 12.12572,3.64515 24.2491,7.2896 36.37012,10.93334"
-       id="path5226-6-2-1-2-4-5-1-5-0-48"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77332252;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.09329006, 0.77332252;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1)"
+       d="m 476.76243,243.22025 c 12.91755,-0.0156 25.83246,-0.0312 38.74462,-0.0468"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0"
-       inkscape:original-d="m 554.18303,173.89676 c 12.12608,3.64396 24.24946,7.28841 36.37012,10.93334"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       inkscape:original-d="m 476.76243,243.22025 c 12.91755,-0.0166 25.83246,-0.0322 38.74462,-0.0468"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9-7)"
-       d="m 554.18303,173.89676 c 12.8469,22.86455 25.6922,45.72625 38.53585,68.585"
-       id="path5226-6-2-1-2-4-5-1-5-0-48-2"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77624762;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10499055, 0.77624764;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-9)"
+       d="m 475.69395,186.40577 c 12.95011,-0.0208 25.89755,-0.0415 38.84226,-0.0623"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-06"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
-       inkscape:original-d="m 554.18303,173.89676 c 12.84809,22.86388 25.69339,45.72558 38.53585,68.585"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       inkscape:original-d="m 475.69395,186.40577 c 12.95011,-0.0218 25.89755,-0.0426 38.84226,-0.0623"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79"
+       width="72.081367"
+       height="32.405426"
+       x="517.28845"
+       y="170.26158"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="520.91443"
+       y="189.34982"
+       id="text5219-2-6-2"><tspan
+         sodipodi:role="line"
+         x="520.91443"
+         y="189.34982"
+         id="tspan5223-0-9-02"
+         style="font-size:10px;line-height:1.25">port n+m+1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="534.99072"
+       y="225.10315"
+       id="text5219-2-3-7-2-1-8-3"
+       transform="scale(0.89243779,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="534.99072"
+         y="225.10315"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6">Single link</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1"
+       width="72.081367"
+       height="32.405426"
+       x="518.08734"
+       y="226.69656"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="522.60663"
+       y="246.00677"
+       id="text5219-2-6-1-7"><tspan
+         sodipodi:role="line"
+         x="522.60663"
+         y="246.00677"
+         id="tspan5223-0-9-0-5"
+         style="font-size:10px;line-height:1.25">port n+m+2</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1-7"
+       width="72.081367"
+       height="32.405426"
+       x="517.45502"
+       y="282.45056"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="530.6615"
+       y="301.52756"
+       id="text5219-2-6-1-6-2"><tspan
+         sodipodi:role="line"
+         x="530.6615"
+         y="301.52756"
+         id="tspan5223-0-9-0-4-2"
+         style="font-size:10px;line-height:1.25">port n+o</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9-72)"
-       d="m 554.18303,173.89676 c 12.65661,41.60787 25.31164,83.21054 37.96507,124.80795"
-       id="path5226-6-2-1-2-4-5-1-5-0-48-1"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0)"
+       d="m 590.00917,186.37588 c 7.95108,0.0405 15.90052,0.0811 23.84823,0.12159"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
-       inkscape:original-d="m 554.18303,173.89676 c 12.65781,41.6075 25.31284,83.21018 37.96507,124.80795"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       inkscape:original-d="m 590.00917,186.37588 c 7.95109,0.0395 15.90052,0.0801 23.84823,0.12159"
        sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-0)"
+       d="m 590.88337,242.76574 c 7.86699,0.091 15.73233,0.18199 23.59597,0.27295"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-2"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       inkscape:original-d="m 590.88337,242.76574 c 7.867,0.09 15.73234,0.18097 23.59597,0.27295"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-06)"
+       d="m 590.00764,298.95403 c 8.49934,0.0508 16.99697,0.10162 25.49284,0.15242"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
+       inkscape:original-d="m 590.00764,298.95403 c 8.49935,0.0498 16.99698,0.10062 25.49284,0.15242"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760-3);stroke-width:0.67135191;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2896-6-7"
+       width="159.92059"
+       height="161.38417"
+       x="513.79218"
+       y="159.39674"
+       ry="4.080533"
+       rx="5.9213624"
+       inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
+       inkscape:export-xdpi="112"
+       inkscape:export-ydpi="112" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="665.00641"
-       y="346.51425"
-       id="text5219-2-4-3-3-4-54-8-7"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="536.09253"
+       y="175.43703"
+       id="text5219-2-3-7-2-1-8-3-5"
+       transform="scale(0.89243778,1.1205263)"><tspan
          sodipodi:role="line"
-         x="665.00641"
-         y="346.51425"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
+         x="536.09253"
+         y="175.43703"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-3">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="533.85394"
+       y="274.00516"
+       id="text5219-2-3-7-2-1-8-3-56"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="533.85394"
+         y="274.00516"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-2">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="575.06464"
+       y="155.52603"
+       id="text5219-2-4-2"><tspan
+         sodipodi:role="line"
+         x="575.06464"
+         y="155.52603"
+         id="tspan5223-0-7-70"
+         style="font-size:10px;line-height:1.25">Tx adapter</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg b/doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
similarity index 99%
rename from doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg
rename to doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
index c0a365c7b..3036ad663 100644
--- a/doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
@@ -20,8 +20,8 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="eventdev_pipeline_queue_test_lockfree.svg"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
+   sodipodi:docname="eventdev_pipeline_queue_test_internal_port.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
@@ -2853,17 +2853,17 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="2.0000001"
-     inkscape:cx="394.32532"
-     inkscape:cy="122.70585"
+     inkscape:zoom="1.6933595"
+     inkscape:cx="466.69113"
+     inkscape:cy="93.384431"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -3809,7 +3809,7 @@
          x="670.83521"
          y="349.11719"
          style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4">(Tx Lock free)</tspan></text>
+         id="tspan1265-4">(Internal port)</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:11.11939621px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92661637"
diff --git a/doc/guides/tools/testeventdev.rst b/doc/guides/tools/testeventdev.rst
index 46effd871..143d7800b 100644
--- a/doc/guides/tools/testeventdev.rst
+++ b/doc/guides/tools/testeventdev.rst
@@ -521,8 +521,9 @@ This is a pipeline test case that aims at testing the following:
    +===+==============+================+=========================================+
    | 1 | nb_queues    | (nb_producers  | Queues will be configured based on the  |
    |   |              | * nb_stages) + | user requested sched type list(--stlist)|
-   |   |              | x              | Here value of x is 1 in generic pipeline|
-   |   |              |                | and nb_producers in lockfree pipeline   |
+   |   |              | nb_producers   | At the last stage of the schedule list  |
+   |   |              |                | the event is enqueued onto per port     |
+   |   |              |                | unique queue which is then Transmitted. |
    +---+--------------+----------------+-----------------------------------------+
    | 2 | nb_producers | >= 1           | Producers will be configured based on   |
    |   |              |                | the number of detected ethernet devices.|
@@ -533,17 +534,19 @@ This is a pipeline test case that aims at testing the following:
    |   |              |                | argument                                |
    +---+--------------+----------------+-----------------------------------------+
    | 4 | nb_ports     | nb_workers +   | Workers use port 0 to port n.           |
-   |   |              | nb_producers   | Producers use port n+1 to port n+m,     |
-   |   |              |                | depending on the Rx adapter capability. |
+   |   |              | (nb_produces * | Producers use port n+1 to port n+m,     |
+   |   |              | 2)             | depending on the Rx adapter capability. |
+   |   |              |                | Consumers use port n+m+1 to port n+o    |
+   |   |              |                | depending on the Tx adapter capability. |
    +---+--------------+----------------+-----------------------------------------+

 .. _figure_eventdev_pipeline_queue_test_generic:

 .. figure:: img/eventdev_pipeline_queue_test_generic.*

-.. _figure_eventdev_pipeline_queue_test_lockfree:
+.. _figure_eventdev_pipeline_queue_test_internal_port:

-.. figure:: img/eventdev_pipeline_queue_test_lockfree.*
+.. figure:: img/eventdev_pipeline_queue_test_internal_port.*

    pipeline queue test operation.

@@ -568,10 +571,11 @@ the last stage in the pipeline if the event type is ``atomic`` it is enqueued
 onto ethdev Tx queue else to maintain ordering the event type is set to
 ``atomic`` and enqueued onto the last stage queue.

-If the ethernet has ``DEV_TX_OFFLOAD_MT_LOCKFREE`` capability then the worker
-cores transmit the packets directly. Else the worker cores enqueue the packet
-onto the ``SINGLE_LINK_QUEUE`` that is managed by a Tx service. The Tx service
-dequeues the packet and transmits it.
+If the ethdev and eventdev pair have ``RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT``
+capability then the worker cores enqueue the packets to the eventdev directly
+using ``rte_event_eth_tx_adapter_enqueue`` else the worker cores enqueue the
+packet onto the ``SINGLE_LINK_QUEUE`` that is managed by the Tx adapter.
+The Tx adapter dequeues the packet and transmits it.

 On packet Tx, application increments the number events processed and print
 periodically in one second to get the number of events processed in one
@@ -628,8 +632,9 @@ This is a pipeline test case that aims at testing the following with
    +===+==============+================+=========================================+
    | 1 | nb_queues    | nb_producers + | Queues will be configured based on the  |
    |   |              | x              | user requested sched type list(--stlist)|
-   |   |              |                | where x = 1 in generic pipeline and 0   |
-   |   |              |                | in lockfree pipeline                    |
+   |   |              |                | where x = nb_producers in generic       |
+   |   |              |                | pipeline and 0 if all the ethdev        |
+   |   |              |                | being used have Internal port capability|
    +---+--------------+----------------+-----------------------------------------+
    | 2 | nb_producers | >= 1           | Producers will be configured based on   |
    |   |              |                | the number of detected ethernet devices.|
@@ -640,17 +645,22 @@ This is a pipeline test case that aims at testing the following with
    |   |              |                | argument                                |
    +---+--------------+----------------+-----------------------------------------+
    | 4 | nb_ports     | nb_workers +   | Workers use port 0 to port n.           |
-   |   |              | nb_producers   | Producers use port n+1 to port n+m,     |
-   |   |              |                | depending on the Rx adapter capability. |
+   |   |              | nb_producers + | Producers use port n+1 to port n+m,     |
+   |   |              | x              | depending on the Rx adapter capability. |
+   |   |              |                | x = nb_producers in generic pipeline and|
+   |   |              |                | 0 if all the ethdev being used have     |
+   |   |              |                | Internal port capability.               |
+   |   |              |                | Consumers may use port n+m+1 to port n+o|
+   |   |              |                | depending on the Tx adapter capability. |
    +---+--------------+----------------+-----------------------------------------+

 .. _figure_eventdev_pipeline_atq_test_generic:

 .. figure:: img/eventdev_pipeline_atq_test_generic.*

-.. _figure_eventdev_pipeline_atq_test_lockfree:
+.. _figure_eventdev_pipeline_atq_test_internal_port:

-.. figure:: img/eventdev_pipeline_atq_test_lockfree.*
+.. figure:: img/eventdev_pipeline_atq_test_internal_port.*

    pipeline atq test operation.

--
2.19.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos
  2018-09-19 22:22 ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
                     ` (2 preceding siblings ...)
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 4/4] doc: update eventdev application guide Pavan Nikhilesh
@ 2018-09-23 10:28   ` Jerin Jacob
  3 siblings, 0 replies; 22+ messages in thread
From: Jerin Jacob @ 2018-09-23 10:28 UTC (permalink / raw)
  To: Pavan Nikhilesh; +Cc: nikhil.rao, anoob.joseph, dev

-----Original Message-----
> Date: Thu, 20 Sep 2018 03:52:32 +0530
> From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> To: jerin.jacob@caviumnetworks.com, nikhil.rao@intel.com,
>  anoob.joseph@caviumnetworks.com
> Cc: dev@dpdk.org, Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos
> X-Mailer: git-send-email 2.18.0
> 
> Fix minor typos.
> 
> Fixes: 314bcf58ca8f ("app/eventdev: add pipeline queue worker functions")


Cc: stable@dpdk.org

> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>

Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

> ---
> 
>  v3 Changes:
>  - Force all the ports to use the non-internal cap mode when we detect
>  that one of the port doesn't have internal port capability.
> 
>  app/test-eventdev/test_pipeline_atq.c    | 16 ++++++++--------
>  app/test-eventdev/test_pipeline_common.h |  8 ++++----
>  app/test-eventdev/test_pipeline_queue.c  | 16 ++++++++--------
>  3 files changed, 20 insertions(+), 20 deletions(-)
> 
> diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
> index 26dc79f90..f0b2f9015 100644
> --- a/app/test-eventdev/test_pipeline_atq.c
> +++ b/app/test-eventdev/test_pipeline_atq.c
> @@ -18,7 +18,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
>  static int
>  pipeline_atq_worker_single_stage_tx(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_INIT;
> 
>  	while (t->done == false) {
>  		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
> @@ -43,7 +43,7 @@ pipeline_atq_worker_single_stage_tx(void *arg)
>  static int
>  pipeline_atq_worker_single_stage_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_INIT;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
>  	while (t->done == false) {
> @@ -66,7 +66,7 @@ pipeline_atq_worker_single_stage_fwd(void *arg)
>  static int
>  pipeline_atq_worker_single_stage_burst_tx(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
> 
>  	while (t->done == false) {
>  		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
> @@ -98,7 +98,7 @@ pipeline_atq_worker_single_stage_burst_tx(void *arg)
>  static int
>  pipeline_atq_worker_single_stage_burst_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
>  	while (t->done == false) {
> @@ -126,7 +126,7 @@ pipeline_atq_worker_single_stage_burst_fwd(void *arg)
>  static int
>  pipeline_atq_worker_multi_stage_tx(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages;
> 
> 
> @@ -161,7 +161,7 @@ pipeline_atq_worker_multi_stage_tx(void *arg)
>  static int
>  pipeline_atq_worker_multi_stage_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
> @@ -192,7 +192,7 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
>  static int
>  pipeline_atq_worker_multi_stage_burst_tx(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages;
> 
>  	while (t->done == false) {
> @@ -234,7 +234,7 @@ pipeline_atq_worker_multi_stage_burst_tx(void *arg)
>  static int
>  pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
> diff --git a/app/test-eventdev/test_pipeline_common.h b/app/test-eventdev/test_pipeline_common.h
> index 5fb91607d..9cd6b905b 100644
> --- a/app/test-eventdev/test_pipeline_common.h
> +++ b/app/test-eventdev/test_pipeline_common.h
> @@ -65,14 +65,14 @@ struct test_pipeline {
> 
>  #define BURST_SIZE 16
> 
> -#define PIPELINE_WROKER_SINGLE_STAGE_INIT \
> +#define PIPELINE_WORKER_SINGLE_STAGE_INIT \
>  	struct worker_data *w  = arg;     \
>  	struct test_pipeline *t = w->t;   \
>  	const uint8_t dev = w->dev_id;    \
>  	const uint8_t port = w->port_id;  \
>  	struct rte_event ev
> 
> -#define PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT \
> +#define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
>  	int i;                                  \
>  	struct worker_data *w  = arg;           \
>  	struct test_pipeline *t = w->t;         \
> @@ -80,7 +80,7 @@ struct test_pipeline {
>  	const uint8_t port = w->port_id;        \
>  	struct rte_event ev[BURST_SIZE + 1]
> 
> -#define PIPELINE_WROKER_MULTI_STAGE_INIT                         \
> +#define PIPELINE_WORKER_MULTI_STAGE_INIT                         \
>  	struct worker_data *w  = arg;                            \
>  	struct test_pipeline *t = w->t;                          \
>  	uint8_t cq_id;                                           \
> @@ -90,7 +90,7 @@ struct test_pipeline {
>  	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
>  	struct rte_event ev
> 
> -#define PIPELINE_WROKER_MULTI_STAGE_BURST_INIT                   \
> +#define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT                   \
>  	int i;                                  \
>  	struct worker_data *w  = arg;                            \
>  	struct test_pipeline *t = w->t;                          \
> diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c
> index ca5f4578e..2e0d93d99 100644
> --- a/app/test-eventdev/test_pipeline_queue.c
> +++ b/app/test-eventdev/test_pipeline_queue.c
> @@ -18,7 +18,7 @@ pipeline_queue_nb_event_queues(struct evt_options *opt)
>  static int
>  pipeline_queue_worker_single_stage_tx(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_INIT;
> 
>  	while (t->done == false) {
>  		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
> @@ -44,7 +44,7 @@ pipeline_queue_worker_single_stage_tx(void *arg)
>  static int
>  pipeline_queue_worker_single_stage_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_INIT;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
>  	while (t->done == false) {
> @@ -67,7 +67,7 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
>  static int
>  pipeline_queue_worker_single_stage_burst_tx(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
> 
>  	while (t->done == false) {
>  		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
> @@ -101,7 +101,7 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
>  static int
>  pipeline_queue_worker_single_stage_burst_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
>  	while (t->done == false) {
> @@ -130,7 +130,7 @@ pipeline_queue_worker_single_stage_burst_fwd(void *arg)
>  static int
>  pipeline_queue_worker_multi_stage_tx(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages + 1;
> 
>  	while (t->done == false) {
> @@ -165,7 +165,7 @@ pipeline_queue_worker_multi_stage_tx(void *arg)
>  static int
>  pipeline_queue_worker_multi_stage_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages + 1;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
> @@ -196,7 +196,7 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
>  static int
>  pipeline_queue_worker_multi_stage_burst_tx(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages + 1;
> 
>  	while (t->done == false) {
> @@ -240,7 +240,7 @@ pipeline_queue_worker_multi_stage_burst_tx(void *arg)
>  static int
>  pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
>  {
> -	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
> +	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
>  	const uint8_t nb_stages = t->opt->nb_stages + 1;
>  	const uint8_t tx_queue = t->tx_service.queue_id;
> 
> --
> 2.19.0
> 

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant newlines
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
@ 2018-09-23 10:31     ` Jerin Jacob
  0 siblings, 0 replies; 22+ messages in thread
From: Jerin Jacob @ 2018-09-23 10:31 UTC (permalink / raw)
  To: Pavan Nikhilesh; +Cc: nikhil.rao, anoob.joseph, dev

-----Original Message-----
> Date: Thu, 20 Sep 2018 03:52:33 +0530
> From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> To: jerin.jacob@caviumnetworks.com, nikhil.rao@intel.com,
>  anoob.joseph@caviumnetworks.com
> Cc: dev@dpdk.org, Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant
>  newlines
> X-Mailer: git-send-email 2.18.0
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>

Please fix check-git-log.sh errors.

### app/test-eventdev: remove redundant newlines

WARNING:COMMIT_MESSAGE: Missing commit description - Add an appropriate
one

With above change:

Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>


> ---
>  app/test-eventdev/test_pipeline_common.c | 21 ++++++++++-----------
>  1 file changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
> index 12a58fbbf..cdf9010b4 100644
> --- a/app/test-eventdev/test_pipeline_common.c
> +++ b/app/test-eventdev/test_pipeline_common.c
> @@ -65,12 +65,12 @@ pipeline_test_result(struct evt_test *test, struct evt_options *opt)
>  	uint64_t total = 0;
>  	struct test_pipeline *t = evt_test_priv(test);
>  
> -	printf("Packet distribution across worker cores :\n");
> +	evt_info("Packet distribution across worker cores :");
>  	for (i = 0; i < t->nb_workers; i++)
>  		total += t->worker[i].processed_pkts;
>  	for (i = 0; i < t->nb_workers; i++)
> -		printf("Worker %d packets: "CLGRN"%"PRIx64" "CLNRM"percentage:"
> -				CLGRN" %3.2f\n"CLNRM, i,
> +		evt_info("Worker %d packets: "CLGRN"%"PRIx64""CLNRM" percentage:"
> +				CLGRN" %3.2f"CLNRM, i,
>  				t->worker[i].processed_pkts,
>  				(((double)t->worker[i].processed_pkts)/total)
>  				* 100);
> @@ -233,7 +233,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
>  
>  	RTE_SET_USED(opt);
>  	if (!rte_eth_dev_count_avail()) {
> -		evt_err("No ethernet ports found.\n");
> +		evt_err("No ethernet ports found.");
>  		return -ENODEV;
>  	}
>  
> @@ -252,7 +252,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
>  		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
>  				port_conf.rx_adv_conf.rss_conf.rss_hf) {
>  			evt_info("Port %u modified RSS hash function based on hardware support,"
> -				"requested:%#"PRIx64" configured:%#"PRIx64"\n",
> +				"requested:%#"PRIx64" configured:%#"PRIx64"",
>  				i,
>  				port_conf.rx_adv_conf.rss_conf.rss_hf,
>  				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
> @@ -261,19 +261,19 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
>  		if (rte_eth_dev_configure(i, nb_queues, nb_queues,
>  					&local_port_conf)
>  				< 0) {
> -			evt_err("Failed to configure eth port [%d]\n", i);
> +			evt_err("Failed to configure eth port [%d]", i);
>  			return -EINVAL;
>  		}
>  
>  		if (rte_eth_rx_queue_setup(i, 0, NB_RX_DESC,
>  				rte_socket_id(), &rx_conf, t->pool) < 0) {
> -			evt_err("Failed to setup eth port [%d] rx_queue: %d.\n",
> +			evt_err("Failed to setup eth port [%d] rx_queue: %d.",
>  					i, 0);
>  			return -EINVAL;
>  		}
>  		if (rte_eth_tx_queue_setup(i, 0, NB_TX_DESC,
>  					rte_socket_id(), NULL) < 0) {
> -			evt_err("Failed to setup eth port [%d] tx_queue: %d.\n",
> +			evt_err("Failed to setup eth port [%d] tx_queue: %d.",
>  					i, 0);
>  			return -EINVAL;
>  		}
> @@ -379,7 +379,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>  			ret = evt_service_setup(service_id);
>  			if (ret) {
>  				evt_err("Failed to setup service core"
> -						" for Rx adapter\n");
> +						" for Rx adapter");
>  				return ret;
>  			}
>  		}
> @@ -396,8 +396,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
>  			evt_err("Rx adapter[%d] start failed", prod);
>  			return ret;
>  		}
> -		printf("%s: Port[%d] using Rx adapter[%d] started\n", __func__,
> -				prod, prod);
> +		evt_info("Port[%d] using Rx adapter[%d] started", prod, prod);
>  	}
>  
>  	return ret;
> -- 
> 2.19.0
> 

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3 4/4] doc: update eventdev application guide
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 4/4] doc: update eventdev application guide Pavan Nikhilesh
@ 2018-09-23 10:46     ` Jerin Jacob
  0 siblings, 0 replies; 22+ messages in thread
From: Jerin Jacob @ 2018-09-23 10:46 UTC (permalink / raw)
  To: Pavan Nikhilesh; +Cc: nikhil.rao, anoob.joseph, dev, john.mcnamara

-----Original Message-----
> Date: Thu, 20 Sep 2018 03:52:35 +0530
> From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> To: jerin.jacob@caviumnetworks.com, nikhil.rao@intel.com,
>  anoob.joseph@caviumnetworks.com
> Cc: dev@dpdk.org, Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>,
>  john.mcnamara@intel.com
> Subject: [dpdk-dev] [PATCH v3 4/4] doc: update eventdev application guide
> X-Mailer: git-send-email 2.18.0
> 
> Update eventdev application guide to reflect Tx adapter related changes.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> ---
> cc: <john.mcnamara@intel.com>
> 
>  .../eventdev_pipeline_atq_test_generic.svg    | 848 +++++++++++-------
>  ...ntdev_pipeline_atq_test_internal_port.svg} |  26 +-
>  .../eventdev_pipeline_queue_test_generic.svg  | 570 +++++++-----
>  ...dev_pipeline_queue_test_internal_port.svg} |  22 +-

Updated diagrams looks good.

Since this file gets modified, Can you add the missing pipeline tests in
--test <name> documentation.

With above change:
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support
  2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
@ 2018-09-23 11:35     ` Jerin Jacob
  2018-09-24  8:30       ` Andrzej Ostruszka
  0 siblings, 1 reply; 22+ messages in thread
From: Jerin Jacob @ 2018-09-23 11:35 UTC (permalink / raw)
  To: Pavan Nikhilesh; +Cc: nikhil.rao, anoob.joseph, dev

-----Original Message-----
> Date: Thu, 20 Sep 2018 03:52:34 +0530
> From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> To: jerin.jacob@caviumnetworks.com, nikhil.rao@intel.com,
>  anoob.joseph@caviumnetworks.com
> Cc: dev@dpdk.org, Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support
> X-Mailer: git-send-email 2.18.0
> 
> Convert existing Tx service based pipeline to Tx adapter based APIs and
> simplify worker functions.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> ---
>  app/test-eventdev/test_pipeline_atq.c    | 269 ++++++++++++-----------
>  app/test-eventdev/test_pipeline_common.c | 202 +++++------------
>  app/test-eventdev/test_pipeline_common.h |  62 +++---
>  app/test-eventdev/test_pipeline_queue.c  | 241 ++++++++++----------
>  4 files changed, 363 insertions(+), 411 deletions(-)
> 
> diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
> index f0b2f9015..01af298f3 100644
> --- a/app/test-eventdev/test_pipeline_atq.c
> +++ b/app/test-eventdev/test_pipeline_atq.c
> @@ -15,7 +15,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
>  	return rte_eth_dev_count_avail();
>  }
> @@ -317,34 +291,36 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
>  	int nb_ports;
>  	int nb_queues;
>  	uint8_t queue;
> -	struct rte_event_dev_info info;
> -	struct test_pipeline *t = evt_test_priv(test);
> -	uint8_t tx_evqueue_id = 0;
> +	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};

Some old compiler throws error with this scheme. Please change to memset.

>  
>  int
> -pipeline_event_tx_service_setup(struct evt_test *test, struct evt_options *opt,
> -		uint8_t tx_queue_id, uint8_t tx_port_id,
> -		const struct rte_event_port_conf p_conf)
> +pipeline_event_tx_adapter_setup(struct evt_options *opt,
> +		struct rte_event_port_conf port_conf)
>  {
> -	int ret;
> -	struct rte_service_spec serv;
> -	struct test_pipeline *t = evt_test_priv(test);
> -	struct tx_service_data *tx = &t->tx_service;
> +	int ret = 0;
> +	uint16_t consm = 0;

Please check the above needs to be initialized to zero?
>  
>  
> @@ -326,25 +316,21 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
>  	int nb_queues;
>  	int nb_stages = opt->nb_stages;
>  	uint8_t queue;
> -	struct rte_event_dev_info info;
> -	struct test_pipeline *t = evt_test_priv(test);
> -	uint8_t tx_evqueue_id = 0;
> +	uint8_t tx_evport_id = 0;
> +	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};

Same as above.

With above changes:
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev]  [PATCH v4 1/4] app/test-eventdev: fix minor typos
  2018-09-04 14:12 [dpdk-dev] [PATCH v2 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
                   ` (3 preceding siblings ...)
  2018-09-19 22:22 ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
@ 2018-09-24  8:02 ` Pavan Nikhilesh
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
                     ` (2 more replies)
  4 siblings, 3 replies; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-24  8:02 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh, stable

Fix minor typos.

Fixes: 314bcf58ca8f ("app/eventdev: add pipeline queue worker functions")
Cc: stable@dpdk.org

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
---
 v4 Changes:
 - Address review comments (Jerin).
 v3 Changes:
 - Force all the ports to use the non-internal cap mode when we detect
 that one of the port doesn't have internal port capability.

 app/test-eventdev/test_pipeline_atq.c    | 16 ++++++++--------
 app/test-eventdev/test_pipeline_common.h |  8 ++++----
 app/test-eventdev/test_pipeline_queue.c  | 16 ++++++++--------
 3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
index 26dc79f90..f0b2f9015 100644
--- a/app/test-eventdev/test_pipeline_atq.c
+++ b/app/test-eventdev/test_pipeline_atq.c
@@ -18,7 +18,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
 static int
 pipeline_atq_worker_single_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;

 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -43,7 +43,7 @@ pipeline_atq_worker_single_stage_tx(void *arg)
 static int
 pipeline_atq_worker_single_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -66,7 +66,7 @@ pipeline_atq_worker_single_stage_fwd(void *arg)
 static int
 pipeline_atq_worker_single_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;

 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -98,7 +98,7 @@ pipeline_atq_worker_single_stage_burst_tx(void *arg)
 static int
 pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -126,7 +126,7 @@ pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 static int
 pipeline_atq_worker_multi_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;


@@ -161,7 +161,7 @@ pipeline_atq_worker_multi_stage_tx(void *arg)
 static int
 pipeline_atq_worker_multi_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;
 	const uint8_t tx_queue = t->tx_service.queue_id;

@@ -192,7 +192,7 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 static int
 pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;

 	while (t->done == false) {
@@ -234,7 +234,7 @@ pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 static int
 pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages;
 	const uint8_t tx_queue = t->tx_service.queue_id;

diff --git a/app/test-eventdev/test_pipeline_common.h b/app/test-eventdev/test_pipeline_common.h
index 5fb91607d..9cd6b905b 100644
--- a/app/test-eventdev/test_pipeline_common.h
+++ b/app/test-eventdev/test_pipeline_common.h
@@ -65,14 +65,14 @@ struct test_pipeline {

 #define BURST_SIZE 16

-#define PIPELINE_WROKER_SINGLE_STAGE_INIT \
+#define PIPELINE_WORKER_SINGLE_STAGE_INIT \
 	struct worker_data *w  = arg;     \
 	struct test_pipeline *t = w->t;   \
 	const uint8_t dev = w->dev_id;    \
 	const uint8_t port = w->port_id;  \
 	struct rte_event ev

-#define PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT \
+#define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
 	int i;                                  \
 	struct worker_data *w  = arg;           \
 	struct test_pipeline *t = w->t;         \
@@ -80,7 +80,7 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;        \
 	struct rte_event ev[BURST_SIZE + 1]

-#define PIPELINE_WROKER_MULTI_STAGE_INIT                         \
+#define PIPELINE_WORKER_MULTI_STAGE_INIT                         \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
 	uint8_t cq_id;                                           \
@@ -90,7 +90,7 @@ struct test_pipeline {
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
 	struct rte_event ev

-#define PIPELINE_WROKER_MULTI_STAGE_BURST_INIT                   \
+#define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT                   \
 	int i;                                  \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c
index ca5f4578e..2e0d93d99 100644
--- a/app/test-eventdev/test_pipeline_queue.c
+++ b/app/test-eventdev/test_pipeline_queue.c
@@ -18,7 +18,7 @@ pipeline_queue_nb_event_queues(struct evt_options *opt)
 static int
 pipeline_queue_worker_single_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;

 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -44,7 +44,7 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 static int
 pipeline_queue_worker_single_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -67,7 +67,7 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 static int
 pipeline_queue_worker_single_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;

 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -101,7 +101,7 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 static int
 pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
 	const uint8_t tx_queue = t->tx_service.queue_id;

 	while (t->done == false) {
@@ -130,7 +130,7 @@ pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 static int
 pipeline_queue_worker_multi_stage_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;

 	while (t->done == false) {
@@ -165,7 +165,7 @@ pipeline_queue_worker_multi_stage_tx(void *arg)
 static int
 pipeline_queue_worker_multi_stage_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;
 	const uint8_t tx_queue = t->tx_service.queue_id;

@@ -196,7 +196,7 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 static int
 pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;

 	while (t->done == false) {
@@ -240,7 +240,7 @@ pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 static int
 pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 {
-	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
 	const uint8_t nb_stages = t->opt->nb_stages + 1;
 	const uint8_t tx_queue = t->tx_service.queue_id;

--
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v4 2/4] app/test-eventdev: remove redundant newlines
  2018-09-24  8:02 ` [dpdk-dev] [PATCH v4 " Pavan Nikhilesh
@ 2018-09-24  8:02   ` Pavan Nikhilesh
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 4/4] doc: update eventdev application guide Pavan Nikhilesh
  2 siblings, 0 replies; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-24  8:02 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh

Remove unnecessary newline at the end of logs.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
---
 app/test-eventdev/test_pipeline_common.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
index a54068df3..832ab8b6e 100644
--- a/app/test-eventdev/test_pipeline_common.c
+++ b/app/test-eventdev/test_pipeline_common.c
@@ -65,12 +65,12 @@ pipeline_test_result(struct evt_test *test, struct evt_options *opt)
 	uint64_t total = 0;
 	struct test_pipeline *t = evt_test_priv(test);
 
-	printf("Packet distribution across worker cores :\n");
+	evt_info("Packet distribution across worker cores :");
 	for (i = 0; i < t->nb_workers; i++)
 		total += t->worker[i].processed_pkts;
 	for (i = 0; i < t->nb_workers; i++)
-		printf("Worker %d packets: "CLGRN"%"PRIx64" "CLNRM"percentage:"
-				CLGRN" %3.2f\n"CLNRM, i,
+		evt_info("Worker %d packets: "CLGRN"%"PRIx64""CLNRM" percentage:"
+				CLGRN" %3.2f"CLNRM, i,
 				t->worker[i].processed_pkts,
 				(((double)t->worker[i].processed_pkts)/total)
 				* 100);
@@ -234,7 +234,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 
 	RTE_SET_USED(opt);
 	if (!rte_eth_dev_count_avail()) {
-		evt_err("No ethernet ports found.\n");
+		evt_err("No ethernet ports found.");
 		return -ENODEV;
 	}
 
@@ -253,7 +253,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 		if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
 				port_conf.rx_adv_conf.rss_conf.rss_hf) {
 			evt_info("Port %u modified RSS hash function based on hardware support,"
-				"requested:%#"PRIx64" configured:%#"PRIx64"\n",
+				"requested:%#"PRIx64" configured:%#"PRIx64"",
 				i,
 				port_conf.rx_adv_conf.rss_conf.rss_hf,
 				local_port_conf.rx_adv_conf.rss_conf.rss_hf);
@@ -262,19 +262,19 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 		if (rte_eth_dev_configure(i, nb_queues, nb_queues,
 					&local_port_conf)
 				< 0) {
-			evt_err("Failed to configure eth port [%d]\n", i);
+			evt_err("Failed to configure eth port [%d]", i);
 			return -EINVAL;
 		}
 
 		if (rte_eth_rx_queue_setup(i, 0, NB_RX_DESC,
 				rte_socket_id(), &rx_conf, t->pool) < 0) {
-			evt_err("Failed to setup eth port [%d] rx_queue: %d.\n",
+			evt_err("Failed to setup eth port [%d] rx_queue: %d.",
 					i, 0);
 			return -EINVAL;
 		}
 		if (rte_eth_tx_queue_setup(i, 0, NB_TX_DESC,
 					rte_socket_id(), NULL) < 0) {
-			evt_err("Failed to setup eth port [%d] tx_queue: %d.\n",
+			evt_err("Failed to setup eth port [%d] tx_queue: %d.",
 					i, 0);
 			return -EINVAL;
 		}
@@ -380,7 +380,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			ret = evt_service_setup(service_id);
 			if (ret) {
 				evt_err("Failed to setup service core"
-						" for Rx adapter\n");
+						" for Rx adapter");
 				return ret;
 			}
 		}
@@ -397,8 +397,7 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			evt_err("Rx adapter[%d] start failed", prod);
 			return ret;
 		}
-		printf("%s: Port[%d] using Rx adapter[%d] started\n", __func__,
-				prod, prod);
+		evt_info("Port[%d] using Rx adapter[%d] started", prod, prod);
 	}
 
 	return ret;
-- 
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v4 3/4] app/test-eventdev: add Tx adapter support
  2018-09-24  8:02 ` [dpdk-dev] [PATCH v4 " Pavan Nikhilesh
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
@ 2018-09-24  8:02   ` Pavan Nikhilesh
  2018-09-28 16:13     ` Jerin Jacob
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 4/4] doc: update eventdev application guide Pavan Nikhilesh
  2 siblings, 1 reply; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-24  8:02 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh

Convert existing Tx service based pipeline to Tx adapter based APIs and
simplify worker functions.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
---
 app/test-eventdev/test_pipeline_atq.c    | 271 ++++++++++++-----------
 app/test-eventdev/test_pipeline_common.c | 200 +++++------------
 app/test-eventdev/test_pipeline_common.h |  62 +++---
 app/test-eventdev/test_pipeline_queue.c  | 244 ++++++++++----------
 4 files changed, 367 insertions(+), 410 deletions(-)

diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
index f0b2f9015..c60635bf6 100644
--- a/app/test-eventdev/test_pipeline_atq.c
+++ b/app/test-eventdev/test_pipeline_atq.c
@@ -15,7 +15,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
 	return rte_eth_dev_count_avail();
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
@@ -28,23 +28,18 @@ pipeline_atq_worker_single_stage_tx(void *arg)
 			continue;
 		}
 
-		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-			pipeline_tx_pkt(ev.mbuf);
-			w->processed_pkts++;
-			continue;
-		}
-		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		pipeline_event_enqueue(dev, port, &ev);
+		pipeline_event_tx(dev, port, &ev);
+		w->processed_pkts++;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -54,16 +49,16 @@ pipeline_atq_worker_single_stage_fwd(void *arg)
 			continue;
 		}
 
-		w->processed_pkts++;
-		ev.queue_id = tx_queue;
+		ev.queue_id = tx_queue[ev.mbuf->port];
 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
+		w->processed_pkts++;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
@@ -79,27 +74,21 @@ pipeline_atq_worker_single_stage_burst_tx(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev[i].mbuf);
-				ev[i].op = RTE_EVENT_OP_RELEASE;
-				w->processed_pkts++;
-			} else
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 		}
 
-		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		pipeline_event_tx_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -112,23 +101,22 @@ pipeline_atq_worker_single_stage_burst_fwd(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			ev[i].queue_id = tx_queue;
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
+			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
-			w->processed_pkts++;
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -141,29 +129,24 @@ pipeline_atq_worker_multi_stage_tx(void *arg)
 		cq_id = ev.sub_event_type % nb_stages;
 
 		if (cq_id == last_queue) {
-			if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev.mbuf);
-				w->processed_pkts++;
-				continue;
-			}
-			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		} else {
-			ev.sub_event_type++;
-			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
+			pipeline_event_tx(dev, port, &ev);
+			w->processed_pkts++;
+			continue;
 		}
 
+		ev.sub_event_type++;
+		pipeline_fwd_event(&ev, sched_type_list[cq_id]);
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -176,9 +159,9 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 		cq_id = ev.sub_event_type % nb_stages;
 
 		if (cq_id == last_queue) {
-			w->processed_pkts++;
-			ev.queue_id = tx_queue;
+			ev.queue_id = tx_queue[ev.mbuf->port];
 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
+			w->processed_pkts++;
 		} else {
 			ev.sub_event_type++;
 			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
@@ -186,14 +169,14 @@ pipeline_atq_worker_multi_stage_fwd(void *arg)
 
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -209,34 +192,27 @@ pipeline_atq_worker_multi_stage_burst_tx(void *arg)
 			cq_id = ev[i].sub_event_type % nb_stages;
 
 			if (cq_id == last_queue) {
-				if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-					pipeline_tx_pkt(ev[i].mbuf);
-					ev[i].op = RTE_EVENT_OP_RELEASE;
-					w->processed_pkts++;
-					continue;
-				}
-
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
-			} else {
-				ev[i].sub_event_type++;
-				pipeline_fwd_event(&ev[i],
-						sched_type_list[cq_id]);
+				pipeline_event_tx(dev, port, &ev[i]);
+				ev[i].op = RTE_EVENT_OP_RELEASE;
+				w->processed_pkts++;
+				continue;
 			}
+
+			ev[i].sub_event_type++;
+			pipeline_fwd_event(&ev[i], sched_type_list[cq_id]);
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -253,7 +229,7 @@ pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 
 			if (cq_id == last_queue) {
 				w->processed_pkts++;
-				ev[i].queue_id = tx_queue;
+				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
 				pipeline_fwd_event(&ev[i],
 						RTE_SCHED_TYPE_ATOMIC);
 			} else {
@@ -265,6 +241,7 @@ pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
@@ -274,39 +251,36 @@ worker_wrapper(void *arg)
 	struct worker_data *w  = arg;
 	struct evt_options *opt = w->t->opt;
 	const bool burst = evt_has_burst_mode(w->dev_id);
-	const bool mt_safe = !w->t->mt_unsafe;
+	const bool internal_port = w->t->internal_port;
 	const uint8_t nb_stages = opt->nb_stages;
 	RTE_SET_USED(opt);
 
 	if (nb_stages == 1) {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_atq_worker_single_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_atq_worker_single_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_atq_worker_single_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_atq_worker_single_stage_burst_fwd(arg);
 	} else {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_atq_worker_multi_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_atq_worker_multi_stage_fwd(arg);
-		if (burst && mt_safe)
+		if (burst && internal_port)
 			return pipeline_atq_worker_multi_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_atq_worker_multi_stage_burst_fwd(arg);
 	}
+
 	rte_panic("invalid worker\n");
 }
 
 static int
 pipeline_atq_launch_lcores(struct evt_test *test, struct evt_options *opt)
 {
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe)
-		rte_service_component_runstate_set(t->tx_service.service_id, 1);
 	return pipeline_launch_lcores(test, opt, worker_wrapper);
 }
 
@@ -317,34 +291,38 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	int nb_ports;
 	int nb_queues;
 	uint8_t queue;
-	struct rte_event_dev_info info;
-	struct test_pipeline *t = evt_test_priv(test);
-	uint8_t tx_evqueue_id = 0;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
 	uint8_t nb_worker_queues = 0;
+	uint8_t tx_evport_id = 0;
+	uint16_t prod = 0;
+	struct rte_event_dev_info info;
+	struct test_pipeline *t = evt_test_priv(test);
 
 	nb_ports = evt_nr_active_lcores(opt->wlcores);
 	nb_queues = rte_eth_dev_count_avail();
 
-	/* One extra port and queueu for Tx service */
-	if (t->mt_unsafe) {
-		tx_evqueue_id = nb_queues;
-		nb_ports++;
-		nb_queues++;
+	memset(tx_evqueue_id, 0, sizeof(uint8_t) * RTE_MAX_ETHPORTS);
+	memset(queue_arr, 0, sizeof(uint8_t) * RTE_EVENT_MAX_QUEUES_PER_DEV);
+	/* One queue for Tx adapter per port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			tx_evqueue_id[prod] = nb_queues;
+			nb_queues++;
+		}
 	}
 
-
 	rte_event_dev_info_get(opt->dev_id, &info);
 
 	const struct rte_event_dev_config config = {
-			.nb_event_queues = nb_queues,
-			.nb_event_ports = nb_ports,
-			.nb_events_limit  = info.max_num_events,
-			.nb_event_queue_flows = opt->nb_flows,
-			.nb_event_port_dequeue_depth =
-				info.max_event_port_dequeue_depth,
-			.nb_event_port_enqueue_depth =
-				info.max_event_port_enqueue_depth,
+		.nb_event_queues = nb_queues,
+		.nb_event_ports = nb_ports,
+		.nb_events_limit  = info.max_num_events,
+		.nb_event_queue_flows = opt->nb_flows,
+		.nb_event_port_dequeue_depth =
+			info.max_event_port_dequeue_depth,
+		.nb_event_port_enqueue_depth =
+			info.max_event_port_enqueue_depth,
 	};
 	ret = rte_event_dev_configure(opt->dev_id, &config);
 	if (ret) {
@@ -353,21 +331,23 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	}
 
 	struct rte_event_queue_conf q_conf = {
-			.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
-			.nb_atomic_flows = opt->nb_flows,
-			.nb_atomic_order_sequences = opt->nb_flows,
+		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
+		.nb_atomic_flows = opt->nb_flows,
+		.nb_atomic_order_sequences = opt->nb_flows,
 	};
 	/* queue configurations */
 	for (queue = 0; queue < nb_queues; queue++) {
 		q_conf.event_queue_cfg = RTE_EVENT_QUEUE_CFG_ALL_TYPES;
 
-		if (t->mt_unsafe) {
-			if (queue == tx_evqueue_id) {
-				q_conf.event_queue_cfg =
-					RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
-			} else {
-				queue_arr[nb_worker_queues] = queue;
-				nb_worker_queues++;
+		if (!t->internal_port) {
+			RTE_ETH_FOREACH_DEV(prod) {
+				if (queue == tx_evqueue_id[prod]) {
+					q_conf.event_queue_cfg =
+						RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
+				} else {
+					queue_arr[nb_worker_queues] = queue;
+					nb_worker_queues++;
+				}
 			}
 		}
 
@@ -383,20 +363,15 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 
 	/* port configuration */
 	const struct rte_event_port_conf p_conf = {
-			.dequeue_depth = opt->wkr_deq_dep,
-			.enqueue_depth = info.max_event_port_dequeue_depth,
-			.new_event_threshold = info.max_num_events,
+		.dequeue_depth = opt->wkr_deq_dep,
+		.enqueue_depth = info.max_event_port_dequeue_depth,
+		.new_event_threshold = info.max_num_events,
 	};
 
-	if (t->mt_unsafe) {
+	if (!t->internal_port)
 		ret = pipeline_event_port_setup(test, opt, queue_arr,
 				nb_worker_queues, p_conf);
-		if (ret)
-			return ret;
-
-		ret = pipeline_event_tx_service_setup(test, opt, tx_evqueue_id,
-				nb_ports - 1, p_conf);
-	} else
+	else
 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
 				p_conf);
 
@@ -408,30 +383,32 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *
 	 * eth_dev_count = 2, nb_stages = 2, atq mode
 	 *
-	 * Multi thread safe :
+	 * eth0, eth1 have Internal port capability :
 	 *	queues = 2
 	 *	stride = 1
 	 *
 	 *	event queue pipelines:
-	 *	eth0 -> q0 ->tx
-	 *	eth1 -> q1 ->tx
+	 *	eth0 -> q0 ->Tx
+	 *	eth1 -> q1 ->Tx
 	 *
 	 *	q0, q1 are configured as ATQ so, all the different stages can
 	 *	be enqueued on the same queue.
 	 *
-	 * Multi thread unsafe :
-	 *	queues = 3
+	 * eth0, eth1 use Tx adapters service core :
+	 *	queues = 4
 	 *	stride = 1
 	 *
 	 *	event queue pipelines:
-	 *	eth0 -> q0
-	 *		  } (q3->tx) Tx service
-	 *	eth1 -> q1
+	 *	eth0 -> q0  -> q2 -> Tx
+	 *	eth1 -> q1  -> q3 -> Tx
 	 *
-	 *	q0,q1 are configured as stated above.
-	 *	q3 configured as SINGLE_LINK|ATOMIC.
+	 *	q0, q1 are configured as stated above.
+	 *	q2, q3 configured as SINGLE_LINK.
 	 */
 	ret = pipeline_event_rx_adapter_setup(opt, 1, p_conf);
+	if (ret)
+		return ret;
+	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
 	if (ret)
 		return ret;
 
@@ -445,12 +422,58 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 		}
 	}
 
+	/* Connect the tx_evqueue_id to the Tx adapter port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			ret = rte_event_eth_tx_adapter_event_port_get(prod,
+					&tx_evport_id);
+			if (ret) {
+				evt_err("Unable to get Tx adapter[%d]", prod);
+				return ret;
+			}
+
+			if (rte_event_port_link(opt->dev_id, tx_evport_id,
+						&tx_evqueue_id[prod],
+						NULL, 1) != 1) {
+				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+		}
+	}
+
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_eth_dev_start(prod);
+		if (ret) {
+			evt_err("Ethernet dev [%d] failed to start."
+					" Using synthetic producer", prod);
+			return ret;
+		}
+	}
+
 	ret = rte_event_dev_start(opt->dev_id);
 	if (ret) {
 		evt_err("failed to start eventdev %d", opt->dev_id);
 		return ret;
 	}
 
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_event_eth_rx_adapter_start(prod);
+		if (ret) {
+			evt_err("Rx adapter[%d] start failed", prod);
+			return ret;
+		}
+
+		ret = rte_event_eth_tx_adapter_start(prod);
+		if (ret) {
+			evt_err("Tx adapter[%d] start failed", prod);
+			return ret;
+		}
+	}
+
+	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
+			RTE_MAX_ETHPORTS);
+
 	return 0;
 }
 
diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c
index 832ab8b6e..752b5fded 100644
--- a/app/test-eventdev/test_pipeline_common.c
+++ b/app/test-eventdev/test_pipeline_common.c
@@ -5,58 +5,6 @@
 
 #include "test_pipeline_common.h"
 
-static int32_t
-pipeline_event_tx_burst_service_func(void *args)
-{
-
-	int i;
-	struct tx_service_data *tx = args;
-	const uint8_t dev = tx->dev_id;
-	const uint8_t port = tx->port_id;
-	struct rte_event ev[BURST_SIZE + 1];
-
-	uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev, BURST_SIZE, 0);
-
-	if (!nb_rx) {
-		for (i = 0; i < tx->nb_ethports; i++)
-			rte_eth_tx_buffer_flush(i, 0, tx->tx_buf[i]);
-		return 0;
-	}
-
-	for (i = 0; i < nb_rx; i++) {
-		struct rte_mbuf *m = ev[i].mbuf;
-		rte_eth_tx_buffer(m->port, 0, tx->tx_buf[m->port], m);
-	}
-	tx->processed_pkts += nb_rx;
-
-	return 0;
-}
-
-static int32_t
-pipeline_event_tx_service_func(void *args)
-{
-
-	int i;
-	struct tx_service_data *tx = args;
-	const uint8_t dev = tx->dev_id;
-	const uint8_t port = tx->port_id;
-	struct rte_event ev;
-
-	uint16_t nb_rx = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
-
-	if (!nb_rx) {
-		for (i = 0; i < tx->nb_ethports; i++)
-			rte_eth_tx_buffer_flush(i, 0, tx->tx_buf[i]);
-		return 0;
-	}
-
-	struct rte_mbuf *m = ev.mbuf;
-	rte_eth_tx_buffer(m->port, 0, tx->tx_buf[m->port], m);
-	tx->processed_pkts++;
-
-	return 0;
-}
-
 int
 pipeline_test_result(struct evt_test *test, struct evt_options *opt)
 {
@@ -97,11 +45,8 @@ processed_pkts(struct test_pipeline *t)
 	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;
+	for (i = 0; i < t->nb_workers; i++)
+		total += t->worker[i].processed_pkts;
 
 	return total;
 }
@@ -215,7 +160,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 {
 	uint16_t i;
 	uint8_t nb_queues = 1;
-	uint8_t mt_state = 0;
 	struct test_pipeline *t = evt_test_priv(test);
 	struct rte_eth_rxconf rx_conf;
 	struct rte_eth_conf port_conf = {
@@ -238,13 +182,17 @@ pipeline_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;
+
+		rte_event_eth_tx_adapter_caps_get(opt->dev_id, i, &caps);
+		if (!(caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT))
+			t->internal_port = 0;
 
 		rte_eth_dev_info_get(i, &dev_info);
-		mt_state = !(dev_info.tx_offload_capa &
-				DEV_TX_OFFLOAD_MT_LOCKFREE);
 		rx_conf = dev_info.default_rxconf;
 		rx_conf.offloads = port_conf.rxmode.offloads;
 
@@ -279,11 +227,6 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt)
 			return -EINVAL;
 		}
 
-		t->mt_unsafe |= mt_state;
-		t->tx_service.tx_buf[i] =
-			rte_malloc(NULL, RTE_ETH_TX_BUFFER_SIZE(BURST_SIZE), 0);
-		if (t->tx_service.tx_buf[i] == NULL)
-			rte_panic("Unable to allocate Tx buffer memory.");
 		rte_eth_promiscuous_enable(i);
 	}
 
@@ -295,7 +238,6 @@ 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 i;
 	int ret;
 	uint8_t port;
 	struct test_pipeline *t = evt_test_priv(test);
@@ -316,23 +258,15 @@ pipeline_event_port_setup(struct evt_test *test, struct evt_options *opt,
 			return ret;
 		}
 
-		if (queue_arr == NULL) {
-			if (rte_event_port_link(opt->dev_id, port, NULL, NULL,
-						0) != nb_queues)
-				goto link_fail;
-		} else {
-			for (i = 0; i < nb_queues; i++) {
-				if (rte_event_port_link(opt->dev_id, port,
-						&queue_arr[i], NULL, 1) != 1)
-					goto link_fail;
-			}
-		}
+		if (rte_event_port_link(opt->dev_id, port, queue_arr, NULL,
+					nb_queues) != nb_queues)
+			goto link_fail;
 	}
 
 	return 0;
 
 link_fail:
-	evt_err("failed to link all queues to port %d", port);
+	evt_err("failed to link queues to port %d", port);
 	return -EINVAL;
 }
 
@@ -385,79 +319,64 @@ pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 			}
 		}
 
-		ret = rte_eth_dev_start(prod);
-		if (ret) {
-			evt_err("Ethernet dev [%d] failed to start."
-					" Using synthetic producer", prod);
-			return ret;
-		}
-
-		ret = rte_event_eth_rx_adapter_start(prod);
-		if (ret) {
-			evt_err("Rx adapter[%d] start failed", prod);
-			return ret;
-		}
-		evt_info("Port[%d] using Rx adapter[%d] started", prod, prod);
+		evt_info("Port[%d] using Rx adapter[%d] configured", prod,
+				prod);
 	}
 
 	return ret;
 }
 
 int
-pipeline_event_tx_service_setup(struct evt_test *test, struct evt_options *opt,
-		uint8_t tx_queue_id, uint8_t tx_port_id,
-		const struct rte_event_port_conf p_conf)
+pipeline_event_tx_adapter_setup(struct evt_options *opt,
+		struct rte_event_port_conf port_conf)
 {
 	int ret;
-	struct rte_service_spec serv;
-	struct test_pipeline *t = evt_test_priv(test);
-	struct tx_service_data *tx = &t->tx_service;
+	uint16_t consm;
 
-	ret = rte_event_port_setup(opt->dev_id, tx_port_id, &p_conf);
-	if (ret) {
-		evt_err("failed to setup port %d", tx_port_id);
-		return ret;
-	}
+	RTE_ETH_FOREACH_DEV(consm) {
+		uint32_t cap;
 
-	if (rte_event_port_link(opt->dev_id, tx_port_id, &tx_queue_id,
-				NULL, 1) != 1) {
-		evt_err("failed to link queues to port %d", tx_port_id);
-		return -EINVAL;
-	}
+		ret = rte_event_eth_tx_adapter_caps_get(opt->dev_id,
+				consm, &cap);
+		if (ret) {
+			evt_err("failed to get event tx adapter[%d] caps",
+					consm);
+			return ret;
+		}
 
-	tx->dev_id = opt->dev_id;
-	tx->queue_id = tx_queue_id;
-	tx->port_id = tx_port_id;
-	tx->nb_ethports = rte_eth_dev_count_avail();
-	tx->t = t;
-
-	/* Register Tx service */
-	memset(&serv, 0, sizeof(struct rte_service_spec));
-	snprintf(serv.name, sizeof(serv.name), "Tx_service");
-
-	if (evt_has_burst_mode(opt->dev_id))
-		serv.callback = pipeline_event_tx_burst_service_func;
-	else
-		serv.callback = pipeline_event_tx_service_func;
-
-	serv.callback_userdata = (void *)tx;
-	ret = rte_service_component_register(&serv, &tx->service_id);
-	if (ret) {
-		evt_err("failed to register Tx service");
-		return ret;
-	}
+		ret = rte_event_eth_tx_adapter_create(consm, opt->dev_id,
+				&port_conf);
+		if (ret) {
+			evt_err("failed to create tx adapter[%d]", consm);
+			return ret;
+		}
 
-	ret = evt_service_setup(tx->service_id);
-	if (ret) {
-		evt_err("Failed to setup service core for Tx service\n");
-		return ret;
-	}
+		ret = rte_event_eth_tx_adapter_queue_add(consm, consm, -1);
+		if (ret) {
+			evt_err("failed to add tx queues to adapter[%d]",
+					consm);
+			return ret;
+		}
 
-	rte_service_runstate_set(tx->service_id, 1);
+		if (!(cap & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT)) {
+			uint32_t service_id;
 
-	return 0;
-}
+			rte_event_eth_tx_adapter_service_id_get(consm,
+					&service_id);
+			ret = evt_service_setup(service_id);
+			if (ret) {
+				evt_err("Failed to setup service core"
+						" for Tx adapter\n");
+				return ret;
+			}
+		}
+
+		evt_info("Port[%d] using Tx adapter[%d] Configured", consm,
+				consm);
+	}
 
+	return ret;
+}
 
 void
 pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
@@ -465,16 +384,10 @@ pipeline_ethdev_destroy(struct evt_test *test, struct evt_options *opt)
 	uint16_t i;
 	RTE_SET_USED(test);
 	RTE_SET_USED(opt);
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe) {
-		rte_service_component_runstate_set(t->tx_service.service_id, 0);
-		rte_service_runstate_set(t->tx_service.service_id, 0);
-		rte_service_component_unregister(t->tx_service.service_id);
-	}
 
 	RTE_ETH_FOREACH_DEV(i) {
 		rte_event_eth_rx_adapter_stop(i);
+		rte_event_eth_tx_adapter_stop(i);
 		rte_eth_dev_stop(i);
 	}
 }
@@ -484,7 +397,6 @@ pipeline_eventdev_destroy(struct evt_test *test, struct evt_options *opt)
 {
 	RTE_SET_USED(test);
 
-	rte_event_dev_stop(opt->dev_id);
 	rte_event_dev_close(opt->dev_id);
 }
 
diff --git a/app/test-eventdev/test_pipeline_common.h b/app/test-eventdev/test_pipeline_common.h
index 9cd6b905b..0440b9e29 100644
--- a/app/test-eventdev/test_pipeline_common.h
+++ b/app/test-eventdev/test_pipeline_common.h
@@ -14,6 +14,7 @@
 #include <rte_ethdev.h>
 #include <rte_eventdev.h>
 #include <rte_event_eth_rx_adapter.h>
+#include <rte_event_eth_tx_adapter.h>
 #include <rte_lcore.h>
 #include <rte_malloc.h>
 #include <rte_mempool.h>
@@ -35,30 +36,19 @@ struct worker_data {
 	struct test_pipeline *t;
 } __rte_cache_aligned;
 
-struct tx_service_data {
-	uint8_t dev_id;
-	uint8_t queue_id;
-	uint8_t port_id;
-	uint32_t service_id;
-	uint64_t processed_pkts;
-	uint16_t nb_ethports;
-	struct rte_eth_dev_tx_buffer *tx_buf[RTE_MAX_ETHPORTS];
-	struct test_pipeline *t;
-} __rte_cache_aligned;
-
 struct test_pipeline {
 	/* Don't change the offset of "done". Signal handler use this memory
 	 * to terminate all lcores work.
 	 */
 	int done;
 	uint8_t nb_workers;
-	uint8_t mt_unsafe;
+	uint8_t internal_port;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
 	enum evt_test_result result;
 	uint32_t nb_flows;
 	uint64_t outstand_pkts;
 	struct rte_mempool *pool;
 	struct worker_data worker[EVT_MAX_PORTS];
-	struct tx_service_data tx_service;
 	struct evt_options *opt;
 	uint8_t sched_type_list[EVT_MAX_STAGES] __rte_cache_aligned;
 } __rte_cache_aligned;
@@ -70,7 +60,7 @@ struct test_pipeline {
 	struct test_pipeline *t = w->t;   \
 	const uint8_t dev = w->dev_id;    \
 	const uint8_t port = w->port_id;  \
-	struct rte_event ev
+	struct rte_event ev __rte_cache_aligned
 
 #define PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT \
 	int i;                                  \
@@ -78,7 +68,7 @@ struct test_pipeline {
 	struct test_pipeline *t = w->t;         \
 	const uint8_t dev = w->dev_id;          \
 	const uint8_t port = w->port_id;        \
-	struct rte_event ev[BURST_SIZE + 1]
+	struct rte_event ev[BURST_SIZE + 1] __rte_cache_aligned
 
 #define PIPELINE_WORKER_MULTI_STAGE_INIT                         \
 	struct worker_data *w  = arg;                            \
@@ -88,10 +78,11 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;                         \
 	const uint8_t last_queue = t->opt->nb_stages - 1;        \
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
-	struct rte_event ev
+	const uint8_t nb_stages = t->opt->nb_stages + 1;	 \
+	struct rte_event ev __rte_cache_aligned
 
 #define PIPELINE_WORKER_MULTI_STAGE_BURST_INIT                   \
-	int i;                                  \
+	int i;                                                   \
 	struct worker_data *w  = arg;                            \
 	struct test_pipeline *t = w->t;                          \
 	uint8_t cq_id;                                           \
@@ -99,7 +90,8 @@ struct test_pipeline {
 	const uint8_t port = w->port_id;                         \
 	const uint8_t last_queue = t->opt->nb_stages - 1;        \
 	uint8_t *const sched_type_list = &t->sched_type_list[0]; \
-	struct rte_event ev[BURST_SIZE + 1]
+	const uint8_t nb_stages = t->opt->nb_stages + 1;	 \
+	struct rte_event ev[BURST_SIZE + 1] __rte_cache_aligned
 
 static __rte_always_inline void
 pipeline_fwd_event(struct rte_event *ev, uint8_t sched)
@@ -109,6 +101,28 @@ pipeline_fwd_event(struct rte_event *ev, uint8_t sched)
 	ev->sched_type = sched;
 }
 
+static __rte_always_inline void
+pipeline_event_tx(const uint8_t dev, const uint8_t port,
+		struct rte_event * const ev)
+{
+	rte_event_eth_tx_adapter_txq_set(ev->mbuf, 0);
+	while (!rte_event_eth_tx_adapter_enqueue(dev, port, ev, 1))
+		rte_pause();
+}
+
+static __rte_always_inline void
+pipeline_event_tx_burst(const uint8_t dev, const uint8_t port,
+		struct rte_event *ev, const uint16_t nb_rx)
+{
+	uint16_t enq;
+
+	enq = rte_event_eth_tx_adapter_enqueue(dev, port, ev, nb_rx);
+	while (enq < nb_rx) {
+		enq += rte_event_eth_tx_adapter_enqueue(dev, port,
+				ev + enq, nb_rx - enq);
+	}
+}
+
 static __rte_always_inline void
 pipeline_event_enqueue(const uint8_t dev, const uint8_t port,
 		struct rte_event *ev)
@@ -130,13 +144,6 @@ pipeline_event_enqueue_burst(const uint8_t dev, const uint8_t port,
 	}
 }
 
-static __rte_always_inline void
-pipeline_tx_pkt(struct rte_mbuf *mbuf)
-{
-	while (rte_eth_tx_burst(mbuf->port, 0, &mbuf, 1) != 1)
-		rte_pause();
-}
-
 static inline int
 pipeline_nb_event_ports(struct evt_options *opt)
 {
@@ -149,9 +156,8 @@ int pipeline_test_setup(struct evt_test *test, struct evt_options *opt);
 int pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt);
 int pipeline_event_rx_adapter_setup(struct evt_options *opt, uint8_t stride,
 		struct rte_event_port_conf prod_conf);
-int pipeline_event_tx_service_setup(struct evt_test *test,
-		struct evt_options *opt, uint8_t tx_queue_id,
-		uint8_t tx_port_id, const struct rte_event_port_conf p_conf);
+int pipeline_event_tx_adapter_setup(struct evt_options *opt,
+		struct rte_event_port_conf prod_conf);
 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,
diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c
index 2e0d93d99..25217008c 100644
--- a/app/test-eventdev/test_pipeline_queue.c
+++ b/app/test-eventdev/test_pipeline_queue.c
@@ -15,7 +15,7 @@ pipeline_queue_nb_event_queues(struct evt_options *opt)
 	return (eth_count * opt->nb_stages) + eth_count;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
@@ -29,7 +29,7 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 		}
 
 		if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-			pipeline_tx_pkt(ev.mbuf);
+			pipeline_event_tx(dev, port, &ev);
 			w->processed_pkts++;
 		} else {
 			ev.queue_id++;
@@ -41,11 +41,11 @@ pipeline_queue_worker_single_stage_tx(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -55,7 +55,8 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 			continue;
 		}
 
-		ev.queue_id = tx_queue;
+		ev.queue_id = tx_queue[ev.mbuf->port];
+		rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
 		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
 		w->processed_pkts++;
@@ -64,7 +65,7 @@ pipeline_queue_worker_single_stage_fwd(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
@@ -81,8 +82,7 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
 			if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev[i].mbuf);
+				pipeline_event_tx(dev, port, &ev[i]);
 				ev[i].op = RTE_EVENT_OP_RELEASE;
 				w->processed_pkts++;
 			} else {
@@ -98,11 +98,11 @@ pipeline_queue_worker_single_stage_burst_tx(void *arg)
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_SINGLE_STAGE_BURST_INIT;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -115,23 +115,24 @@ pipeline_queue_worker_single_stage_burst_fwd(void *arg)
 
 		for (i = 0; i < nb_rx; i++) {
 			rte_prefetch0(ev[i + 1].mbuf);
-			ev[i].queue_id = tx_queue;
+			ev[i].queue_id = tx_queue[ev[i].mbuf->port];
+			rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
-			w->processed_pkts++;
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+		w->processed_pkts += nb_rx;
 	}
 
 	return 0;
 }
 
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -143,31 +144,27 @@ pipeline_queue_worker_multi_stage_tx(void *arg)
 
 		cq_id = ev.queue_id % nb_stages;
 
-		if (cq_id >= last_queue) {
-			if (ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-				pipeline_tx_pkt(ev.mbuf);
-				w->processed_pkts++;
-				continue;
-			}
-			ev.queue_id += (cq_id == last_queue) ? 1 : 0;
-			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
-		} else {
-			ev.queue_id++;
-			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
+		if (ev.queue_id == tx_queue[ev.mbuf->port]) {
+			pipeline_event_tx(dev, port, &ev);
+			w->processed_pkts++;
+			continue;
 		}
 
+		ev.queue_id++;
+		pipeline_fwd_event(&ev, cq_id != last_queue ?
+				sched_type_list[cq_id] :
+				RTE_SCHED_TYPE_ATOMIC);
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
@@ -180,7 +177,8 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 		cq_id = ev.queue_id % nb_stages;
 
 		if (cq_id == last_queue) {
-			ev.queue_id = tx_queue;
+			ev.queue_id = tx_queue[ev.mbuf->port];
+			rte_event_eth_tx_adapter_txq_set(ev.mbuf, 0);
 			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
 			w->processed_pkts++;
 		} else {
@@ -190,14 +188,15 @@ pipeline_queue_worker_multi_stage_fwd(void *arg)
 
 		pipeline_event_enqueue(dev, port, &ev);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -212,37 +211,30 @@ pipeline_queue_worker_multi_stage_burst_tx(void *arg)
 			rte_prefetch0(ev[i + 1].mbuf);
 			cq_id = ev[i].queue_id % nb_stages;
 
-			if (cq_id >= last_queue) {
-				if (ev[i].sched_type == RTE_SCHED_TYPE_ATOMIC) {
-
-					pipeline_tx_pkt(ev[i].mbuf);
-					ev[i].op = RTE_EVENT_OP_RELEASE;
-					w->processed_pkts++;
-					continue;
-				}
-
-				ev[i].queue_id += (cq_id == last_queue) ? 1 : 0;
-				pipeline_fwd_event(&ev[i],
-						RTE_SCHED_TYPE_ATOMIC);
-			} else {
-				ev[i].queue_id++;
-				pipeline_fwd_event(&ev[i],
-						sched_type_list[cq_id]);
+			if (ev[i].queue_id == tx_queue[ev[i].mbuf->port]) {
+				pipeline_event_tx(dev, port, &ev[i]);
+				ev[i].op = RTE_EVENT_OP_RELEASE;
+				w->processed_pkts++;
+				continue;
 			}
 
+			ev[i].queue_id++;
+			pipeline_fwd_event(&ev[i], cq_id != last_queue ?
+					sched_type_list[cq_id] :
+					RTE_SCHED_TYPE_ATOMIC);
 		}
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
-static int
+static __rte_noinline int
 pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 {
 	PIPELINE_WORKER_MULTI_STAGE_BURST_INIT;
-	const uint8_t nb_stages = t->opt->nb_stages + 1;
-	const uint8_t tx_queue = t->tx_service.queue_id;
+	const uint8_t *tx_queue = t->tx_evqueue_id;
 
 	while (t->done == false) {
 		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
@@ -258,7 +250,8 @@ pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 			cq_id = ev[i].queue_id % nb_stages;
 
 			if (cq_id == last_queue) {
-				ev[i].queue_id = tx_queue;
+				ev[i].queue_id = tx_queue[ev[i].mbuf->port];
+				rte_event_eth_tx_adapter_txq_set(ev[i].mbuf, 0);
 				pipeline_fwd_event(&ev[i],
 						RTE_SCHED_TYPE_ATOMIC);
 				w->processed_pkts++;
@@ -271,6 +264,7 @@ pipeline_queue_worker_multi_stage_burst_fwd(void *arg)
 
 		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
 	}
+
 	return 0;
 }
 
@@ -280,28 +274,28 @@ worker_wrapper(void *arg)
 	struct worker_data *w  = arg;
 	struct evt_options *opt = w->t->opt;
 	const bool burst = evt_has_burst_mode(w->dev_id);
-	const bool mt_safe = !w->t->mt_unsafe;
+	const bool internal_port = w->t->internal_port;
 	const uint8_t nb_stages = opt->nb_stages;
 	RTE_SET_USED(opt);
 
 	if (nb_stages == 1) {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_queue_worker_single_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_queue_worker_single_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_queue_worker_single_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_queue_worker_single_stage_burst_fwd(
 					arg);
 	} else {
-		if (!burst && mt_safe)
+		if (!burst && internal_port)
 			return pipeline_queue_worker_multi_stage_tx(arg);
-		else if (!burst && !mt_safe)
+		else if (!burst && !internal_port)
 			return pipeline_queue_worker_multi_stage_fwd(arg);
-		else if (burst && mt_safe)
+		else if (burst && internal_port)
 			return pipeline_queue_worker_multi_stage_burst_tx(arg);
-		else if (burst && !mt_safe)
+		else if (burst && !internal_port)
 			return pipeline_queue_worker_multi_stage_burst_fwd(arg);
 
 	}
@@ -311,10 +305,6 @@ worker_wrapper(void *arg)
 static int
 pipeline_queue_launch_lcores(struct evt_test *test, struct evt_options *opt)
 {
-	struct test_pipeline *t = evt_test_priv(test);
-
-	if (t->mt_unsafe)
-		rte_service_component_runstate_set(t->tx_service.service_id, 1);
 	return pipeline_launch_lcores(test, opt, worker_wrapper);
 }
 
@@ -326,25 +316,24 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	int nb_queues;
 	int nb_stages = opt->nb_stages;
 	uint8_t queue;
-	struct rte_event_dev_info info;
-	struct test_pipeline *t = evt_test_priv(test);
-	uint8_t tx_evqueue_id = 0;
+	uint8_t tx_evport_id = 0;
+	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS];
 	uint8_t queue_arr[RTE_EVENT_MAX_QUEUES_PER_DEV];
 	uint8_t nb_worker_queues = 0;
+	uint16_t prod = 0;
+	struct rte_event_dev_info info;
+	struct test_pipeline *t = evt_test_priv(test);
 
 	nb_ports = evt_nr_active_lcores(opt->wlcores);
 	nb_queues = rte_eth_dev_count_avail() * (nb_stages);
 
-	/* Extra port for Tx service. */
-	if (t->mt_unsafe) {
-		tx_evqueue_id = nb_queues;
-		nb_ports++;
-		nb_queues++;
-	} else
-		nb_queues += rte_eth_dev_count_avail();
+	/* One queue for Tx adapter per port */
+	nb_queues += rte_eth_dev_count_avail();
 
-	rte_event_dev_info_get(opt->dev_id, &info);
+	memset(tx_evqueue_id, 0, sizeof(uint8_t) * RTE_MAX_ETHPORTS);
+	memset(queue_arr, 0, sizeof(uint8_t) * RTE_EVENT_MAX_QUEUES_PER_DEV);
 
+	rte_event_dev_info_get(opt->dev_id, &info);
 	const struct rte_event_dev_config config = {
 			.nb_event_queues = nb_queues,
 			.nb_event_ports = nb_ports,
@@ -370,24 +359,19 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	for (queue = 0; queue < nb_queues; queue++) {
 		uint8_t slot;
 
-		if (!t->mt_unsafe) {
-			slot = queue % (nb_stages + 1);
-			q_conf.schedule_type = slot == nb_stages ?
-				RTE_SCHED_TYPE_ATOMIC :
-				opt->sched_type_list[slot];
-		} else {
-			slot = queue % nb_stages;
-
-			if (queue == tx_evqueue_id) {
-				q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
+		q_conf.event_queue_cfg = 0;
+		slot = queue % (nb_stages + 1);
+		if (slot == nb_stages) {
+			q_conf.schedule_type = RTE_SCHED_TYPE_ATOMIC;
+			if (!t->internal_port) {
 				q_conf.event_queue_cfg =
 					RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
-			} else {
-				q_conf.schedule_type =
-					opt->sched_type_list[slot];
-				queue_arr[nb_worker_queues] = queue;
-				nb_worker_queues++;
 			}
+			tx_evqueue_id[prod++] = queue;
+		} else {
+			q_conf.schedule_type = opt->sched_type_list[slot];
+			queue_arr[nb_worker_queues] = queue;
+			nb_worker_queues++;
 		}
 
 		ret = rte_event_queue_setup(opt->dev_id, queue, &q_conf);
@@ -407,19 +391,11 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 			.new_event_threshold = info.max_num_events,
 	};
 
-	/*
-	 * If tx is multi thread safe then allow workers to do Tx else use Tx
-	 * service to Tx packets.
-	 */
-	if (t->mt_unsafe) {
+	if (!t->internal_port) {
 		ret = pipeline_event_port_setup(test, opt, queue_arr,
 				nb_worker_queues, p_conf);
 		if (ret)
 			return ret;
-
-		ret = pipeline_event_tx_service_setup(test, opt, tx_evqueue_id,
-				nb_ports - 1, p_conf);
-
 	} else
 		ret = pipeline_event_port_setup(test, opt, NULL, nb_queues,
 				p_conf);
@@ -431,7 +407,6 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *
 	 * eth_dev_count = 2, nb_stages = 2.
 	 *
-	 * Multi thread safe :
 	 *	queues = 6
 	 *	stride = 3
 	 *
@@ -439,21 +414,14 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 	 *	eth0 -> q0 -> q1 -> (q2->tx)
 	 *	eth1 -> q3 -> q4 -> (q5->tx)
 	 *
-	 *	q2, q5 configured as ATOMIC
-	 *
-	 * Multi thread unsafe :
-	 *	queues = 5
-	 *	stride = 2
-	 *
-	 *	event queue pipelines:
-	 *	eth0 -> q0 -> q1
-	 *			} (q4->tx) Tx service
-	 *	eth1 -> q2 -> q3
+	 *	q2, q5 configured as ATOMIC | SINGLE_LINK
 	 *
-	 *	q4 configured as SINGLE_LINK|ATOMIC
 	 */
-	ret = pipeline_event_rx_adapter_setup(opt,
-			t->mt_unsafe ? nb_stages : nb_stages + 1, p_conf);
+	ret = pipeline_event_rx_adapter_setup(opt, nb_stages + 1, p_conf);
+	if (ret)
+		return ret;
+
+	ret = pipeline_event_tx_adapter_setup(opt, p_conf);
 	if (ret)
 		return ret;
 
@@ -467,12 +435,60 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
 		}
 	}
 
+	/* Connect the tx_evqueue_id to the Tx adapter port */
+	if (!t->internal_port) {
+		RTE_ETH_FOREACH_DEV(prod) {
+			ret = rte_event_eth_tx_adapter_event_port_get(prod,
+					&tx_evport_id);
+			if (ret) {
+				evt_err("Unable to get Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+
+			if (rte_event_port_link(opt->dev_id, tx_evport_id,
+						&tx_evqueue_id[prod],
+						NULL, 1) != 1) {
+				evt_err("Unable to link Tx adptr[%d] evprt[%d]",
+						prod, tx_evport_id);
+				return ret;
+			}
+		}
+	}
+
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_eth_dev_start(prod);
+		if (ret) {
+			evt_err("Ethernet dev [%d] failed to start."
+					" Using synthetic producer", prod);
+			return ret;
+		}
+
+	}
+
 	ret = rte_event_dev_start(opt->dev_id);
 	if (ret) {
 		evt_err("failed to start eventdev %d", opt->dev_id);
 		return ret;
 	}
 
+	RTE_ETH_FOREACH_DEV(prod) {
+		ret = rte_event_eth_rx_adapter_start(prod);
+		if (ret) {
+			evt_err("Rx adapter[%d] start failed", prod);
+			return ret;
+		}
+
+		ret = rte_event_eth_tx_adapter_start(prod);
+		if (ret) {
+			evt_err("Tx adapter[%d] start failed", prod);
+			return ret;
+		}
+	}
+
+	memcpy(t->tx_evqueue_id, tx_evqueue_id, sizeof(uint8_t) *
+			RTE_MAX_ETHPORTS);
+
 	return 0;
 }
 
-- 
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev]  [PATCH v4 4/4] doc: update eventdev application guide
  2018-09-24  8:02 ` [dpdk-dev] [PATCH v4 " Pavan Nikhilesh
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
@ 2018-09-24  8:02   ` Pavan Nikhilesh
  2 siblings, 0 replies; 22+ messages in thread
From: Pavan Nikhilesh @ 2018-09-24  8:02 UTC (permalink / raw)
  To: jerin.jacob, nikhil.rao, anoob.joseph; +Cc: dev, Pavan Nikhilesh

Update eventdev application guide to reflect Tx adapter related changes.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
---
 .../eventdev_pipeline_atq_test_generic.svg    | 848 +++++++++++-------
 ...ntdev_pipeline_atq_test_internal_port.svg} |  26 +-
 .../eventdev_pipeline_queue_test_generic.svg  | 570 +++++++-----
 ...dev_pipeline_queue_test_internal_port.svg} |  22 +-
 doc/guides/tools/testeventdev.rst             |  44 +-
 5 files changed, 932 insertions(+), 578 deletions(-)
 rename doc/guides/tools/img/{eventdev_pipeline_atq_test_lockfree.svg => eventdev_pipeline_atq_test_internal_port.svg} (99%)
 rename doc/guides/tools/img/{eventdev_pipeline_queue_test_lockfree.svg => eventdev_pipeline_queue_test_internal_port.svg} (99%)

diff --git a/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg b/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
index e33367989..707b9b56b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_atq_test_generic.svg
@@ -20,7 +20,7 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
    sodipodi:docname="eventdev_pipeline_atq_test_generic.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
@@ -42,22 +42,6 @@
          d="M 5.77,0 -2.88,5 V -5 Z"
          id="path39725" />
     </marker>
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <marker
        inkscape:isstock="true"
        style="overflow:visible"
@@ -1430,9 +1414,9 @@
        x2="677.85718"
        y2="244.50504"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.78263355,0,0,0.98605918,90.06838,5.0013749)" />
+       gradientTransform="matrix(0.84881476,0,0,0.98593266,86.966576,5.0323108)" />
     <linearGradient
-       gradientTransform="matrix(0.78674479,0,0,1.0000825,87.83543,1.2279738)"
+       gradientTransform="matrix(0.85327366,0,0,0.99995418,84.544803,1.2593939)"
        inkscape:collect="always"
        xlink:href="#linearGradient6391"
        id="linearGradient2965"
@@ -1865,36 +1849,6 @@
        effect="spiro"
        id="path-effect14461-7-5-6"
        is_visible="true" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(454.68566,-41.755492)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5-6"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(373.71198,205.50594)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient3995-5-6-4"
-       x1="155.21329"
-       y1="231.61366"
-       x2="207.95523"
-       y2="231.61366"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(454.58517,69.679557)" />
     <inkscape:path-effect
        effect="bspline"
        id="path-effect2658-8"
@@ -2048,16 +2002,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3438"
-       id="linearGradient16362"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(2.283166,-2.283166)"
-       x1="534.06958"
-       y1="163.49922"
-       x2="580.73291"
-       y2="163.49922" />
     <marker
        inkscape:stockid="Arrow1Mend"
        orient="auto"
@@ -2293,25 +2237,80 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:isstock="true"
+       style="overflow:visible"
+       id="marker32613-8-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="TriangleOutM">
+      <path
+         inkscape:connector-curvature="0"
+         transform="scale(0.4)"
+         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         id="path32611-8-0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-4-4"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1"
+       id="TriangleOutM-5-2-3"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2"
+       id="path-effect5228-5-1-61"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2324,20 +2323,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-6"
+       id="TriangleOutM-5-2-3-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-8"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
+       id="path-effect5228-5-1-61-1"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2350,20 +2349,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-6-6"
+       id="TriangleOutM-5-2-3-9"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-8-6"
+         inkscape:connector-curvature="0"
+         id="path2123-3-9-20-4"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
+         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
+       id="path-effect5228-5-1-61-9"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2371,24 +2370,45 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(454.68566,-41.755492)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.08991,-43.80364)" />
     <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker32613-8-5"
-       refX="0"
-       refY="0"
+       inkscape:stockid="TriangleOutM"
        orient="auto"
-       inkscape:stockid="TriangleOutM">
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         transform="scale(0.4)"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         id="path35933-49-8-6-2-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         id="path32611-8-0" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-4-4"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2396,35 +2416,25 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient1920-1"
-       x1="475.00314"
-       y1="156.97769"
-       x2="515.13684"
-       y2="156.97769"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6515192,0,0,1.0041442,189.20967,67.917365)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3"
+       id="marker35935-1-6-5-1-0-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20"
+         id="path35933-49-8-6-2-3-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2432,25 +2442,45 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5-6"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(373.71198,205.50594)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-5-6-4"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(454.58517,69.679557)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3-0"
+       id="marker35935-1-6-5-1-0-06"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20-6"
+         id="path35933-49-8-6-2-3-1"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61-1"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2458,25 +2488,55 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.25651,68.385308)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,282.88878,12.631328)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient1760-3"
+       x1="405.34961"
+       y1="243.36557"
+       x2="651.55652"
+       y2="243.36557"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65213006,0,0,0.72134316,230.98899,64.590305)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="TriangleOutM-5-2-3-9"
+       id="marker35935-1-6-5"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         inkscape:connector-curvature="0"
-         id="path2123-3-9-20-4"
+         id="path35933-49-8-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#f78202;fill-opacity:1;fill-rule:evenodd;stroke:#f78202;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)" />
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-61-9"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2484,25 +2544,77 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-9"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-3"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="1.53467"
-     inkscape:cx="477.6217"
-     inkscape:cy="141.14731"
+     inkscape:zoom="2.200307"
+     inkscape:cx="336.61535"
+     inkscape:cy="145.77389"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -2530,12 +2642,12 @@
      transform="translate(-46.542857,-100.33361)"
      style="display:inline;opacity:1">
     <rect
-       style="fill:url(#linearGradient4519);fill-opacity:1;stroke:url(#linearGradient2965);stroke-width:0.87847757;stroke-opacity:1"
+       style="fill:url(#linearGradient4519);fill-opacity:1;stroke:url(#linearGradient2965);stroke-width:0.91480815;stroke-opacity:1"
        id="rect3697"
-       width="493.61813"
-       height="283.13986"
-       x="126.96397"
-       y="104.52792"
+       width="535.35956"
+       height="283.10355"
+       x="126.98213"
+       y="104.54609"
        rx="0"
        ry="0" />
     <text
@@ -2706,7 +2818,7 @@
          x="199.44385"
          y="188.49918"
          id="tspan5223-0-9"
-         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+1</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4"
@@ -2777,7 +2889,7 @@
          x="199.35846"
          y="244.55573"
          id="tspan5223-0-9-0"
-         style="font-size:10px;line-height:1.25">port n+3</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-2);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4-6"
@@ -2882,7 +2994,7 @@
          x="242.32845"
          y="123.36828"
          id="tspan5223-10"
-         style="font-size:10px;line-height:1.25">total queues = number of ethernet dev + 1</tspan></text>
+         style="font-size:10px;line-height:1.25">total queues = 2 * number of ethernet dev </tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
@@ -2957,9 +3069,109 @@
          x="285.26294"
          y="240.01315"
          style="stroke-width:0.68894428" /></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="259.86884"
+       y="164.78368"
+       id="text5219-2-3-7-2-1"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="259.86884"
+         y="164.78368"
+         id="tspan5223-0-6-5-9-5"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="259.86884"
+         y="174.78368"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9">Rx adptr 0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="260.25055"
+       y="217.84813"
+       id="text5219-2-3-7-2-1-4"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="217.84813"
+         id="tspan5223-0-6-5-9-5-4"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="227.84813"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9-4">Rx adptr 1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
+       x="260.25055"
+       y="271.71359"
+       id="text5219-2-3-7-2-1-47"
+       transform="scale(0.97663117,1.023928)"><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="271.71359"
+         id="tspan5223-0-6-5-9-5-6"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
+         sodipodi:role="line"
+         x="260.25055"
+         y="281.71359"
+         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
+         id="tspan883-1-9-3">Rx adptr q</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="595.27808"
+       y="136.64076"
+       id="text5219-2-4-3-3-4-54-8-8"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="595.27808"
+         y="139.22064"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-7" /></text>
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3)"
+       d="m 356.74765,186.83153 c 15.88009,-0.11696 31.75919,-0.23391 47.6373,-0.35085"
+       id="path5226-6-2-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61"
+       inkscape:original-d="m 356.74765,186.83153 c 15.88008,-0.11795 31.75918,-0.2349 47.6373,-0.35085"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-0)"
+       d="m 357.05625,242.97941 c 15.74231,0.0176 31.48469,0.0352 47.22712,0.0528"
+       id="path5226-6-2-5-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61-1"
+       inkscape:original-d="m 357.05625,242.97941 c 15.74231,0.0166 31.48469,0.0342 47.22712,0.0528"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89337438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.57349763, 0.89337441;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-9)"
+       d="m 356.67155,297.12049 c 15.97521,0.0733 31.94945,0.14663 47.92273,0.21994"
+       id="path5226-6-2-5-0"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-61-9"
+       inkscape:original-d="m 356.67155,297.12049 c 15.97521,0.0723 31.94945,0.14563 47.92273,0.21994"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="606.06958"
+       y="346.46628"
+       id="text5219-2-4-3-3-4-54-8-7"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="606.06958"
+         y="346.46628"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
     <g
+       style="display:inline;opacity:1"
        id="g20550"
-       transform="translate(25.709043,-190.70754)">
+       transform="translate(69.258261,-194.86398)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -2988,8 +3200,9 @@
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
     <g
+       style="display:inline;opacity:1"
        id="g13899"
-       transform="translate(-54.904385,-3.0966742)">
+       transform="translate(-12.211349,-3.253112)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3018,8 +3231,9 @@
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
     <g
+       style="display:inline;opacity:1"
        id="g13911"
-       transform="translate(-54.904385,-1.0966741)">
+       transform="translate(-10.498979,-2.682322)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3047,217 +3261,205 @@
            x="621.71729"
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="259.86884"
-       y="164.78368"
-       id="text5219-2-3-7-2-1"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="259.86884"
-         y="164.78368"
-         id="tspan5223-0-6-5-9-5"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="259.86884"
-         y="174.78368"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9">Rx adptr 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="260.25055"
-       y="217.84813"
-       id="text5219-2-3-7-2-1-4"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="217.84813"
-         id="tspan5223-0-6-5-9-5-4"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="227.84813"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9-4">Rx adptr 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:11.59418297px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.96618187"
-       x="260.25055"
-       y="271.71359"
-       id="text5219-2-3-7-2-1-47"
-       transform="scale(0.97663117,1.023928)"><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="271.71359"
-         id="tspan5223-0-6-5-9-5-6"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187">Event eth</tspan><tspan
-         sodipodi:role="line"
-         x="260.25055"
-         y="281.71359"
-         style="font-size:8px;line-height:1.25;stroke-width:0.96618187"
-         id="tspan883-1-9-3">Rx adptr q</tspan></text>
-    <g
-       id="g16360"
-       transform="matrix(1.0874414,0,0,0.99912695,-98.49816,-6.4077434)">
-      <ellipse
-         ry="24.258638"
-         rx="22.831659"
-         cy="161.21605"
-         cx="559.68445"
-         id="path8843"
-         style="fill:#ffffff;fill-opacity:0.98039216;stroke:url(#linearGradient16362);stroke-opacity:1" />
-      <text
-         transform="scale(0.92048084,1.0863887)"
-         id="text5219-2-4-3-3-4-5"
-         y="146.21904"
-         x="588.44147"
-         style="font-style:normal;font-weight:normal;font-size:11.04576969px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92048085"
-         xml:space="preserve"><tspan
-           id="tspan1265-5"
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="146.21904"
-           x="588.44147"
-           sodipodi:role="line">Tx Service</tspan><tspan
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="152.00201"
-           x="588.44147"
-           sodipodi:role="line"
-           id="tspan39139" /><tspan
-           style="font-size:7.97750044px;line-height:1.25;stroke-width:0.92048085"
-           y="156.19092"
-           x="588.44147"
-           sodipodi:role="line"
-           id="tspan39141">port n + 1</tspan></text>
-    </g>
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.22799993, 1.61399996;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker32613)"
-       d="m 511.70299,212.50867 c -0.1614,-10.49392 -0.32276,-20.98539 -0.48409,-31.47439"
-       id="path5226-6-2-1-2-4-5-1"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6"
-       inkscape:original-d="m 511.70299,212.50867 c -0.16039,-10.49394 -0.32175,-20.98541 -0.48409,-31.47439"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935)"
-       d="m 523.50111,175.62989 c 10.13298,2.21215 20.26379,4.42384 30.39241,6.63504"
-       id="path5226-6-2-1-2-4-5-1-5"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1"
-       inkscape:original-d="m 523.50111,175.62989 c 10.13323,2.21099 20.26404,4.42267 30.39241,6.63504"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-5)"
-       d="m 523.50111,175.62989 c 9.91161,22.53065 19.82206,45.05865 29.73129,67.58389"
-       id="path5226-6-2-1-2-4-5-1-5-6"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-7"
-       inkscape:original-d="m 523.50111,175.62989 c 9.91282,22.53012 19.82327,45.05812 29.73129,67.58389"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-5-5)"
-       d="m 523.50111,175.62989 c 10.16587,40.76181 20.3305,81.51868 30.49385,122.27042"
-       id="path5226-6-2-1-2-4-5-1-5-6-3"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-7-9"
-       inkscape:original-d="m 523.50111,175.62989 c 10.16704,40.76152 20.33167,81.51839 30.49385,122.27042"
-       sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.88;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.52, 0.88;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1)"
-       d="m 457.99431,185.46823 c 13.07561,8.94945 26.1492,17.89751 39.22072,26.84415"
-       id="path5226-6-2-1-2-4-5-1-5-0"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.75503534;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.02014133, 0.75503534;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5)"
+       d="m 459.25963,298.68538 c 12.4298,0.0326 24.85706,0.0653 37.28169,0.0979"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2"
-       inkscape:original-d="m 457.99431,185.46823 c 13.0764,8.9483 26.14999,17.89636 39.22072,26.84415"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
+       inkscape:original-d="m 459.25963,298.68538 c 12.4298,0.0316 24.85706,0.0643 37.28169,0.0979"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6)"
-       d="m 459.47717,245.71809 c 12.28232,-4.96638 24.56173,-9.93159 36.83817,-14.89559"
-       id="path5226-6-2-1-2-4-5-1-5-0-2"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77332252;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.09329006, 0.77332252;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1)"
+       d="m 458.61908,243.27181 c 12.91755,-0.0156 25.83246,-0.0312 38.74462,-0.0468"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9"
-       inkscape:original-d="m 459.47717,245.71809 c 12.28211,-4.96689 24.56152,-9.9321 36.83817,-14.89559"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       inkscape:original-d="m 458.61908,243.27181 c 12.91755,-0.0166 25.83246,-0.0322 38.74462,-0.0468"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-6)"
-       d="m 459.54824,301.10401 c 12.64219,-20.37548 25.28189,-40.74696 37.91905,-61.11434"
-       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77624762;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10499055, 0.77624764;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-9)"
+       d="m 457.5506,186.45733 c 12.95011,-0.0208 25.89755,-0.0415 38.84226,-0.0623"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-06"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
-       inkscape:original-d="M 459.54824,301.10401 C 472.1907,280.7287 484.8304,260.35722 497.46729,239.98967"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       inkscape:original-d="m 457.5506,186.45733 c 12.95011,-0.0218 25.89755,-0.0426 38.84226,-0.0623"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79"
+       width="72.081367"
+       height="32.405426"
+       x="499.14511"
+       y="170.31314"
+       rx="16.175425"
+       ry="16.202713" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="595.27808"
-       y="136.64076"
-       id="text5219-2-4-3-3-4-54-8-8"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="502.77109"
+       y="189.40137"
+       id="text5219-2-6-2"><tspan
          sodipodi:role="line"
-         x="595.27808"
-         y="139.22064"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-7" /></text>
+         x="502.77109"
+         y="189.40137"
+         id="tspan5223-0-9-02"
+         style="font-size:10px;line-height:1.25">port n+m+1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="514.66077"
+       y="225.14934"
+       id="text5219-2-3-7-2-1-8-3"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="514.66077"
+         y="225.14934"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6">Single link</tspan></text>
     <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-1);stroke-width:0.86395979;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3736-8-4-9"
-       width="25.451954"
-       height="24.448395"
-       x="499.03128"
-       y="213.32141" />
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1"
+       width="72.081367"
+       height="32.405426"
+       x="499.944"
+       y="226.74811"
+       rx="16.175425"
+       ry="16.202713" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="548.03668"
-       y="204.31348"
-       id="text5219-2-4-3-3-4-54-8"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="504.46329"
+       y="246.05832"
+       id="text5219-2-6-1-7"><tspan
          sodipodi:role="line"
-         x="548.03668"
-         y="204.31348"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6">Single </tspan><tspan
+         x="504.46329"
+         y="246.05832"
+         id="tspan5223-0-9-0-5"
+         style="font-size:10px;line-height:1.25">port n+m+2</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1-7"
+       width="72.081367"
+       height="32.405426"
+       x="499.31168"
+       y="282.50211"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="512.51819"
+       y="301.5791"
+       id="text5219-2-6-1-6-2"><tspan
          sodipodi:role="line"
-         x="548.03668"
-         y="213.27945"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan57836">Link Q</tspan></text>
+         x="512.51819"
+         y="301.5791"
+         id="tspan5223-0-9-0-4-2"
+         style="font-size:10px;line-height:1.25">port n+o</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3)"
-       d="m 356.74765,186.83153 c 15.88009,-0.11696 31.75919,-0.23391 47.6373,-0.35085"
-       id="path5226-6-2-5"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0)"
+       d="m 571.86582,186.42744 c 7.95108,0.0405 15.90052,0.0811 23.84823,0.12159"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61"
-       inkscape:original-d="m 356.74765,186.83153 c 15.88008,-0.11795 31.75918,-0.2349 47.6373,-0.35085"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       inkscape:original-d="m 571.86582,186.42744 c 7.95109,0.0395 15.90052,0.0801 23.84823,0.12159"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.6, 0.9;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-0)"
-       d="m 357.05625,242.97941 c 15.74231,0.0176 31.48469,0.0352 47.22712,0.0528"
-       id="path5226-6-2-5-5"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-0)"
+       d="m 572.74002,242.8173 c 7.86699,0.091 15.73233,0.18199 23.59597,0.27295"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-2"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61-1"
-       inkscape:original-d="m 357.05625,242.97941 c 15.74231,0.0166 31.48469,0.0342 47.22712,0.0528"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       inkscape:original-d="m 572.74002,242.8173 c 7.867,0.09 15.73234,0.18097 23.59597,0.27295"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:0.89337438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.57349763, 0.89337441;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-3-9)"
-       d="m 356.67155,297.12049 c 15.97521,0.0733 31.94945,0.14663 47.92273,0.21994"
-       id="path5226-6-2-5-0"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-06)"
+       d="m 571.86429,299.00558 c 8.49934,0.0508 16.99697,0.10162 25.49284,0.15242"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-5"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-61-9"
-       inkscape:original-d="m 356.67155,297.12049 c 15.97521,0.0723 31.94945,0.14563 47.92273,0.21994"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
+       inkscape:original-d="m 571.86429,299.00558 c 8.49935,0.0498 16.99698,0.10062 25.49284,0.15242"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760-3);stroke-width:0.67135191;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2896-6-7"
+       width="159.92059"
+       height="161.38417"
+       x="495.64883"
+       y="159.4483"
+       ry="4.080533"
+       rx="5.9213624"
+       inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
+       inkscape:export-xdpi="112"
+       inkscape:export-ydpi="112" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="606.06958"
-       y="346.46628"
-       id="text5219-2-4-3-3-4-54-8-7"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="515.76257"
+       y="175.4832"
+       id="text5219-2-3-7-2-1-8-3-5"
+       transform="scale(0.89243778,1.1205263)"><tspan
          sodipodi:role="line"
-         x="606.06958"
-         y="346.46628"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
+         x="515.76257"
+         y="175.4832"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-3">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="515.76501"
+       y="274.05133"
+       id="text5219-2-3-7-2-1-8-3-56"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="515.76501"
+         y="274.05133"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-2">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="546.92126"
+       y="155.57758"
+       id="text5219-2-4-2"><tspan
+         sodipodi:role="line"
+         x="546.92126"
+         y="155.57758"
+         id="tspan5223-0-7-70"
+         style="font-size:10px;line-height:1.25">Tx adapter</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="468.36612"
+       y="180.9222"
+       id="text5219-1-9-4-9-3"><tspan
+         sodipodi:role="line"
+         x="468.36612"
+         y="180.9222"
+         id="tspan5223-2-3-5-0-6"
+         style="font-size:10px;line-height:1.25">q3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="467.61584"
+       y="239.3683"
+       id="text5219-1-9-4-9-3-0"><tspan
+         sodipodi:role="line"
+         x="467.61584"
+         y="239.3683"
+         id="tspan5223-2-3-5-0-6-6"
+         style="font-size:10px;line-height:1.25">q4</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="468.70688"
+       y="294.45236"
+       id="text5219-1-9-4-9-3-2"><tspan
+         sodipodi:role="line"
+         x="468.70688"
+         y="294.45236"
+         id="tspan5223-2-3-5-0-6-61"
+         style="font-size:10px;line-height:1.25">q5</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg b/doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
similarity index 99%
rename from doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg
rename to doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
index d7f10de3e..f4393327b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_atq_test_lockfree.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_atq_test_internal_port.svg
@@ -20,8 +20,8 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="eventdev_pipeline_atq_test_lockfree.svg"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
+   sodipodi:docname="eventdev_pipeline_atq_test_internal_port.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
@@ -2612,17 +2612,17 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="1.7519532"
-     inkscape:cx="479.73438"
-     inkscape:cy="163.58755"
+     inkscape:zoom="2.0977641"
+     inkscape:cx="432.03729"
+     inkscape:cy="135.16016"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="0"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -3331,14 +3331,14 @@
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="602.09888"
+       x="604.28497"
        y="347.66293"
        id="text5219-2-4-3-3-4-54"
        transform="scale(0.91487885,1.0930409)"><tspan
          sodipodi:role="line"
-         x="602.09888"
+         x="604.28497"
          y="347.66293"
          style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4">(Tx Lock free)</tspan></text>
+         id="tspan1265-4">(Internal port)</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg b/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
index 732d48867..9fe743f3b 100644
--- a/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_queue_test_generic.svg
@@ -20,13 +20,21 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
    sodipodi:docname="eventdev_pipeline_queue_test_generic.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
   <defs
      id="defs3870">
+    <linearGradient
+       id="linearGradient6820"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#008080;stop-opacity:1;"
+         offset="0"
+         id="stop6818" />
+    </linearGradient>
     <linearGradient
        id="linearGradient6916"
        osb:paint="solid">
@@ -1312,7 +1320,7 @@
        x2="651.55652"
        y2="243.36557"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.76448972,0,0,0.86504892,-92.637138,19.716473)" />
+       gradientTransform="matrix(0.76448972,0,0,0.78486608,-92.637138,48.19976)" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#linearGradient3808"
@@ -2175,22 +2183,6 @@
        y2="232.36095"
        gradientUnits="userSpaceOnUse"
        gradientTransform="translate(17.692568,-46.20799)" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2"
@@ -2201,22 +2193,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49-8"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2-9"
@@ -2227,22 +2203,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <marker
-       inkscape:stockid="TriangleOutM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker35935-1-6-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path35933-49-8-6"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14e4;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
     <inkscape:path-effect
        effect="bspline"
        id="path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
@@ -2403,16 +2363,6 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3438"
-       id="linearGradient16362"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(2.283166,-2.283166)"
-       x1="534.06958"
-       y1="163.49922"
-       x2="580.73291"
-       y2="163.49922" />
     <marker
        inkscape:isstock="true"
        style="overflow:visible"
@@ -2488,16 +2438,6 @@
        effect="spiro"
        id="path-effect14461-7-5-1"
        is_visible="true" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3993"
-       id="linearGradient1924-3"
-       x1="597.00317"
-       y1="156.97769"
-       x2="637.13684"
-       y2="156.97769"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.78531244,0,0,1,50.143534,82.69878)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
@@ -2576,25 +2516,75 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-5"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-2"
+       id="marker35935-1-6-5"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-6"
+         id="path35933-49-8-6"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-6"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2607,20 +2597,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9"
+       id="marker35935-1-6-5-1"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5"
+         id="path35933-49-8-6-2"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2633,20 +2623,20 @@
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9-7"
+       id="marker35935-1-6-5-9"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5-1"
+         id="path35933-49-8-6-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2654,25 +2644,107 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,300.23326,-43.855196)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,301.03213,12.579775)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient3995-8-9-9"
+       x1="155.21329"
+       y1="231.61366"
+       x2="207.95523"
+       y2="231.61366"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3938205,0,0,0.9944124,300.39986,68.333755)" />
     <marker
        inkscape:stockid="TriangleOutM"
        orient="auto"
        refY="0"
        refX="0"
-       id="marker35935-1-9-72"
+       id="marker35935-1-6-5-1-0"
        style="overflow:visible"
        inkscape:isstock="true"
        inkscape:collect="always">
       <path
-         id="path35933-49-5-2"
+         id="path35933-49-8-6-2-3"
          d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#ac14ff;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
          transform="scale(0.4)"
          inkscape:connector-curvature="0" />
     </marker>
     <inkscape:path-effect
        effect="bspline"
-       id="path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0-0"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2-3-6"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       is_visible="true"
+       weight="33.333333"
+       steps="2"
+       helper_size="0"
+       apply_no_weight="true"
+       apply_with_weight="true"
+       only_selected="false" />
+    <marker
+       inkscape:stockid="TriangleOutM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker35935-1-6-5-1-0-06"
+       style="overflow:visible"
+       inkscape:isstock="true"
+       inkscape:collect="always">
+      <path
+         id="path35933-49-8-6-2-3-1"
+         d="M 5.77,0 -2.88,5 V -5 Z"
+         style="fill:#ac14db;fill-opacity:1;fill-rule:evenodd;stroke:#ac14ff;stroke-width:1.00000003pt;stroke-opacity:1"
+         transform="scale(0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <inkscape:path-effect
+       effect="bspline"
+       id="path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
        is_visible="true"
        weight="33.333333"
        steps="2"
@@ -2680,6 +2752,16 @@
        apply_no_weight="true"
        apply_with_weight="true"
        only_selected="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3993"
+       id="linearGradient1760-3"
+       x1="405.34961"
+       y1="243.36557"
+       x2="651.55652"
+       y2="243.36557"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.65213006,0,0,0.72134316,249.13234,64.538752)" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -2689,16 +2771,16 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="1.7519532"
-     inkscape:cx="423.24137"
-     inkscape:cy="157.27924"
+     inkscape:cx="265.48225"
+     inkscape:cy="64.618341"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -2762,13 +2844,13 @@
          id="tspan5223-0"
          style="font-size:10px;line-height:1.25">producer 0</tspan></text>
     <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760);stroke-width:0.7960096;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760);stroke-width:0.75822091;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect2896-6"
        width="187.47435"
-       height="193.53508"
+       height="175.59599"
        x="217.62262"
-       y="133.47206"
-       ry="4.8934555"
+       y="151.41115"
+       ry="4.4398727"
        rx="6.9415913"
        inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
        inkscape:export-xdpi="112"
@@ -2824,7 +2906,7 @@
          x="115.44385"
          y="186.49918"
          id="tspan5223-0-9"
-         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+1</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4"
@@ -2940,7 +3022,7 @@
          x="115.35846"
          y="242.55573"
          id="tspan5223-0-9-0"
-         style="font-size:10px;line-height:1.25">port n+3</tspan></text>
+         style="font-size:10px;line-height:1.25">port n+2</tspan></text>
     <rect
        style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1920-2);stroke-width:1.06814909;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
        id="rect3736-8-4-6"
@@ -3098,7 +3180,7 @@
          x="199.11482"
          y="111.36845"
          id="tspan5223-10"
-         style="font-size:9.02731705px;line-height:1.25;stroke-width:0.90273178">total queues = (number of stages * number of ethernet dev) + 1</tspan></text>
+         style="font-size:9.02731705px;line-height:1.25;stroke-width:0.90273178">total queues = (number of stages * number of ethernet dev) + number of ethernet dev</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:11.11939621px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92661637"
@@ -3243,33 +3325,33 @@
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="426.57141"
+       x="428.57141"
        y="167.14041"
        id="text5219-2-4"><tspan
          sodipodi:role="line"
-         x="426.57141"
+         x="428.57141"
          y="167.14041"
          id="tspan5223-0-7"
          style="font-size:10px;line-height:1.25">worker 0</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="428.30768"
+       x="430.30768"
        y="223.46143"
        id="text5219-2-4-3"><tspan
          sodipodi:role="line"
-         x="428.30768"
+         x="430.30768"
          y="223.46143"
          id="tspan5223-0-7-7"
          style="font-size:10px;line-height:1.25">worker 1</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
-       x="426.30768"
+       x="428.30768"
        y="279.46143"
        id="text5219-2-4-3-4-2"><tspan
          sodipodi:role="line"
-         x="426.30768"
+         x="428.30768"
          y="279.46143"
          id="tspan5223-0-7-7-5-5"
          style="font-size:10px;line-height:1.25">worker n</tspan></text>
@@ -3309,7 +3391,7 @@
     <g
        style="display:inline;opacity:1"
        id="g20550"
-       transform="translate(65.401608,-190.91553)">
+       transform="translate(87.401608,-194.91553)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3340,7 +3422,7 @@
     <g
        style="display:inline;opacity:1"
        id="g13899"
-       transform="translate(-17.21182,-3.304662)">
+       transform="translate(5.9319927,-3.304662)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3371,7 +3453,7 @@
     <g
        style="display:inline;opacity:1"
        id="g13911"
-       transform="translate(-15.21182,-1.304662)">
+       transform="translate(7.6443673,-2.7338705)">
       <rect
          ry="16.293755"
          rx="11.6051"
@@ -3399,83 +3481,6 @@
            x="621.71729"
            sodipodi:role="line">    Txq 0</tspan></text>
     </g>
-    <g
-       style="display:inline;opacity:1"
-       id="g16360"
-       transform="matrix(1.0983058,0,0,1.0572541,-82.192809,-6.5664741)">
-      <ellipse
-         ry="24.258638"
-         rx="22.831659"
-         cy="161.21605"
-         cx="559.68445"
-         id="path8843"
-         style="fill:#ffffff;fill-opacity:0.98039216;stroke:url(#linearGradient16362);stroke-opacity:1" />
-      <text
-         transform="scale(0.94727182,1.0556632)"
-         id="text5219-2-4-3-3-4-5"
-         y="151.93637"
-         x="571.61011"
-         style="font-style:normal;font-weight:normal;font-size:10.76524448px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.89710373"
-         xml:space="preserve"><tspan
-           id="tspan1265-5"
-           style="font-size:7.77489901px;line-height:1.25;stroke-width:0.89710373"
-           y="151.93637"
-           x="571.61011"
-           sodipodi:role="line">Tx Service</tspan><tspan
-           style="font-size:7.77489901px;line-height:1.25;stroke-width:0.89710373"
-           y="161.655"
-           x="571.61011"
-           sodipodi:role="line"
-           id="tspan40484">port n + 1</tspan></text>
-    </g>
-    <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1)"
-       d="m 475.41709,184.68945 c 14.66204,14.27312 29.32201,28.54422 43.97988,42.81328"
-       id="path5226-6-2-1-2-4-5-1-5-0"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2"
-       inkscape:original-d="m 475.41709,184.68945 c 14.66303,14.2721 29.323,28.54321 43.97988,42.81328"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6)"
-       d="m 476.32916,241.51456 c 13.86102,-0.34 27.7191,-0.67992 41.57417,-1.01977"
-       id="path5226-6-2-1-2-4-5-1-5-0-2"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9"
-       inkscape:original-d="m 476.32916,241.51456 c 13.861,-0.34097 27.71908,-0.6809 41.57417,-1.01977"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="display:inline;opacity:1;fill:#ac14e4;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-6)"
-       d="m 474.31327,298.61285 c 15.031,-15.59075 30.05891,-31.17831 45.0837,-46.76263"
-       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-4"
-       inkscape:original-d="m 474.31327,298.61285 c 15.03102,-15.59073 30.05893,-31.17829 45.0837,-46.76263"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="display:inline;opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient1924-3);stroke-width:0.94657081;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3736-8-0-1-7-7"
-       width="30.678661"
-       height="24.347494"
-       x="519.39697"
-       y="227.50273" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="571.69696"
-       y="217.79964"
-       id="text5219-2-4-3-3-4-54-8-7-5"
-       transform="scale(0.91487885,1.0930409)"><tspan
-         sodipodi:role="line"
-         x="571.69696"
-         y="217.79964"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2-3">Single</tspan><tspan
-         sodipodi:role="line"
-         x="571.69696"
-         y="226.76561"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan6344">Link Q</tspan></text>
     <path
        style="display:inline;opacity:1;fill:none;stroke:#f78202;stroke-width:1.01153409;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleOutM-5-2-6-6)"
        d="m 391.11413,240.54267 c 10.00574,0.0714 20.0096,0.14275 30.01154,0.21411"
@@ -3500,49 +3505,184 @@
        inkscape:path-effect="#path-effect5228-5-1-6-84-8"
        inkscape:original-d="m 389.52644,184.04076 c 10.2068,0.0715 20.41172,0.14408 30.61473,0.21761"
        sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
+       x="665.00641"
+       y="346.51425"
+       id="text5219-2-4-3-3-4-54-8-7"
+       transform="scale(0.91487885,1.0930409)"><tspan
+         sodipodi:role="line"
+         x="665.00641"
+         y="346.51425"
+         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
+         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-2)"
-       d="m 533.61005,227.17178 c -0.11895,-11.90475 -0.23788,-23.80683 -0.35678,-35.70623"
-       id="path5226-6-2-1-2-4-5-1-5-0-4"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77748054;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10992218, 0.77748055;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5)"
+       d="m 475.15346,298.63383 c 13.1798,0.0326 26.3569,0.0653 39.53121,0.0979"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-6"
-       inkscape:original-d="m 533.61005,227.17178 c -0.11794,-11.90476 -0.23687,-23.80684 -0.35678,-35.70623"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2"
+       inkscape:original-d="m 475.15346,298.63383 c 13.1798,0.0316 26.3569,0.0643 39.53121,0.0979"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9)"
-       d="m 554.18303,173.89676 c 12.12572,3.64515 24.2491,7.2896 36.37012,10.93334"
-       id="path5226-6-2-1-2-4-5-1-5-0-48"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77332252;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.09329006, 0.77332252;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1)"
+       d="m 476.76243,243.22025 c 12.91755,-0.0156 25.83246,-0.0312 38.74462,-0.0468"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0"
-       inkscape:original-d="m 554.18303,173.89676 c 12.12608,3.64396 24.24946,7.28841 36.37012,10.93334"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7"
+       inkscape:original-d="m 476.76243,243.22025 c 12.91755,-0.0166 25.83246,-0.0322 38.74462,-0.0468"
        sodipodi:nodetypes="cc" />
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9-7)"
-       d="m 554.18303,173.89676 c 12.8469,22.86455 25.6922,45.72625 38.53585,68.585"
-       id="path5226-6-2-1-2-4-5-1-5-0-48-2"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.77624762;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.10499055, 0.77624764;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-9)"
+       d="m 475.69395,186.40577 c 12.95011,-0.0208 25.89755,-0.0415 38.84226,-0.0623"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-06"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0-7"
-       inkscape:original-d="m 554.18303,173.89676 c 12.84809,22.86388 25.69339,45.72558 38.53585,68.585"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-6"
+       inkscape:original-d="m 475.69395,186.40577 c 12.95011,-0.0218 25.89755,-0.0426 38.84226,-0.0623"
        sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79"
+       width="72.081367"
+       height="32.405426"
+       x="517.28845"
+       y="170.26158"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="520.91443"
+       y="189.34982"
+       id="text5219-2-6-2"><tspan
+         sodipodi:role="line"
+         x="520.91443"
+         y="189.34982"
+         id="tspan5223-0-9-02"
+         style="font-size:10px;line-height:1.25">port n+m+1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="534.99072"
+       y="225.10315"
+       id="text5219-2-3-7-2-1-8-3"
+       transform="scale(0.89243779,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="534.99072"
+         y="225.10315"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6">Single link</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1"
+       width="72.081367"
+       height="32.405426"
+       x="518.08734"
+       y="226.69656"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="522.60663"
+       y="246.00677"
+       id="text5219-2-6-1-7"><tspan
+         sodipodi:role="line"
+         x="522.60663"
+         y="246.00677"
+         id="tspan5223-0-9-0-5"
+         style="font-size:10px;line-height:1.25">port n+m+2</tspan></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;stroke:url(#linearGradient3995-8-9-9);stroke-width:1.2090857;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect87-6-5-3-79-1-7"
+       width="72.081367"
+       height="32.405426"
+       x="517.45502"
+       y="282.45056"
+       rx="16.175425"
+       ry="16.202713" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="530.6615"
+       y="301.52756"
+       id="text5219-2-6-1-6-2"><tspan
+         sodipodi:role="line"
+         x="530.6615"
+         y="301.52756"
+         id="tspan5223-0-9-0-4-2"
+         style="font-size:10px;line-height:1.25">port n+o</tspan></text>
     <path
-       style="display:inline;opacity:1;fill:#ac14ff;fill-opacity:1;stroke:#ac14ff;stroke-width:0.80699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.228, 0.807;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-9-72)"
-       d="m 554.18303,173.89676 c 12.65661,41.60787 25.31164,83.21054 37.96507,124.80795"
-       id="path5226-6-2-1-2-4-5-1-5-0-48-1"
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0)"
+       d="m 590.00917,186.37588 c 7.95108,0.0405 15.90052,0.0811 23.84823,0.12159"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1"
        inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-0-6"
-       inkscape:original-d="m 554.18303,173.89676 c 12.65781,41.6075 25.31284,83.21018 37.96507,124.80795"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6"
+       inkscape:original-d="m 590.00917,186.37588 c 7.95109,0.0395 15.90052,0.0801 23.84823,0.12159"
        sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-0)"
+       d="m 590.88337,242.76574 c 7.86699,0.091 15.73233,0.18199 23.59597,0.27295"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-2"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-3"
+       inkscape:original-d="m 590.88337,242.76574 c 7.867,0.09 15.73234,0.18097 23.59597,0.27295"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="display:inline;opacity:1;fill:#ac14db;fill-opacity:1;stroke:#ac14ff;stroke-width:0.70236319;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2.80945275, 0.70236319;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker35935-1-6-5-1-0-06)"
+       d="m 590.00764,298.95403 c 8.49934,0.0508 16.99697,0.10162 25.49284,0.15242"
+       id="path5226-6-2-1-2-4-5-1-5-0-2-9-0-1-5"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect5228-5-1-6-2-9-4-6-1-2-9-2-7-6-5"
+       inkscape:original-d="m 590.00764,298.95403 c 8.49935,0.0498 16.99698,0.10062 25.49284,0.15242"
+       sodipodi:nodetypes="cc" />
+    <rect
+       style="display:inline;opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1760-3);stroke-width:0.67135191;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect2896-6-7"
+       width="159.92059"
+       height="161.38417"
+       x="513.79218"
+       y="159.39674"
+       ry="4.080533"
+       rx="5.9213624"
+       inkscape:export-filename="/home/matz/barracuda/rapports/mbuf-api-v2-images/octeon_multi.png"
+       inkscape:export-xdpi="112"
+       inkscape:export-ydpi="112" />
     <text
        xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:9.9315424px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.82762849"
-       x="665.00641"
-       y="346.51425"
-       id="text5219-2-4-3-3-4-54-8-7"
-       transform="scale(0.91487885,1.0930409)"><tspan
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="536.09253"
+       y="175.43703"
+       id="text5219-2-3-7-2-1-8-3-5"
+       transform="scale(0.89243778,1.1205263)"><tspan
          sodipodi:role="line"
-         x="665.00641"
-         y="346.51425"
-         style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4-6-2">(Tx Generic)</tspan></text>
+         x="536.09253"
+         y="175.43703"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-3">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.5946722px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.88288933"
+       x="533.85394"
+       y="274.00516"
+       id="text5219-2-3-7-2-1-8-3-56"
+       transform="scale(0.89243778,1.1205263)"><tspan
+         sodipodi:role="line"
+         x="533.85394"
+         y="274.00516"
+         style="font-size:7.31033659px;line-height:1.25;stroke-width:0.88288933"
+         id="tspan883-1-9-7-6-2">Single link</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none"
+       x="575.06464"
+       y="155.52603"
+       id="text5219-2-4-2"><tspan
+         sodipodi:role="line"
+         x="575.06464"
+         y="155.52603"
+         id="tspan5223-0-7-70"
+         style="font-size:10px;line-height:1.25">Tx adapter</tspan></text>
   </g>
 </svg>
diff --git a/doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg b/doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
similarity index 99%
rename from doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg
rename to doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
index c0a365c7b..3036ad663 100644
--- a/doc/guides/tools/img/eventdev_pipeline_queue_test_lockfree.svg
+++ b/doc/guides/tools/img/eventdev_pipeline_queue_test_internal_port.svg
@@ -20,8 +20,8 @@
    height="288.34286"
    id="svg3868"
    version="1.1"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="eventdev_pipeline_queue_test_lockfree.svg"
+   inkscape:version="0.92.2 2405546, 2018-03-11"
+   sodipodi:docname="eventdev_pipeline_queue_test_internal_port.svg"
    sodipodi:version="0.32"
    inkscape:output_extension="org.inkscape.output.svg.inkscape"
    enable-background="new">
@@ -2853,17 +2853,17 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="2.0000001"
-     inkscape:cx="394.32532"
-     inkscape:cy="122.70585"
+     inkscape:zoom="1.6933595"
+     inkscape:cx="466.69113"
+     inkscape:cy="93.384431"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1046"
-     inkscape:window-x="1920"
-     inkscape:window-y="34"
-     inkscape:window-maximized="1"
+     inkscape:window-width="1912"
+     inkscape:window-height="1033"
+     inkscape:window-x="4"
+     inkscape:window-y="22"
+     inkscape:window-maximized="0"
      fit-margin-top="0.1"
      fit-margin-left="0.1"
      fit-margin-right="0.1"
@@ -3809,7 +3809,7 @@
          x="670.83521"
          y="349.11719"
          style="font-size:7.17278051px;line-height:1.25;stroke-width:0.82762849"
-         id="tspan1265-4">(Tx Lock free)</tspan></text>
+         id="tspan1265-4">(Internal port)</tspan></text>
     <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:11.11939621px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92661637"
diff --git a/doc/guides/tools/testeventdev.rst b/doc/guides/tools/testeventdev.rst
index 46effd871..cddba3be0 100644
--- a/doc/guides/tools/testeventdev.rst
+++ b/doc/guides/tools/testeventdev.rst
@@ -70,6 +70,8 @@ The following are the application command-line options:
          order_atq
          perf_queue
          perf_atq
+         pipeline_atq
+         pipeline_queue
 
 * ``--socket_id <n>``
 
@@ -521,8 +523,9 @@ This is a pipeline test case that aims at testing the following:
    +===+==============+================+=========================================+
    | 1 | nb_queues    | (nb_producers  | Queues will be configured based on the  |
    |   |              | * nb_stages) + | user requested sched type list(--stlist)|
-   |   |              | x              | Here value of x is 1 in generic pipeline|
-   |   |              |                | and nb_producers in lockfree pipeline   |
+   |   |              | nb_producers   | At the last stage of the schedule list  |
+   |   |              |                | the event is enqueued onto per port     |
+   |   |              |                | unique queue which is then Transmitted. |
    +---+--------------+----------------+-----------------------------------------+
    | 2 | nb_producers | >= 1           | Producers will be configured based on   |
    |   |              |                | the number of detected ethernet devices.|
@@ -533,17 +536,19 @@ This is a pipeline test case that aims at testing the following:
    |   |              |                | argument                                |
    +---+--------------+----------------+-----------------------------------------+
    | 4 | nb_ports     | nb_workers +   | Workers use port 0 to port n.           |
-   |   |              | nb_producers   | Producers use port n+1 to port n+m,     |
-   |   |              |                | depending on the Rx adapter capability. |
+   |   |              | (nb_produces * | Producers use port n+1 to port n+m,     |
+   |   |              | 2)             | depending on the Rx adapter capability. |
+   |   |              |                | Consumers use port n+m+1 to port n+o    |
+   |   |              |                | depending on the Tx adapter capability. |
    +---+--------------+----------------+-----------------------------------------+
 
 .. _figure_eventdev_pipeline_queue_test_generic:
 
 .. figure:: img/eventdev_pipeline_queue_test_generic.*
 
-.. _figure_eventdev_pipeline_queue_test_lockfree:
+.. _figure_eventdev_pipeline_queue_test_internal_port:
 
-.. figure:: img/eventdev_pipeline_queue_test_lockfree.*
+.. figure:: img/eventdev_pipeline_queue_test_internal_port.*
 
    pipeline queue test operation.
 
@@ -568,10 +573,11 @@ the last stage in the pipeline if the event type is ``atomic`` it is enqueued
 onto ethdev Tx queue else to maintain ordering the event type is set to
 ``atomic`` and enqueued onto the last stage queue.
 
-If the ethernet has ``DEV_TX_OFFLOAD_MT_LOCKFREE`` capability then the worker
-cores transmit the packets directly. Else the worker cores enqueue the packet
-onto the ``SINGLE_LINK_QUEUE`` that is managed by a Tx service. The Tx service
-dequeues the packet and transmits it.
+If the ethdev and eventdev pair have ``RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT``
+capability then the worker cores enqueue the packets to the eventdev directly
+using ``rte_event_eth_tx_adapter_enqueue`` else the worker cores enqueue the
+packet onto the ``SINGLE_LINK_QUEUE`` that is managed by the Tx adapter.
+The Tx adapter dequeues the packet and transmits it.
 
 On packet Tx, application increments the number events processed and print
 periodically in one second to get the number of events processed in one
@@ -628,8 +634,9 @@ This is a pipeline test case that aims at testing the following with
    +===+==============+================+=========================================+
    | 1 | nb_queues    | nb_producers + | Queues will be configured based on the  |
    |   |              | x              | user requested sched type list(--stlist)|
-   |   |              |                | where x = 1 in generic pipeline and 0   |
-   |   |              |                | in lockfree pipeline                    |
+   |   |              |                | where x = nb_producers in generic       |
+   |   |              |                | pipeline and 0 if all the ethdev        |
+   |   |              |                | being used have Internal port capability|
    +---+--------------+----------------+-----------------------------------------+
    | 2 | nb_producers | >= 1           | Producers will be configured based on   |
    |   |              |                | the number of detected ethernet devices.|
@@ -640,17 +647,22 @@ This is a pipeline test case that aims at testing the following with
    |   |              |                | argument                                |
    +---+--------------+----------------+-----------------------------------------+
    | 4 | nb_ports     | nb_workers +   | Workers use port 0 to port n.           |
-   |   |              | nb_producers   | Producers use port n+1 to port n+m,     |
-   |   |              |                | depending on the Rx adapter capability. |
+   |   |              | nb_producers + | Producers use port n+1 to port n+m,     |
+   |   |              | x              | depending on the Rx adapter capability. |
+   |   |              |                | x = nb_producers in generic pipeline and|
+   |   |              |                | 0 if all the ethdev being used have     |
+   |   |              |                | Internal port capability.               |
+   |   |              |                | Consumers may use port n+m+1 to port n+o|
+   |   |              |                | depending on the Tx adapter capability. |
    +---+--------------+----------------+-----------------------------------------+
 
 .. _figure_eventdev_pipeline_atq_test_generic:
 
 .. figure:: img/eventdev_pipeline_atq_test_generic.*
 
-.. _figure_eventdev_pipeline_atq_test_lockfree:
+.. _figure_eventdev_pipeline_atq_test_internal_port:
 
-.. figure:: img/eventdev_pipeline_atq_test_lockfree.*
+.. figure:: img/eventdev_pipeline_atq_test_internal_port.*
 
    pipeline atq test operation.
 
-- 
2.18.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support
  2018-09-23 11:35     ` Jerin Jacob
@ 2018-09-24  8:30       ` Andrzej Ostruszka
  2018-09-24 14:45         ` Jerin Jacob
  0 siblings, 1 reply; 22+ messages in thread
From: Andrzej Ostruszka @ 2018-09-24  8:30 UTC (permalink / raw)
  To: dev

On 23.09.2018 13:35, Jerin Jacob wrote:
> -----Original Message-----
>> Date: Thu, 20 Sep 2018 03:52:34 +0530
>> From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
[...]
>> -	struct rte_event_dev_info info;
>> -	struct test_pipeline *t = evt_test_priv(test);
>> -	uint8_t tx_evqueue_id = 0;
>> +	uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};
> 
> Some old compiler throws error with this scheme. Please change to memset.

Really?  Could you give an example?

That is perfectly legal C (since "forever"?) and I find it more readable
than memset.  Don't treat it as a request to keep the original version -
if I were Pavan I would object this particular request since I prefer
direct initialization, however here I'm more interested in learning more
about your statement about compilers not supporting zero initialization
of array members after the last initializer.  And maybe also about to
what extent we should be supporting old/non compliant compilers (the doc
suggest to use gcc 4.9+).

Best regards
Andrzej

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support
  2018-09-24  8:30       ` Andrzej Ostruszka
@ 2018-09-24 14:45         ` Jerin Jacob
  0 siblings, 0 replies; 22+ messages in thread
From: Jerin Jacob @ 2018-09-24 14:45 UTC (permalink / raw)
  To: Andrzej Ostruszka; +Cc: dev

-----Original Message-----
> Date: Mon, 24 Sep 2018 10:30:30 +0200
> From: Andrzej Ostruszka <amo@semihalf.com>
> To: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter
>  support
> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
>  Thunderbird/52.9.1
> 
> 
> On 23.09.2018 13:35, Jerin Jacob wrote:
> > -----Original Message-----
> >> Date: Thu, 20 Sep 2018 03:52:34 +0530
> >> From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> [...]
> >> -    struct rte_event_dev_info info;
> >> -    struct test_pipeline *t = evt_test_priv(test);
> >> -    uint8_t tx_evqueue_id = 0;
> >> +    uint8_t tx_evqueue_id[RTE_MAX_ETHPORTS] = {0};
> >
> > Some old compiler throws error with this scheme. Please change to memset.
> 
> Really?  Could you give an example?
> 
> That is perfectly legal C (since "forever"?) and I find it more readable
> than memset.  Don't treat it as a request to keep the original version -
> if I were Pavan I would object this particular request since I prefer
> direct initialization, however here I'm more interested in learning more
> about your statement about compilers not supporting zero initialization
> of array members after the last initializer.  And maybe also about to
> what extent we should be supporting old/non compliant compilers (the doc
> suggest to use gcc 4.9+).

Clang don't like this kind of zero-initialization depending on which 
type of parameter comes first in the structure. An array of uint8_t
should be OK. I thought of keeping safe here as it was going for next
revision.

Unofficially, people used to test with old compiler such as gcc 4.7 etc.

http://patches.dpdk.org/patch/40750/ // Search clang here.
http://patches.dpdk.org/patch/38189/



> 
> Best regards
> Andrzej

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v4 3/4] app/test-eventdev: add Tx adapter support
  2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
@ 2018-09-28 16:13     ` Jerin Jacob
  0 siblings, 0 replies; 22+ messages in thread
From: Jerin Jacob @ 2018-09-28 16:13 UTC (permalink / raw)
  To: Pavan Nikhilesh; +Cc: nikhil.rao, anoob.joseph, dev

-----Original Message-----
> Date: Mon, 24 Sep 2018 13:32:19 +0530
> From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> To: jerin.jacob@caviumnetworks.com, nikhil.rao@intel.com,
>  anoob.joseph@caviumnetworks.com
> Cc: dev@dpdk.org, Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v4 3/4] app/test-eventdev: add Tx adapter support
> X-Mailer: git-send-email 2.18.0
> 
> Convert existing Tx service based pipeline to Tx adapter based APIs and
> simplify worker functions.
> 
> Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

Series applied to dpdk-next-eventdev/master. Thanks.

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2018-09-28 16:13 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-04 14:12 [dpdk-dev] [PATCH v2 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
2018-09-05  6:54   ` Rao, Nikhil
2018-09-05  8:54     ` Pavan Nikhilesh
2018-09-05  9:37       ` Rao, Nikhil
2018-09-04 14:12 ` [dpdk-dev] [PATCH v2 4/4] doc: update eventdev application guide Pavan Nikhilesh
2018-09-19 22:22 ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Pavan Nikhilesh
2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
2018-09-23 10:31     ` Jerin Jacob
2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
2018-09-23 11:35     ` Jerin Jacob
2018-09-24  8:30       ` Andrzej Ostruszka
2018-09-24 14:45         ` Jerin Jacob
2018-09-19 22:22   ` [dpdk-dev] [PATCH v3 4/4] doc: update eventdev application guide Pavan Nikhilesh
2018-09-23 10:46     ` Jerin Jacob
2018-09-23 10:28   ` [dpdk-dev] [PATCH v3 1/4] app/test-eventdev: fix minor typos Jerin Jacob
2018-09-24  8:02 ` [dpdk-dev] [PATCH v4 " Pavan Nikhilesh
2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 2/4] app/test-eventdev: remove redundant newlines Pavan Nikhilesh
2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 3/4] app/test-eventdev: add Tx adapter support Pavan Nikhilesh
2018-09-28 16:13     ` Jerin Jacob
2018-09-24  8:02   ` [dpdk-dev] [PATCH v4 4/4] doc: update eventdev application guide Pavan Nikhilesh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).