From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <Pavan.Bhagavatula@cavium.com>
Received: from NAM02-SN1-obe.outbound.protection.outlook.com
 (mail-sn1nam02on0055.outbound.protection.outlook.com [104.47.36.55])
 by dpdk.org (Postfix) with ESMTP id 38C3A1B311
 for <dev@dpdk.org>; Tue, 16 Jan 2018 16:41:16 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version;
 bh=HvX9QJLnG/GqOck0i8KTrrNiJEqYA8O5ig67YxfGHsg=;
 b=GpD2zoARvXYL+sWg24HSiCOFKF1UZaEd90abyjSEGJO2IBzxropLhMI11eRLTBwOfbGknd/DTnwtqq98UdyiB8JFGFHC51KT7LMOnpEuF2lAq22U+H7NVUGf2zppzWPCQnx1u/0czEgzR0pg1MA7KGQGkKUwO7v45U9q8KvyLq0=
Authentication-Results: spf=none (sender IP is )
 smtp.mailfrom=Pavan.Bhagavatula@cavium.com; 
Received: from Pavan-LT.caveonetworks.com (111.93.218.67) by
 CY4PR07MB3464.namprd07.prod.outlook.com (10.171.252.145) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id
 15.20.407.7; Tue, 16 Jan 2018 15:41:11 +0000
From: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
To: jerin.jacob@caviumnetworks.com, santosh.shukla@caviumnetworks.com,
 harry.van.haaren@intel.com, gage.eads@intel.com, hemant.agrawal@nxp.com,
 nipun.gupta@nxp.com, liang.j.ma@intel.com
Cc: dev@dpdk.org,
	Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Date: Tue, 16 Jan 2018 21:10:01 +0530
Message-Id: <20180116154003.3762-12-pbhagavatula@caviumnetworks.com>
X-Mailer: git-send-email 2.14.1
In-Reply-To: <20180116154003.3762-1-pbhagavatula@caviumnetworks.com>
References: <20171130072406.15605-1-pbhagavatula@caviumnetworks.com>
 <20180116154003.3762-1-pbhagavatula@caviumnetworks.com>
MIME-Version: 1.0
Content-Type: text/plain
X-Originating-IP: [111.93.218.67]
X-ClientProxiedBy: MWHPR02CA0016.namprd02.prod.outlook.com (10.168.209.154) To
 CY4PR07MB3464.namprd07.prod.outlook.com (10.171.252.145)
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-Correlation-Id: b5969551-eadc-4e93-e17e-08d55cf79397
X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0;
 RULEID:(7020095)(4652020)(5600026)(4604075)(2017052603307)(7153060)(7193020);
 SRVR:CY4PR07MB3464; 
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464;
 3:Kid3/hFwGggnh8OPkM5Gk2kcioq0rtY+tjaLuklsDJTflDOmve0rQsbbxW+O96x/8nzAzYb+TB8Piq1pUKmZnKuOSmcNEsFRJnGcrb0OU/z4mfx7TsYuaMGAQ21b5WBL7ySY/Et8YoM97zOXEqXx2t/l+Qj/vhmmuJDXd/OyeuG/jbFXx97lvImJi7S5jsPoNC14SE5+amXzHcCQLhONUzMpd3tAI4FnrwIPATjVOk6QaQ2meXF7F6glNnCburdp;
 25:q0mN3+pu0qW3Pt/4RMeeMI0NXjRruNf1aGkNuZp+UXcC3NNpW38+hjWtnV6DJdOPI1Hfw6Y3kObJJPMFPqUx9WfHqOMpZyq7p1q0zDEOmsfq++EMa3Ns59wDh1mr+AvCaLYQL4UqLJXl8WgeW0LKu+fqqHbggTpFy52z3wC1v5deAY9dLcO4xuCymHm2yzgUOuuvYsBhUZFxYQ19Fq8ox3abtjxMxD2UTgwoEwB1nuxtH15IGgKzqTaUKK/MmvZ8plAWWoQTUz/6JVY6MqxtrpBtDD2bvoP3sSxgfC06bPOjDGWM7Aaxevs3upiSzSfBeLVP5kvzi0/M8LXFeM2Geg==;
 31:coLszCdf2jNrkg/VxufYTckmedtEBs+R2B1lV3gLzpbKWjmJfSs1/UHhXTItCcou/gwy3GP04dajZnf6/1j7JsGkRH2ojo/Dac2k//qT7FYZwFZRw2wOQ0Dzxir6I23+y+pdaxUneZRHEdDkl16eNy313u37G2vAADOHM00jHfqlWT+kZgII8/8NoSPa4O3+skVNONApFX3dteBzngu5auaXkzoe70t80kTSMN4Aqt8=
