From patchwork Mon Oct 3 11:49:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Elo, Matias \(Nokia - FI/Espoo\)" X-Patchwork-Id: 77215 Delivered-To: patch@linaro.org Received: by 10.140.106.72 with SMTP id d66csp1622930qgf; Mon, 3 Oct 2016 04:51:59 -0700 (PDT) X-Received: by 10.200.41.71 with SMTP id z7mr20124004qtz.107.1475495519376; Mon, 03 Oct 2016 04:51:59 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id o42si8303062qta.146.2016.10.03.04.51.58; Mon, 03 Oct 2016 04:51:59 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE dis=NONE) header.from=nokia.com Received: by lists.linaro.org (Postfix, from userid 109) id A364A60D35; Mon, 3 Oct 2016 11:51:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 137A260E52; Mon, 3 Oct 2016 11:50:17 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 96F7460C43; Mon, 3 Oct 2016 11:50:00 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0111.outbound.protection.outlook.com [104.47.2.111]) by lists.linaro.org (Postfix) with ESMTPS id 60FC060D33 for ; Mon, 3 Oct 2016 11:49:42 +0000 (UTC) Received: from DB4PR07CA016.eurprd07.prod.outlook.com (10.242.229.26) by VI1PR0701MB2701.eurprd07.prod.outlook.com (10.173.80.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.619.10; Mon, 3 Oct 2016 11:49:40 +0000 Received: from DB3FFO11FD006.protection.gbl (2a01:111:f400:7e04::167) by DB4PR07CA016.outlook.office365.com (2a01:111:e400:9828::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.649.16 via Frontend Transport; Mon, 3 Oct 2016 11:49:40 +0000 Received-SPF: Pass (protection.outlook.com: domain of nokia.com designates 131.228.2.241 as permitted sender) receiver=protection.outlook.com; client-ip=131.228.2.241; helo=fihe3nok0735.emea.nsn-net.net; Received: from fihe3nok0735.emea.nsn-net.net (131.228.2.241) by DB3FFO11FD006.mail.protection.outlook.com (10.47.216.95) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.629.5 via Frontend Transport; Mon, 3 Oct 2016 11:49:39 +0000 Received: from fihe3nok0735.emea.nsn-net.net (localhost [127.0.0.1]) by fihe3nok0735.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id u93BnHAP001152 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 3 Oct 2016 14:49:17 +0300 Received: from 10.144.19.15 ([10.144.104.92]) by fihe3nok0735.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id u93BnHPW001104 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NOT) for ; Mon, 3 Oct 2016 14:49:17 +0300 X-HPESVCS-Source-Ip: 10.144.104.92 From: Matias Elo To: Date: Mon, 3 Oct 2016 14:49:16 +0300 Message-ID: <1475495356-4038-5-git-send-email-matias.elo@nokia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1475495356-4038-1-git-send-email-matias.elo@nokia.com> References: <1475495356-4038-1-git-send-email-matias.elo@nokia.com> X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.228.2.241; IPV:NLI; CTRY:FI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(7916002)(2980300002)(438002)(189002)(199003)(76176999)(19580405001)(450100001)(586003)(189998001)(77096005)(97736004)(33646002)(107886002)(42882006)(92566002)(5660300001)(87936001)(81166006)(6916009)(81156014)(8936002)(356003)(2906002)(110136003)(50226002)(48376002)(2950100002)(36756003)(50466002)(11100500001)(8676002)(626004)(229853001)(5003940100001)(50986999)(47776003)(106466001)(7846002)(2351001)(305945005)(68736007)(19580395003)(32563001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0701MB2701; H:fihe3nok0735.emea.nsn-net.net; FPR:; SPF:Pass; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB3FFO11FD006; 1:rbqGgDcZG3alVkLWN02G4cmkGCELWQEJ1YiFVydDU8Y3/Y5mfpmV+/LNMhxLjACp3lVm8zOONeqZ1fAFxukHsAa1ECoHpKmgJLQU/E40X2cfiJUBAPEUs8BmG5s8wX9Ctch+wv1NcRsYp+vEr23o/Dw9OBok1r34ertMdOoW/PuHDU+abmZtgzQTUBFdwMUnB6CJTOOCuo4KfW0KX9bB22qhsB2YWZqw3ziy8zoU8i76pPuvOrgtGkxOwe91nyxlqBoP44Djxszj7LrRBDKu6ohv7Tv5R4IBxgyikQ11ylrmG3qt399Z1+DqhK0tWTl2/YDrtOjNbiX9OXmf0tUmaWdgqMcO5xTegpSNsF2s/04mOQ3DfcYDjAY/GhVXMwDDUZJW0MFDGoA3GiO5kc5akPMc6SU2MkxgIO4YCTyV2QopYEflH8WDN3eRqdGczDS7zzApqBPQtqAJxQWGnTrwOvun02CICL8R6BBwL+OkLoY= MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: d06be1bd-2f29-4e2c-7bd2-08d3eb835bb0 X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2701; 2:JtdRLz95ofAqSYSJ0E1JDkCHvgWX3PHjgibs72E/03s8hj9vv0yDlG8EzoBvVgMzUzoe7EjfcnWAK/H9P53UGVuptkmR8JyNtGc4ZLK6MYnPy1cDywg6UdUSzWd8bbFsWG77MgoJWbEolVP2BGrSi/CL/NIthKKnapbgimJcO4/hXLARcRM9vsKcI91+Hy6S; 3:TvqQjkxglo4VsrwiPr01yDAgglRWFGgICgS1nC8zpsW+uK/ctrF5k1UpDfFpvnpY+4ZN1JnLbXYaoXgst+8CeFfydhOzfbffcsjrLyXv7MsWjg9Fuudj8AeXodmO1sn/FGdp4lWmCa5YaOOWdSKAIvfpAdIh5MBZ139eROECjE855I9Xd6JgvVCUumEpNZbYJlk/TjpPniqx6eiHo6vywHxCPHM5iBbcmwJXvq2mDyRXwL0RWMO1kUssj/pokLKm2oxEVJ28z5iDoF37Ijra7A== X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(8251501002); SRVR:VI1PR0701MB2701; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2701; 25:iePPgIBiIClWwhwfLCp+mclvlxjcJ5P7G6VEoCUqVuyW7DVbqY7i+O5xmZ+kCp/BXVwqzeaQ689LSGsujZKXT/LAW71VbN5tlv/LTtKTRUxaAV45HNIgFNvyoeMlXFKGg/0+9w59F5hT6zfIjSfB3WmT7QCSpvIeguB3VNFKRApau/bZ/xJoF32faHwNG7yi/PDMrT6TuP31rqOBM3Zsqw/i5Z+BOUW0CxMyb7orNmANRzuazfom5jkSJcWiurRo6H2JIBtorLgqKjc79jkU2+BF1giywxCKp5PAYHUBh56S1Ere1RlgtfNUaM0wDu9gtetOzdEEQAaJNrikcGppDufD/+0IjLK1XTE9LB4HAajbirDuyXkXd0nudCc11dC+wBc76ROzOghS1RHg18TwrOBnvFbwGNPXusUfC4bDQENF1biOXYytgCjehTHofLAXVNeocRpLFAQg3wEPzalHmXe6E0+E4iOAlcs56S71S3JfM5zEKoDUgAYnqRZR9Hq8ca2MbPbH5kIv2u5dGOWOIUMQHqI73eOBiLRV1t7FPRT1qHB8XOK0qvkzpNv/CuDziHf3vjfdk1R8py+jgEwa7mj/IsFEVxIxv1LdgS97m0D5ZypOUPz58sr7DE5yFyVA2GhApQazgxy6eaQviIP1pytpuZiiCEz4Lj+JgASlB5Buhxm/4NDqt8QPJXe4b4k0q9Fb8n5AuMz6akh9lD9ih10Uog926ZDGm+bSQs5VMrShM9FqCmrVXdxc3Pxc3DcX X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2701; 31:I7J6eF5LpUml/T+diXxiV4QGGjjbq4QMJ1v95jme5j9iQdSJrt+SaYXMhT+t3cDJ2X3+4aGqOH42TkQqEELwww3Y6f1uj0qdqElEF5RIPQHg0mXMksOp3Ach6gCSgtQQNiHfVrXCmdQN9oP71lU3MvWFhNAiKKRnyuuqUQkGlCn2eeP3EAqDdZWUnWX0ahxq6N5PIDQ3Tdpg8r6OLADPF/84FhWwAWttZRYwfUGkrOrzE2W/pCNQae4WALsZiIHd; 20:t4Gvcx4/tyzguuWhklwinoMi+H/fOhFICcoOcHoW5IaFVH1HmwPw/67W5a2t7LqjiJGRk/b1VErTP0Elj5ToqiO2g9v46+Qt/kfMDljfnVlTbdcMilU3D8QG+sUecV+b941v2Dv46mV8UtgHVAoZPkWxR9Oh0JYIRw1tY5COfoojLuZ6vmXJMjYENyLG55+ue1MyACFgMYvs6JFR84E/4qM+iRMHB/gwdzcK8rWmshFILV8DbbhqqZCIUp96HKjbmv21YydwRWY3iypbFj7lEPpS8y3G4Aw7Gnf7aNoApCSKGSXRu9z2+N33h+ZtkT22fmPKozPqo/woqHs215FCEK6H7BQRXZ61fDtGdCrWPYYFucPUks6uSpMmKRR2HWI9wpZFqw7XSBDD3jYkMc5imMxZCw9Syv6olwyL/AT0WVJcJkEVC2nKS1E4TLkin6cITskPZaYJnKWkdLglITuxIJdMpxXtoGh3lRDEJOrprL3id1LMac6OCJ0MBSRRLSOCYlIW10cl3n3QFt04CYVciC0ChTylXBUi7DWc5xYWiomFAiEEkU0eUzl4FU0UcnaCbmq01D6fQy5TFnsO4fjBUKZlfH2Y3hAJ/dseQ8UApF4= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(82608151540597); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(13018025)(8121501046)(13016025)(5005006)(10201501046)(3002001)(6055026); SRVR:VI1PR0701MB2701; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0701MB2701; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2701; 4:2sGork0NuQNbWP/sqQ2+diZwqHqfDu1zUVyy6CPBPjNLoLW15IXcQ9EyiRBgyTqlq/IB2iyhj24ugSlhBn0AXiKIxj2eAg0vtwSBUVs/kjLFjreLCkpTfxHRtEsPTMPKHe0mlZ3Kz/g10S2OtKUG3C0rsOFEPXmPMBr/V604/dvsTHTJAsdZVzBWT7Yx6q9MLrGyTYTsuYfHan1K7Eol9l6wFPOyq60pTnLp1xYUyLw+Qr9In+H6Vuo2IpyJ/YE/Rdb6BeFpCZUQRWmSAJfeI8z2DaAP/AqhiIPlmTELdYW7dZQ33Q0cnyCt3Qfi/pTRbYZ6oIuVFaqTCsjRAmJnmh6xrPlw06YOZ8YFUTnXXyW4VSyFrSAkxxPZs/WuR5eoMa2cui38mLhdpgsuBWomQprfksKNdBXcTVUq4AasOrsvSfEzsJoBB8zlTm+VAscttAV3ddeeG+dVIgu3Bo+7/6SMkTQTiOGXCrJEdCg1qY0= X-Forefront-PRVS: 008421A8FF X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0701MB2701; 23:tKNwYj0fYsK89mtGxHOxaZ2p/VbxX4pKs7mGSjA?= =?us-ascii?Q?yEqs4A5ZErHQj/okSAWqryX3ntsV8xTSpQyLtBBNprKnUWGn/OJZtS14SFlA?= =?us-ascii?Q?7DSBDMKF4Qv91zPkVJTYkBaMy7dNX/q5jUrMdJTtVMH5f7rVOtA+Q0IqcZU2?= =?us-ascii?Q?qkDZe/yLq3zQaIqsY/cxZt0Z3GinrSvnJz97GJfWxG/0GWG49DWSCWOk/ffr?= =?us-ascii?Q?QyWQ2dwp24gqbF/M2A+mAB3ezLmqi6SZPigoHCFQScqBI77HpAWaMBuairi7?= =?us-ascii?Q?6pC6dymNJ1hUfL65t41PzafkALSZFeyJRH1EFyNJ13+uvNcUKq1GBGZl6EFV?= =?us-ascii?Q?NcEa1oc1FaHfkxvZYail+OcDPdxo1/uDYRD52LZebTj26OpiOYPMbbwK3OKn?= =?us-ascii?Q?xJ3DV1UEpapSRih56vmZuT7sJqDBB7Re80d6QAeboXK+H1k2rGwqLU9nTa2x?= =?us-ascii?Q?TCwkFk1cf1jcidJJi4b2LJFu+coD/q73R3znAoJWA4JHvha5jwTRnkfqJYTG?= =?us-ascii?Q?O+KJelyFcHdR0wx5iB0AajpxDz5B6D44qOmAzbwt848RTuKXJkPM53ZAgXhP?= =?us-ascii?Q?0TXQ0v6PaNfI8xd5Q2RYKD7ECsT1shc/rnx2WmE6y5DnpPyGOGNrCdN7FnJF?= =?us-ascii?Q?uQovqdD/7jqGuhv90J393uoO61mRIsGrW2sxPjhsDftp+FASJv+HXByTqTYR?= =?us-ascii?Q?+n6YtFcVhgIFgxyekeGJoGg1wvd74hq4CDRR/mEazny6LNGyT95rDJQEfqPl?= =?us-ascii?Q?VQ3mub4YFcAUFQv7OUmeh8rPRDgzHvp8NtEHPgutgqMl9bRMVvAnL2mC3C7B?= =?us-ascii?Q?lv+CKga4uC1fWWOlRIp4OcD5pqmx/Ejm3kaSmZk2Vq/orBJ/k7/cYqfZL+Ym?= =?us-ascii?Q?x4mNwt1/XC3JDsGH6C2PP9GL9CXgfhY6SJ8W7EGzCDjE3Vky2V4DyvVz1JW+?= =?us-ascii?Q?3eFUYHrmno531IXfqzOAVvlmmDK3z1/S4U/FB3wKvYUn+828aWK/JZAmsa3y?= =?us-ascii?Q?vbl0ASJpj1Ilg9lmZp+GKaHNXBJNSwu+ya7Ks+9FMT/Y2cgcUxmj2/U+7StO?= =?us-ascii?Q?ba06pX0vx2vxNkpbJdejeQpP2G8HOImNwXOL1OGZwpD9q2vTgliFDU7jf+kH?= =?us-ascii?Q?czKlfL83dxOWop2Ii7dG4QPbIVBRXBSH4?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2701; 6:2ZQ9mRRRmI2UmLoSRHr9r12nGKD1FKLjKVehq53BUlVO0mySNbC+OxmH6LRxWmMItLre7fuAAhA236tsDLjFbLxdsXxLqFkoQuAiwyKRQzLBuew9jb50M+RRA8QexeGE0SV7g0TzrSPmFm9gCkaRGQn6ZjeD3Tw8ALpxCsNQvjX/aMBUB7kZIMwteHsig99R9c5Oi4XsFQx+xBrFx1oDZC4BhNRfaMVlsXHoIWEBCE8N4KReJZYU9GWOBSg00KyvmzwuT1s240FOTSB+4PL+35VcBY/cK9k/MvGDXIBmkdn1f2eqdJM0uBOKSwvcrVKvxvFzoLXtnubWtjtQk1euqA==; 5:N9L5Vw0sQoEDg4gAH+vug4uJKWxccIh+I+BbnJHWyhigqo5ijqB0GWoqGl+wryZoIbYt8bvhPpjxz5cfxx7FU/CWbHyuIqGOjLridAL5iWYdjQy9DqU2jvT5ZoCaOX1q7dkCQv0/zOVsNr2dMt3r0g==; 24:lclW7hLuNaqQoVyEg7dOtPRxJfmXD8ImnX6kG/H8dH8GOtrceaVK02lp7H2CTW5FRuCgrQYbbEKaQo4Kxk4pcsZadvHHc9DukcvZdVhruzI=; 7:bIKwThhnlIUArlIVd8VPj5OzHwJCB0XKgsPXMilzaa6NT2v/iet+XkdDIVGW6CMZPmjGXV4sAY2ghFXTfrbOCyIVGcp+ycANz8LBtTq9fekdW4DT3481EC1gwdhfH3T3+/woddX9DNC63Brn23uUthgL4AzgFX5NmzfJLousFTdjgs1mp37cJK3TQlNB+V+rhKEXWYCV4FicpTzGYQR95QEFLLM2jK3Uscu745V7PKCtVSDCvd8SlaRmrabdJ4EdnJQwckYi4+1Euwyv1wzzgcJTEiPoKp8zp84U3jUZvuydwLjeuPBToGEkpVXtASIx SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nokia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Oct 2016 11:49:39.8879 (UTC) X-MS-Exchange-CrossTenant-Id: 5d471751-9675-428d-917b-70f44f9630b0 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5d471751-9675-428d-917b-70f44f9630b0; Ip=[131.228.2.241]; Helo=[fihe3nok0735.emea.nsn-net.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0701MB2701 X-Topics: patch Subject: [lng-odp] [PATCH v3 5/5] example: l3fwd: simplify worker main loop X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" Reduce extra code in the fast path. Signed-off-by: Matias Elo --- v3: - Handle drop_err_pkts() return value (Forrest) example/l3fwd/odp_l3fwd.c | 156 +++++++++++++++++++++++++++------------------- 1 file changed, 91 insertions(+), 65 deletions(-) -- 2.7.4 diff --git a/example/l3fwd/odp_l3fwd.c b/example/l3fwd/odp_l3fwd.c index 0f8068f..fa1b299 100644 --- a/example/l3fwd/odp_l3fwd.c +++ b/example/l3fwd/odp_l3fwd.c @@ -62,6 +62,7 @@ struct thread_arg_s { uint64_t rx_drops; uint64_t tx_drops; struct { + int if_idx; /* interface index */ int nb_rxq; /* number of rxq this thread will access */ int rxq[MAX_NB_QUEUE]; /* rxq[i] is index in pktio.ifin[] */ int txq_idx; /* index in pktio.ifout[] */ @@ -175,7 +176,7 @@ static inline void ipv4_dec_ttl_csum_update(odph_ipv4hdr_t *ip) ip->chksum += odp_cpu_to_be_16(1 << 8); } -static int l3fwd_pkt_hash(odp_packet_t pkt, int sif) +static inline int l3fwd_pkt_hash(odp_packet_t pkt, int sif) { fwd_db_entry_t *entry; ipv4_tuple5_t key; @@ -217,7 +218,7 @@ static int l3fwd_pkt_hash(odp_packet_t pkt, int sif) return dif; } -static int l3fwd_pkt_lpm(odp_packet_t pkt, int sif) +static inline int l3fwd_pkt_lpm(odp_packet_t pkt, int sif) { odph_ipv4hdr_t *ip; odph_ethhdr_t *eth; @@ -275,75 +276,85 @@ static inline int drop_err_pkts(odp_packet_t pkt_tbl[], unsigned num) return dropped; } -static void l3fwd_one_queue(uint32_t sif, int rxq_idx, void *thr_arg) +static int run_worker(void *arg) { - odp_packet_t *tbl; - odp_pktout_queue_t outq; + int if_idx; + struct thread_arg_s *thr_arg = arg; odp_pktin_queue_t inq; + int input_ifs[thr_arg->nb_pktio]; + odp_pktin_queue_t input_queues[thr_arg->nb_pktio]; + odp_pktout_queue_t output_queues[global.cmd_args.if_count]; odp_packet_t pkt_tbl[MAX_PKT_BURST]; - struct thread_arg_s *arg; + odp_packet_t *tbl; int pkts, drop, sent; int dst_port, dif; - int i; + int i, j; + int pktio = 0; + int num_pktio = 0; - arg = thr_arg; - inq = global.l3fwd_pktios[sif].ifin[rxq_idx]; - pkts = odp_pktin_recv(inq, pkt_tbl, MAX_PKT_BURST); - if (pkts <= 0) - return; + /* Copy all required handles to local memory */ + for (i = 0; i < global.cmd_args.if_count; i++) { + int txq_idx = thr_arg->pktio[i].txq_idx; - arg->packets += pkts; - drop = drop_err_pkts(pkt_tbl, pkts); - pkts -= drop; - arg->rx_drops += drop; + output_queues[i] = global.l3fwd_pktios[i].ifout[txq_idx]; - dif = global.fwd_func(pkt_tbl[0], sif); - tbl = &pkt_tbl[0]; - while (pkts) { - int txq_idx; + if_idx = thr_arg->pktio[i].if_idx; + for (j = 0; j < thr_arg->pktio[i].nb_rxq; j++) { + int rxq_idx = thr_arg->pktio[i].rxq[j]; - dst_port = dif; - for (i = 1; i < pkts; i++) { - dif = global.fwd_func(tbl[i], sif); - if (dif != dst_port) - break; + inq = global.l3fwd_pktios[if_idx].ifin[rxq_idx]; + input_ifs[num_pktio] = if_idx; + input_queues[num_pktio] = inq; + num_pktio++; } - - txq_idx = arg->pktio[dst_port].txq_idx; - outq = global.l3fwd_pktios[dst_port].ifout[txq_idx]; - sent = odp_pktout_send(outq, tbl, i); - if (odp_unlikely(sent < i)) { - sent = sent < 0 ? 0 : sent; - odp_packet_free_multi(&tbl[sent], i - sent); - arg->tx_drops += i - sent; - } - - if (i < pkts) - tbl += i; - - pkts -= i; } -} -static int run_worker(void *arg) -{ - int if_idx, rxq, nb_rxq; - struct thread_arg_s *thr_arg = arg; + num_pktio = thr_arg->nb_pktio; + if_idx = input_ifs[pktio]; + inq = input_queues[pktio]; odp_barrier_wait(&barrier); while (!exit_threads) { - for (if_idx = 0; if_idx < thr_arg->nb_pktio; if_idx++) { - nb_rxq = thr_arg->pktio[if_idx].nb_rxq; - if (!nb_rxq || thr_arg->thr_idx == INVALID_ID) - continue; + if (num_pktio > 1) { + if_idx = input_ifs[pktio]; + inq = input_queues[pktio]; + pktio++; + if (pktio == num_pktio) + pktio = 0; + } - for (rxq = 0; rxq < nb_rxq; rxq++) { - int rxq_idx; + pkts = odp_pktin_recv(inq, pkt_tbl, MAX_PKT_BURST); + if (pkts < 1) + continue; - rxq_idx = thr_arg->pktio[if_idx].rxq[rxq]; - l3fwd_one_queue(if_idx, rxq_idx, arg); + thr_arg->packets += pkts; + drop = drop_err_pkts(pkt_tbl, pkts); + pkts -= drop; + thr_arg->rx_drops += drop; + if (odp_unlikely(pkts < 1)) + continue; + + dif = global.fwd_func(pkt_tbl[0], if_idx); + tbl = &pkt_tbl[0]; + while (pkts) { + dst_port = dif; + for (i = 1; i < pkts; i++) { + dif = global.fwd_func(tbl[i], if_idx); + if (dif != dst_port) + break; + } + sent = odp_pktout_send(output_queues[dst_port], tbl, i); + if (odp_unlikely(sent < i)) { + sent = sent < 0 ? 0 : sent; + odp_packet_free_multi(&tbl[sent], i - sent); + thr_arg->tx_drops += i - sent; } + + if (i < pkts) + tbl += i; + + pkts -= i; } } @@ -675,7 +686,7 @@ static void print_info(char *progname, app_args_t *args) */ static void setup_worker_qconf(app_args_t *args) { - int nb_worker, if_count; + int nb_worker, if_count, pktio; int i, j, rxq_idx; struct thread_arg_s *arg; struct l3fwd_pktio_s *port; @@ -692,10 +703,11 @@ static void setup_worker_qconf(app_args_t *args) arg->thr_idx = i; j = i % if_count; port = &global.l3fwd_pktios[j]; - rxq_idx = arg->pktio[j].nb_rxq; - arg->pktio[j].rxq[rxq_idx] = + arg->pktio[0].rxq[0] = port->rxq_idx % port->nb_rxq; - arg->pktio[j].nb_rxq++; + arg->pktio[0].nb_rxq = 1; + arg->pktio[0].if_idx = j; + arg->nb_pktio = 1; port->rxq_idx++; } } else { @@ -705,9 +717,12 @@ static void setup_worker_qconf(app_args_t *args) arg->thr_idx = j; port = &global.l3fwd_pktios[i]; rxq_idx = arg->pktio[i].nb_rxq; - arg->pktio[i].rxq[rxq_idx] = + pktio = arg->nb_pktio; + arg->pktio[pktio].rxq[rxq_idx] = port->rxq_idx % port->nb_rxq; - arg->pktio[i].nb_rxq++; + arg->pktio[pktio].nb_rxq++; + arg->pktio[pktio].if_idx = i; + arg->nb_pktio++; port->rxq_idx++; } } @@ -747,12 +762,21 @@ static void setup_worker_qconf(app_args_t *args) /* put the queue into worker_args */ arg = &global.worker_args[q->core_idx]; - rxq_idx = arg->pktio[q->if_idx].nb_rxq; - arg->pktio[q->if_idx].rxq[rxq_idx] = q->rxq_idx; - arg->pktio[q->if_idx].nb_rxq++; + + /* Check if interface already has queues configured */ + for (j = 0; j < args->if_count; j++) { + if (arg->pktio[j].if_idx == q->if_idx) + break; + } + if (j == args->if_count) + j = arg->nb_pktio++; + + rxq_idx = arg->pktio[j].nb_rxq; + arg->pktio[j].rxq[rxq_idx] = q->rxq_idx; + arg->pktio[j].nb_rxq++; + arg->pktio[j].if_idx = q->if_idx; arg->thr_idx = q->core_idx; } - /* distribute tx queues among threads */ for (i = 0; i < args->worker_count; i++) { arg = &global.worker_args[i]; @@ -821,7 +845,7 @@ static void setup_worker_qconf(app_args_t *args) static void print_qconf_table(app_args_t *args) { - int i, j, k, qid; + int i, j, k, qid, if_idx; char buf[32]; struct thread_arg_s *thr_arg; @@ -836,7 +860,9 @@ static void print_qconf_table(app_args_t *args) if (!thr_arg->pktio[j].nb_rxq) continue; - snprintf(buf, 32, "%s/%d", args->if_names[j], j); + if_idx = thr_arg->pktio[j].if_idx; + snprintf(buf, 32, "%s/%d", args->if_names[if_idx], + if_idx); for (k = 0; k < MAX_NB_QUEUE; k++) { qid = thr_arg->pktio[j].rxq[k]; if (qid != INVALID_ID) @@ -948,6 +974,7 @@ int main(int argc, char **argv) for (j = 0; j < MAX_NB_PKTIO; j++) { thr_arg->thr_idx = INVALID_ID; thr_arg->pktio[j].txq_idx = INVALID_ID; + thr_arg->pktio[j].if_idx = INVALID_ID; memset(thr_arg->pktio[j].rxq, INVALID_ID, sizeof(thr_arg->pktio[j].rxq)); } @@ -1069,7 +1096,6 @@ int main(int argc, char **argv) odp_cpumask_t thr_mask; arg = &global.worker_args[i]; - arg->nb_pktio = args->if_count; odp_cpumask_zero(&thr_mask); odp_cpumask_set(&thr_mask, cpu); thr_params.arg = arg;