X-MS-TrafficTypeDiagnostic: CY4PR07MB3464:
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464;
 20:TAlHN0TOsAxHvmu7LL8FIwbjlTrfcXGO04SiuBAW+XjbrMI58vU41YwosOD4qY+FWEcGxzI8A6dTg0hnzAR5hwzN7apX/TxzjBuPlr4P5np0hPMwPJT4b0PP3hwsLdy9gY7pp1phb/0lR6HPpP8VQL6mduvPbgN9bnb4OsftgGQSd40woBlgZdxRH1MsdEeEyiue1dBqUaaz122MVPZOBsWvFAbWvxR+6Jek3hJF6oPXIFmwEGB/lfvtuMoTQKnETfThJ/AeV76P4C8EuQDu2jpmyIFsVFnRE3uz4DPBylgZ1vf5Myjx6RiR6GOJuDhKyGYN31TbkZv8AFtTZ1mjv6aQV3ZwS5OphyP8sarCvb4X/nH2uw8comI5xD9FQ/jSrFdxbYtiWsXo3BJLaNJkhKGnUFZzgeyOstjym0/Kv/TIknFkOiG48QZOHPCj+MDVkVAPp5yF39Qi7M6sue+w8Ku1ie4eumDrHrmEgibWslYX4Qk7s7vrW9K2il83720D/6hzBfVB6AvqEF20CNhS3U3MM2azE64SVArcRuccom1T/I9H/obMiyCCLsa6F6WwppXFx693w9lNrV/0ECr7ceP8gHFWdwsQal4kd//afN4=;
 4:y0Hy+LX4GxR287uAoyG8x8JwS+mde+pL9tITA6u+us41i7nGzk36LCjvKDI2Dgw6aXH/vsQ49pUVfZWfwzvlKkQxp1CUnI/eXEx7mq6aP1hXBh4FvMKpiQmCzhfYD2tYLgno03DwfNGzu7hKbsDhudTlP44mTYdf2nb1dnKiL06knkK5bSQpMmJLk9nZnLcoxzH4D/Yu5ZuGM3iMDGLh+0LgIzlX100oQBTzuwp1FygIxD2gSUfva9MnIStm+ULH+oeTieYQIm+TBCTVX9wprEo0Xq4rzpWLnU8n6SuwBWtVs19tqGKTDwy+7SZYs4Y8
X-Microsoft-Antispam-PRVS: <CY4PR07MB34649F2BD0FED97B5530F9DE80EA0@CY4PR07MB3464.namprd07.prod.outlook.com>
X-Exchange-Antispam-Report-Test: UriScan:(228905959029699);
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(6040470)(2401047)(5005006)(8121501046)(93006095)(3231023)(944501161)(10201501046)(3002001)(6041268)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(6072148)(201708071742011);
 SRVR:CY4PR07MB3464; BCL:0; PCL:0; RULEID:(100000803101)(100110400095);
 SRVR:CY4PR07MB3464; 
X-Forefront-PRVS: 0554B1F54F
X-Forefront-Antispam-Report: SFV:NSPM;
 SFS:(10009020)(979002)(39860400002)(366004)(346002)(39380400002)(396003)(376002)(189003)(199004)(81166006)(97736004)(8676002)(6116002)(5009440100003)(52116002)(305945005)(8936002)(107886003)(1076002)(51416003)(81156014)(25786009)(8656006)(4326008)(50466002)(50226002)(6486002)(5660300001)(3846002)(7736002)(16526018)(68736007)(69596002)(42882006)(106356001)(26005)(76176011)(53936002)(6512007)(59450400001)(47776003)(48376002)(16586007)(386003)(6506007)(66066001)(72206003)(2950100002)(36756003)(2906002)(478600001)(105586002)(316002)(53416004)(6666003)(42262002)(969003)(989001)(999001)(1009001)(1019001);
 DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3464; H:Pavan-LT.caveonetworks.com;
 FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; 
Received-SPF: None (protection.outlook.com: cavium.com does not designate
 permitted sender hosts)
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR07MB3464;
 23:B0Goq0bIjv5Gh1JdTdLgn4DbSrxsfcRMcUVdhJczm?=
 =?us-ascii?Q?YMyUCXiacjNt+VoMwQxrVFv5FMPTEHU1DPnwFcNVc+sUFGm/0d254fP1VZQR?=
 =?us-ascii?Q?NxFR6ORjMxNDm0DpVKEnDXaV6CUJMHH18VjQ/QMkGebwjFmcQtIfGdljrwkW?=
 =?us-ascii?Q?HHkSYfh/TWluEUmcr+NZEHwfZ0QmiZflhv61MJVQrfv8dVaBnidr3PYz+a2z?=
 =?us-ascii?Q?QxatYwB0Uu40H7Or0oJuSrmvQ0YeH15MilHjx+vTGmqq/4R7wlFOxkCAWDn7?=
 =?us-ascii?Q?mjbnjXp86vqD/agxXvpTkEggZXwwvcoMEsuXw5Rs7kezizT9u2uLLOZhNou2?=
 =?us-ascii?Q?xCcWIpgy0jCqqrrFDPF1ymEEBt4iFwC8dxgTeZE16y9ea2MFFAjUL8KD1Czl?=
 =?us-ascii?Q?9giDAooavE9ztfDH6RV2+HHeIC492B83C5KXX/6Xty1c5NhRoe9t4rJgthME?=
 =?us-ascii?Q?g3nalReKsxjCsLJrb1RLHfkOTdKzULSsafrqh0xqYImpHsU2Ud9NXRocjyDP?=
 =?us-ascii?Q?atrv8SB2Z442MyPbgb0gt/dmiQS6UqLBiEAXJL48pi8UrsJscrGXBhEWQOsX?=
 =?us-ascii?Q?2mdtPH984fK6e4K8c1XaL7lEUN3VHiUNMG81N4x5QRpkhXunjP9O2q6GIlaZ?=
 =?us-ascii?Q?Qw5ByvOocD1Ps5upxN2vzwRzlR5K8yWLxcEzmYOXv/HLp9v0qMy/fGOdF43B?=
 =?us-ascii?Q?VJBQKOsUXJw6dw05kxuFr+W/C/JfSHHnjedOrRRL7Qf8uIP2jZre1M3J8aDb?=
 =?us-ascii?Q?bOnxVqYPynP9C5XCKrbV8ambj7NGDJqoTg6V0JPz+dlIdw3yLMmsWJOcX1Ip?=
 =?us-ascii?Q?az/mHubqpg1rVgppiLg4NkVyVJsQScP9nrDtwFfCr5dIavzwN2LLEJ/Fs4LG?=
 =?us-ascii?Q?bxWSTbwg/+7MOqIefUQSXQWdN+B0uW/M3od4CEjmIhBkEfD1fEvPTF/1F+0x?=
 =?us-ascii?Q?Vo/VhG3IdZ0UHgGCsSB8I04NSHoqnDONjuTagbQhm1wHJSdThzRV/KOohsC/?=
 =?us-ascii?Q?2NvmIgOSamS9+cIa8wKbVgmJwplKkBS7iM/LU5Cr4vNDbWQIYeWIhUiOTvl9?=
 =?us-ascii?Q?ykZJx1u39mlJTO/fQmMMM06M1UYdm28ItiNLOYy6CDG4KJav95u4AkJoj3wm?=
 =?us-ascii?Q?qY7Z9FvTfhyTzkvW/2rIizqkI4OetwFlzt7Na8RRS19pR5DoqvDUy9oXt2eu?=
 =?us-ascii?Q?qScRIv10bflbShqCzBv2kLd+/LSoR4tka3an/0Q1umywMo5oivpNtySZaPiA?=
 =?us-ascii?Q?+REnCRfSArqbCSB6ireo8z5aqmrQP8yTco89uZH+xp/i9k44TaMzF0RpcV2i?=
 =?us-ascii?Q?AxmBbRo3Zj3qg9rMoC9EoS1t80qPpChoRVeUgVgOiMnf7R6xpU4SOKTnlZwh?=
 =?us-ascii?Q?CIPUw=3D=3D?=
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464;
 6:6uroSBPYlck/3FSiNKJNbmds5WqHiKyDSfYEEfG54r9x5PkeKJIR1IJ9M3eA3eglwzG/6hZYDzAkP0f05TKSjD2eJRAf7GbR3ApwJCzJZhmxkrOvg6Y73jmT3Bgt2MgGdg4fpXuToS0I4cGEEVc5evu2EVIMrfV0NV3Al/jYvzP+QW2yO6EwFScPEsPFtnWA48IuxuhnMw80mqArRODchbDPkoYm5AE/a0CI8lnivTl0KvX98N8sfKSojyK7L8L9vZRoaBFpuVvVvVQaXJDiMdGvLZ+F0RL4eRJWKLc9TklTFv0QwkOSgwCl7GrxR8VoP8C3nawTmYNjxBpQHxmTXn3R3fIJiPfr/eutylfsf/Q=;
 5:KlyND6jAEUd5tIxEKy5yvcxfOq1vM37Q0sVV/0nfe8yuuYGkJUzpT5o+UUAymNal3tw7RDrg8jRR6LMpIgjQ0Dp1vzw08AogT1DqVC7JnS26ZpLSja0QECPnCJnLXcSQXuxb/7C/9yReMsV8t0L5+0LWJFSujRjQcpjitgmKcj0=;
 24:qa5gyNKXF+jfL7+oihieMxvc5/7XDg248IiSr/szF3Nhvep7UHM8OsZDB76V3dl9EF4DmTFngoCrIQzMhb8wNquGAnmHGo+W8CIc8Dw8fSA=;
 7:Y4xwaHnAjoKsU7h3Pt0HdxTLNdU7whCgXRXcv836npd/8Y1jGYUYbcrHFYs02kZipav1G8VVC3NPTy9unDr174h60KLDQ07GcqaEg0ddH2bjc9M/acEwmooYWIJU+OlBQ+vHB17Gg2gqe25IjOnSGYiUFGTjvexgzmIcoNKag3tTzbTgqVwBFaMNJ10UD/jobCZacUWfm75+UcRctN61zocV95V1Q+aPM5DQjhmMUbIlM7iyY7P49upYahF2DRxE
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-OriginatorOrg: caviumnetworks.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2018 15:41:11.9893 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: b5969551-eadc-4e93-e17e-08d55cf79397
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3464
Subject: [dpdk-dev] [PATCH v6 12/14] app/eventdev: add pipeline atq worker
	functions
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Tue, 16 Jan 2018 15:41:16 -0000

Signed-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Acked-by: Harry van Haaren <harry.van.haaren@intel.com>
---
 app/test-eventdev/test_pipeline_atq.c | 280 +++++++++++++++++++++++++++++++++-
 1 file changed, 279 insertions(+), 1 deletion(-)

diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c
index 6c9ac6119..36abbddda 100644
--- a/app/test-eventdev/test_pipeline_atq.c
+++ b/app/test-eventdev/test_pipeline_atq.c
@@ -15,10 +15,288 @@ pipeline_atq_nb_event_queues(struct evt_options *opt)
 	return rte_eth_dev_count();
 }
 
+static int
+pipeline_atq_worker_single_stage_tx(void *arg)
+{
+	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+
+	while (t->done == false) {
+		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
+
+		if (!event) {
+			rte_pause();
+			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);
+	}
+
+	return 0;
+}
+
+static int
+pipeline_atq_worker_single_stage_fwd(void *arg)
+{
+	PIPELINE_WROKER_SINGLE_STAGE_INIT;
+	const uint8_t tx_queue = t->tx_service.queue_id;
+
+	while (t->done == false) {
+		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
+
+		if (!event) {
+			rte_pause();
+			continue;
+		}
+
+		w->processed_pkts++;
+		ev.queue_id = tx_queue;
+		pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
+		pipeline_event_enqueue(dev, port, &ev);
+	}
+
+	return 0;
+}
+
+static int
+pipeline_atq_worker_single_stage_burst_tx(void *arg)
+{
+	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+
+	while (t->done == false) {
+		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
+				BURST_SIZE, 0);
+
+		if (!nb_rx) {
+			rte_pause();
+			continue;
+		}
+
+		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);
+		}
+
+		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+	}
+
+	return 0;
+}
+
+static int
+pipeline_atq_worker_single_stage_burst_fwd(void *arg)
+{
+	PIPELINE_WROKER_SINGLE_STAGE_BURST_INIT;
+	const uint8_t tx_queue = t->tx_service.queue_id;
+
+	while (t->done == false) {
+		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
+				BURST_SIZE, 0);
+
+		if (!nb_rx) {
+			rte_pause();
+			continue;
+		}
+
+		for (i = 0; i < nb_rx; i++) {
+			rte_prefetch0(ev[i + 1].mbuf);
+			ev[i].queue_id = tx_queue;
+			pipeline_fwd_event(&ev[i], RTE_SCHED_TYPE_ATOMIC);
+			w->processed_pkts++;
+		}
+
+		pipeline_event_enqueue_burst(dev, port, ev, nb_rx);
+	}
+
+	return 0;
+}
+
+static int
+pipeline_atq_worker_multi_stage_tx(void *arg)
+{
+	PIPELINE_WROKER_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);
+
+		if (!event) {
+			rte_pause();
+			continue;
+		}
+
+		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_enqueue(dev, port, &ev);
+	}
+	return 0;
+}
+
+static int
+pipeline_atq_worker_multi_stage_fwd(void *arg)
+{
+	PIPELINE_WROKER_MULTI_STAGE_INIT;
+	const uint8_t nb_stages = t->opt->nb_stages;
+	const uint8_t tx_queue = t->tx_service.queue_id;
+
+	while (t->done == false) {
+		uint16_t event = rte_event_dequeue_burst(dev, port, &ev, 1, 0);
+
+		if (!event) {
+			rte_pause();
+			continue;
+		}
+
+		cq_id = ev.sub_event_type % nb_stages;
+
+		if (cq_id == last_queue) {
+			w->processed_pkts++;
+			ev.queue_id = tx_queue;
+			pipeline_fwd_event(&ev, RTE_SCHED_TYPE_ATOMIC);
+		} else {
+			ev.sub_event_type++;
+			pipeline_fwd_event(&ev, sched_type_list[cq_id]);
+		}
+
+		pipeline_event_enqueue(dev, port, &ev);
+	}
+	return 0;
+}
+
+static int
+pipeline_atq_worker_multi_stage_burst_tx(void *arg)
+{
+	PIPELINE_WROKER_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,
+				BURST_SIZE, 0);
+
+		if (!nb_rx) {
+			rte_pause();
+			continue;
+		}
+
+		for (i = 0; i < nb_rx; i++) {
+			rte_prefetch0(ev[i + 1].mbuf);
+			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_enqueue_burst(dev, port, ev, nb_rx);
+	}
+	return 0;
+}
+
+static int
+pipeline_atq_worker_multi_stage_burst_fwd(void *arg)
+{
+	PIPELINE_WROKER_MULTI_STAGE_BURST_INIT;
+	const uint8_t nb_stages = t->opt->nb_stages;
+	const uint8_t tx_queue = t->tx_service.queue_id;
+
+	while (t->done == false) {
+		uint16_t nb_rx = rte_event_dequeue_burst(dev, port, ev,
+				BURST_SIZE, 0);
+
+		if (!nb_rx) {
+			rte_pause();
+			continue;
+		}
+
+		for (i = 0; i < nb_rx; i++) {
+			rte_prefetch0(ev[i + 1].mbuf);
+			cq_id = ev[i].sub_event_type % nb_stages;
+
+			if (cq_id == last_queue) {
+				w->processed_pkts++;
+				ev[i].queue_id = tx_queue;
+				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_enqueue_burst(dev, port, ev, nb_rx);
+	}
+	return 0;
+}
+
 static int
 worker_wrapper(void *arg)
 {
-	RTE_SET_USED(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 uint8_t nb_stages = opt->nb_stages;
+	RTE_SET_USED(opt);
+
+	if (nb_stages == 1) {
+		if (!burst && mt_safe)
+			return pipeline_atq_worker_single_stage_tx(arg);
+		else if (!burst && !mt_safe)
+			return pipeline_atq_worker_single_stage_fwd(arg);
+		else if (burst && mt_safe)
+			return pipeline_atq_worker_single_stage_burst_tx(arg);
+		else if (burst && !mt_safe)
+			return pipeline_atq_worker_single_stage_burst_fwd(arg);
+	} else {
+		if (!burst && mt_safe)
+			return pipeline_atq_worker_multi_stage_tx(arg);
+		else if (!burst && !mt_safe)
+			return pipeline_atq_worker_multi_stage_fwd(arg);
+		if (burst && mt_safe)
+			return pipeline_atq_worker_multi_stage_burst_tx(arg);
+		else if (burst && !mt_safe)
+			return pipeline_atq_worker_multi_stage_burst_fwd(arg);
+	}
 	rte_panic("invalid worker\n");
 }
 
-- 
2.14.1