From patchwork Thu Apr 6 11:59:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petri Savolainen X-Patchwork-Id: 96933 Delivered-To: patch@linaro.org Received: by 10.140.89.233 with SMTP id v96csp694710qgd; Thu, 6 Apr 2017 05:00:40 -0700 (PDT) X-Received: by 10.237.63.78 with SMTP id q14mr36611154qtf.266.1491480040828; Thu, 06 Apr 2017 05:00:40 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id q18si1200613qtg.203.2017.04.06.05.00.40; Thu, 06 Apr 2017 05:00:40 -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=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 78EDF6437A; Thu, 6 Apr 2017 12:00:40 +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=BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, URIBL_BLOCKED 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 D782860734; Thu, 6 Apr 2017 11:59:53 +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 BAB4F60A24; Thu, 6 Apr 2017 11:59:46 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0123.outbound.protection.outlook.com [104.47.2.123]) by lists.linaro.org (Postfix) with ESMTPS id 18CD26072E for ; Thu, 6 Apr 2017 11:59:43 +0000 (UTC) Received: from DB4PR07CA042.eurprd07.prod.outlook.com (10.242.229.52) by VI1PR0701MB1902.eurprd07.prod.outlook.com (10.167.197.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1019.8; Thu, 6 Apr 2017 11:59:40 +0000 Received: from DB5EUR03FT051.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e0a::201) by DB4PR07CA042.outlook.office365.com (2a01:111:e400:9828::52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1019.8 via Frontend Transport; Thu, 6 Apr 2017 11:59:40 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning linaro.org discourages use of 131.228.2.241 as permitted sender) Received: from mailrelay.int.nokia.com (131.228.2.241) by DB5EUR03FT051.mail.protection.outlook.com (10.152.21.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.1005.5 via Frontend Transport; Thu, 6 Apr 2017 11:59:40 +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 v36Bx46u006028 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 6 Apr 2017 14:59:04 +0300 Received: from 10.144.19.15 ([10.144.104.219]) by fihe3nok0735.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id v36Bx4nK006023 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NOT) for ; Thu, 6 Apr 2017 14:59:04 +0300 X-HPESVCS-Source-Ip: 10.144.104.219 From: Petri Savolainen To: Date: Thu, 6 Apr 2017 14:59:02 +0300 Message-ID: <1491479944-31232-1-git-send-email-petri.savolainen@linaro.org> X-Mailer: git-send-email 2.8.1 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.228.2.241; IPV:CAL; CTRY:FI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(39840400002)(39850400002)(39410400002)(39860400002)(39450400003)(39400400002)(2980300002)(199003)(189002)(9170700003)(22756006)(86362001)(110136004)(5660300001)(2351001)(5003940100001)(50986999)(47776003)(189998001)(53936002)(38730400002)(48376002)(36756003)(6916009)(50226002)(305945005)(106466001)(105596002)(8676002)(77096006)(2906002)(33646002)(81166006)(8936002)(356003); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0701MB1902; H:mailrelay.int.nokia.com; FPR:; SPF:SoftFail; MLV:sfv; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB5EUR03FT051; 1:9aXxo/BoW/+HM0gDqJzPEzKkSUC2jc7sNOhENNVcCoZkfI4nc1vf6Fv3DzcKnZaDz7BewGQeZ5M12GQLMRUGgMjbsnKwlqJntdHKRX3YwqOMRpWnaC4zA3+MlQyDyjQ3Y8Kow48kjxy/YcDg+kx0Jc/w6UaTu0DUYyuemg4RvdBcKiJsYkYUhCQjcbRBq9Zb17WbK1nh94FAl7lLSc2bC+uPHK/KBhv68CeXeBcdrrhzGq5AIZ7VmuFJzDIlCMFoaU1pey+9Y+fc1KRmqhTrY74pTCQq3cNGIVBH6tDy77fv1DPCt+FlL34sdPn7Kp3wuI2N3LFJj43TFwLg4na2if5ySTwCqoRtN4LqWiLlKKAcw92hU6Q9FL+OFcLxe8KFUKGG51dsNl1ywqSC2U1xkg0Co5HzcTBKHv+oziaCjHdoFN9u0TCKFxBfN3Ku3G2nHISZq9bHv4rGQkQdUoD5+qssft6j7Z8K32gbkMx5CPhIPs3p8VZlOxLyf2WIerKPqxSQrKHn278nmWG787MNRg== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 11ac36cb-441f-4218-50c8-08d47ce467ee X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(201703131423075)(201703031133081); SRVR:VI1PR0701MB1902; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 3:GPnjoj4kr1S+sxQZENQA6KdqBYdJbPJcXPgIBClwEOt5qLTKBzfCIxRrP3KkAKNvqVj8A3qcQndAndvN2qrJzinFplhlh6eP59ppQLPiseh1E56blwpZ0vIKiiMEtuX3mhN7C4y53WZ8b4kRrRcNa6l+Faffmtxbsav1+Gd0SI1H2N8e7u9rSK/wGmtdX2jf6AZ5shTBFw9yhDGFCzYg+DN6pX6DucV633baKNM0dg0WjuP/yjq1X5rsCb5aLIF6+PWV1TTW/MGSvHV/bEyChssbQjh0q95L800NNte247yi/PPZNlRKj3dw0lLTKBTgN31lpu3vgYVAvYwhTCd3ZnG4rO1XaMQAhS0Z3snkU/2IFJQfLrfQiAJvdsfqcuv0Mb7qw+x6ILJgBgRiD4eeQyQX0dIN21f0ei1n+OIRPwHOAANmoF3+0cPkbkWTjwpMUC2OwNfxbexyJ9LMdK8/xg== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 25:pZz+eOAjnckgaBuAKcp8OpDx+SAXtJC8ahX3reJNxFpyOiRCK5k8k3oMbPv2/gneavkgqSrumCjDNF1l+slOmVDGyP06D/AteJ1eH6pBqejv/X0sgeNNzIiQ+ranc55yS/nCqIlxSGabC2GHoVY32K0aNHLfn0bjJObkUOR41VGxAylNXDo6ZUp5RfDQSZOdQWrVGf/kf4W75Zqt5WYuHLIM1M6JsxGt3ahfWtOw+E70JdhVXfXEK+DCQBUp26DzI8oYDHRKDpBSG/Ny1MmIfus+UUNPZk3ms+enabgHRmIlPAYpW4iH0udlfPm2hwCzRXKCmamDvUjmLJNbtEmvNT4Fm5AyRHZl2VzYScAR4X8t5Ra4P7oHnJjySax+Qy5BvZbQQ2+r7ASoKXN5mv5Sd9Tb04VexAtkjd/bICokoqUoWDb8nAkNf5sfMfX0EzHj1JffP3/ocyzij/OE7r9nQw==; 31:9gUilqDbosSxCzKVBSV1CyaWReGuthvzPslmuA8J0fsVVN7Mof4slC21+go1blqC+U2J6YePv/kag6zyWpsAFPVcNfcvZ2mMa/UihHm+sx+urVI6FH07PuBQSEYkBFYedfK/h0TuBl0Q79Fb5mV8lGKoKW7nPmjSIl67LazRxegYDizxPGg40hSzXIXpTQh4/pMz+BSSRy9yvmh23ThiQpkD4754MBQG1RuCPIuf3SpE6q3vl88ZjDjbBI+DqLvdwQc+1LpUuMzDHODyDpNNqQ== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 20:5XsDyHOIksIFgg2c2qQAvRnhztEtsuWklR8bsJvNaGYy4KYi8DMcXTQ170ixHTTeL7FHN2FE4KkvjCgMYQ9w+yFGOa5B4YlGQV6ZO8xx/aoU0APXmOcq9/T4+OpsHqlWMPtLMC56IEb4sJNmsrEKvHN0UZkjEzb10sohQRlInuPYjRJbrtej0b2np6rqaAqZnuCHJIH+yYdRVe/pG1TfDMwj83vL1HL69lirhKw5LC2Fzluwmhpr947v4fTtZOu0JhsTcm8AZP1ca2q/ynIEPmJbluZUVxPv4TiOoOMVa+d/lXNzN8YWPCBQ1VZB4pzMSaMQv+QS0tgwzGPUt0txI7gxZYNmlxTa0lp/NtmdiNm9brTIKgYy7aVXXs48cVpShezcwjMRQwXrd1zstQpqX9aP537tOmsQLZiGasBbUJIj7wIyS49y5uSvlAsO3o2i5o7BDYtmTfbjY8oCj2UTe/8T/EdnV93uh8T6v4kUhAaJ/0dBvusYrFmpM6Hbyp25dz0ARq0IueNrsTDDakKtIAKIr2y/aKDb+FglkoUll1OODLFumTj/H5MAtoEkKcrN7BoSC454uP7EAJPWpK1AwLbHRQKSM8cGwo+nF+8tXMk= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(13013025)(13021025)(5005006)(13023025)(8121501046)(3002001)(10201501046)(93006095)(93003095)(6055026)(6041248)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(20161123562025)(20161123555025)(6072148); SRVR:VI1PR0701MB1902; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0701MB1902; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 4:qVkArhje16OJExaZVZ87s6rIUsrNv/QGWcjOMY1p7QDj/SxmfnChEGCftYkOgNyjSXAThyDVkrKC0CAzex1FaXZiyUCM4fxxvZyiJkmj49Se9PDd0/vgh+G5RiZfOJlKj30aUkGqfkT5GHLaygTzr3XELUiuNQs93BXKrSWKAYYgZITKo10rDRp06JHTiLWJCPQlzXcmpk4MHiksf/ZZcysUs+rdOg9l8J2ylfqKb3YIJN3iL7w2xVQME3R6eBs0cjvwlk/+qZai6If2VkL7hn+oif5hHXq8E8NewkRBONQ44Kv9dJUrpAVuEmlyJ6asH0x7ygtkq3Lr6Q3kDyVtXncWt9JXFzIYA2eFn11JTxTBQ2FfZIVFD+RV/YSqUjCby6mcOQy4AQFOi+lFAkTa+L/HBuF/uCL46YC88e9+y/v/zjRKDPEiwU0lNig5e63EihsJXGHAnqgMrzWqwLqjpr2OzrMG9DtNxFI9rapMPNSKDGW/sEqROePvyIDkoo3Nc/JMEMBA4zuVTATguhzN4PCL4s9waxrcSwHrCrwuRadn2KX4NWvIV9t2Oha5yC7F+xbvGG2qIUFzHfEztc/3h1WsmCGimMgE/Kw2T+xy03Rgr0o7sLJglbE781yatNFxtv6X3GjccOBnMZeGeHFiWjr6sj5OSC1HTOAo1Nva5GsSQ5rqEaIfwR6UhPRNDWD8ZQh/pb9eeU1JaXO9szY10r8HgKk/vFZB4v0vl/sR9wSYe1V0/aYBS4nNuXrRsE12M3u2sH0etNUnKyCFI3RLTRpM29GZu0OinHfBySUORf0= X-Forefront-PRVS: 02698DF457 X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 23:pfdTJYaQiE4k/4ULNaf9wXv2dAy9PPlspMkLklWBwavAp0i9nN83zRCrz3uciO3YCPVJPFHq41hO23A4IYY/PxXBsvN49IMmAnzkTEX7TFwWqXkzKtXP+DQ1en+RnmcTuiAWd//PFWZWVTSsUczFi7JtceHNvIZuWtjMd+dDog9BSQUCMF6wnE97qxdRBvgEVIAoRQGvjaogIdBPvB6uPf4Oc4Tfg/rG6SyfC28x/w30RysczZdW0Aet4G9yFkbbO901kBvWMNCn1lm2/cNUzBpSJ4Ki+6zwrkhcvYbbiLe2wikzZVUxbWOdNd+SgaKfe68N9M9hh0DozrkhDTq0LdbNVnoxbz5pFGg3VPcspUwAMMov1qRxGlvVo78/ilB0+CnusALyeajKYSZvL4X/e3zEbn4G3XlwIDxIrzrituTKyYV52xmNXUGkm2Dnja0b4iIqlVO9CUG7LGqvUf3NoAl/UP1m3j9igpIVlxAEtwz3AWQrW2kAJwUCELOD/ad5FgJl+MSG3yqZbQ08Aqf+l4AJO6NJ5D8MHCU4OK9Ki9hcJacjo79USXKjeDwrL+bbAl/IkwMYTFYrZPx+J5BVI44QJqXUFwVQU5vAozuX/S5uXwej9mEPpKxkVa93lkUE1wgXoUqJbu2V3gvooLEaw2/uTw0ZyietTUjBvkBgB2SLEZVLTJbDQDVgMGZM+7eCmUpXhmkF0zOSYiNHl1/Z2hWds54XC7pVGRaWrVyO58Ar+2xeV+WXkYOjV3SYjlOJPdoWhwJIrpTsfOecBBIt4oXpgCWcEoDeqWFPkh9RbSfIB7nOL+M7Ka27E0ZQ0EtOLiH5/ywtvjr/y0aOL/P04I7CGzHq2VRysX8wSLVMpizwNbASPOCM0Yv1GoU3Eu5AEWwJcSvcz3MRkD10gBFVGIcL2ju0xQUKB9/zOEHlFWQ9I9z9agWFtf2GL7F2hH4q X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 6:vebPZ7OUgRBH0KmML53Q0oLbtq5LD7Z4YXhbXTDw+Qm05w3f5jXZhic7yp7Am+UptEq6CzqS3n1JIqn+8udhEyBVUnl7ZBRPrrIgF2qJ2v3+Qpm/QdwOCzF2eJQAQ0lJFgs9IBO9RtRF+6KSauzHP5gnO/eYWmWbC0ZJ8jxn7BlR7SvplqMQaHnhRSHNyZQL5L5pr+6MOzvzf/BE41vYT6UXrdXcRCoVmTddlrShe5J0tlup4YlWALDkBFbGOanPyn7fpBTCGC24q2tITIRz02iqMmgBZs3iboVmytj+gOOTvDCm02CjBp+cYIm9doRTFr0vJAEUoG5A+3aoy9JpwFkgM0nXuqX1Ha2L+1HoxqbSkW8SQ2tB2hXqbEwKzMZgiLt8mGJjQg7R1M4ZhHICtDq8SP9rDLAzZ60XNXUNdc5BFaQx7t39D+jDrwFnbBtSIopnClZnIA6xmKOnlwIx3XYw9mScg1ATZBjrbMxxLME=; 5:kTA9gDUXfhLrHdoKFO0ZHUOCUJp6znPQYDZ6SWGsBzWo1IAFAIwLn/3Xn9stKbnmc2CRYHhO4g9Lm8/F/COJmQh2lRLWW9+U4iGJFLlnD+KyENQM6dFEyxDPpwj3o8z2Gb7Wj7yrnZyI/ZfnevImvg==; 24:qVQuMb0iEYOJMQmUK6mGu+YTkFK2s63FXIk25lXR+/1yXC/WwvGjRmGFreQwlO5mh4H/r5Uvdkkvd6x51DL5932iU9G6pl8Evrnch2P15VQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 7:GKHwvqbVFbqYulhtBaUZPJI3ODqCJHJeL5EPm4lS1K+hmmUDj3TAqQo51eYcbMHIZAPqRZU9DPmZ2ZbKpz8pD5UgpzRmwqwUgmecueMs7rrzcGlNCoxaAsTYnURwQ4BWPiTxx9Xu5NT3nkNMwN1KsBXESzuEJH4CiK1ayDENtNFMj/xdlcczMMH2pPFXL6lN7JILOcsclSrCDWfoZlRvYovDWSbm1mHRXQ/ooTBzEoJfektIybDLfBZYXpOTCQ498B3N/u3X3C9hDW1d7norlRQY7/M32JLJgIOuQ0wUS2YJujaXFebVjJVtjVIG0apzCluJZekQdrCJ32Sm6PPkYw== X-OriginatorOrg: nokia.onmicrosoft.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2017 11:59:40.2266 (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=[mailrelay.int.nokia.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0701MB1902 Subject: [lng-odp] [PATCH 1/3] test: l2fwd: add group option 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" User may give number of scheduling groups to test scheduler performance with other that the default (all threads) group. Both pktios and threads are allocated into these groups with round robin. The number of groups may not exceed number of pktios or worker threads. Signed-off-by: Petri Savolainen --- test/common_plat/performance/odp_l2fwd.c | 148 ++++++++++++++++++++++++------- 1 file changed, 116 insertions(+), 32 deletions(-) -- 2.8.1 diff --git a/test/common_plat/performance/odp_l2fwd.c b/test/common_plat/performance/odp_l2fwd.c index 8f5c5e1..33efc02 100644 --- a/test/common_plat/performance/odp_l2fwd.c +++ b/test/common_plat/performance/odp_l2fwd.c @@ -104,6 +104,7 @@ typedef struct { int src_change; /**< Change source eth addresses */ int error_check; /**< Check packet errors */ int sched_mode; /**< Scheduler mode */ + int num_groups; /**< Number of scheduling groups */ } appl_args_t; static int exit_threads; /**< Break workers loop if set to 1 */ @@ -130,6 +131,7 @@ typedef union { typedef struct thread_args_t { int thr_idx; int num_pktio; + int num_groups; struct { odp_pktin_queue_t pktin; @@ -142,7 +144,12 @@ typedef struct thread_args_t { int tx_queue_idx; } pktio[MAX_PKTIOS]; - stats_t *stats; /**< Pointer to per thread stats */ + /* Groups to join */ + odp_schedule_group_t group[MAX_PKTIOS]; + + /* Pointer to per thread stats */ + stats_t *stats; + } thread_args_t; /** @@ -297,6 +304,22 @@ static int run_worker_sched_mode(void *arg) thr = odp_thread_id(); + if (gbl_args->appl.num_groups) { + odp_thrmask_t mask; + + odp_thrmask_zero(&mask); + odp_thrmask_set(&mask, thr); + + /* Join non-default groups */ + for (i = 0; i < thr_args->num_groups; i++) { + if (odp_schedule_group_join(thr_args->group[i], + &mask)) { + LOG_ERR("Join failed\n"); + return -1; + } + } + } + num_pktio = thr_args->num_pktio; if (num_pktio > MAX_PKTIOS) { @@ -590,7 +613,7 @@ static int run_worker_direct_mode(void *arg) * @retval -1 on failure */ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx, - odp_pool_t pool) + odp_pool_t pool, odp_schedule_group_t group) { odp_pktio_t pktio; odp_pktio_param_t pktio_param; @@ -650,7 +673,7 @@ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx, pktin_param.queue_param.sched.prio = ODP_SCHED_PRIO_DEFAULT; pktin_param.queue_param.sched.sync = sync_mode; - pktin_param.queue_param.sched.group = ODP_SCHED_GROUP_ALL; + pktin_param.queue_param.sched.group = group; } if (num_rx > (int)capa.max_input_queues) { @@ -1016,39 +1039,46 @@ static void usage(char *progname) printf("\n" "OpenDataPlane L2 forwarding application.\n" "\n" - "Usage: %s OPTIONS\n" + "Usage: %s [options]\n" + "\n" " E.g. %s -i eth0,eth1,eth2,eth3 -m 0 -t 1\n" - " In the above example,\n" - " eth0 will send pkts to eth1 and vice versa\n" - " eth2 will send pkts to eth3 and vice versa\n" + " In the above example,\n" + " eth0 will send pkts to eth1 and vice versa\n" + " eth2 will send pkts to eth3 and vice versa\n" "\n" "Mandatory OPTIONS:\n" - " -i, --interface Eth interfaces (comma-separated, no spaces)\n" - " Interface count min 1, max %i\n" + " -i, --interface Eth interfaces (comma-separated, no spaces)\n" + " Interface count min 1, max %i\n" "\n" "Optional OPTIONS:\n" - " -m, --mode Packet input mode\n" - " 0: Direct mode: PKTIN_MODE_DIRECT (default)\n" - " 1: Scheduler mode with parallel queues: PKTIN_MODE_SCHED + SCHED_SYNC_PARALLEL\n" - " 2: Scheduler mode with atomic queues: PKTIN_MODE_SCHED + SCHED_SYNC_ATOMIC\n" - " 3: Scheduler mode with ordered queues: PKTIN_MODE_SCHED + SCHED_SYNC_ORDERED\n" - " 4: Plain queue mode: ODP_PKTIN_MODE_QUEUE\n" - " -o, --out_mode Packet output mode\n" - " 0: Direct mode: PKTOUT_MODE_DIRECT (default)\n" - " 1: Queue mode: PKTOUT_MODE_QUEUE\n" - " -c, --count CPU count.\n" - " -t, --time Time in seconds to run.\n" - " -a, --accuracy Time in seconds get print statistics\n" + " -m, --mode Packet input mode\n" + " 0: Direct mode: PKTIN_MODE_DIRECT (default)\n" + " 1: Scheduler mode with parallel queues:\n" + " PKTIN_MODE_SCHED + SCHED_SYNC_PARALLEL\n" + " 2: Scheduler mode with atomic queues:\n" + " PKTIN_MODE_SCHED + SCHED_SYNC_ATOMIC\n" + " 3: Scheduler mode with ordered queues:\n" + " PKTIN_MODE_SCHED + SCHED_SYNC_ORDERED\n" + " 4: Plain queue mode: PKTIN_MODE_QUEUE\n" + " -o, --out_mode Packet output mode\n" + " 0: Direct mode: PKTOUT_MODE_DIRECT (default)\n" + " 1: Queue mode: PKTOUT_MODE_QUEUE\n" + " -c, --count CPU count.\n" + " -t, --time Time in seconds to run.\n" + " -a, --accuracy Time in seconds get print statistics\n" " (default is 1 second).\n" - " -d, --dst_change 0: Don't change packets' dst eth addresses\n" - " 1: Change packets' dst eth addresses (default)\n" - " -s, --src_change 0: Don't change packets' src eth addresses\n" - " 1: Change packets' src eth addresses (default)\n" - " -r, --dst_addr Destination addresses (comma-separated, no spaces)\n" - " Requires also the -d flag to be set\n" - " -e, --error_check 0: Don't check packet errors (default)\n" - " 1: Check packet errors\n" - " -h, --help Display help and exit.\n\n" + " -d, --dst_change 0: Don't change packets' dst eth addresses\n" + " 1: Change packets' dst eth addresses (default)\n" + " -s, --src_change 0: Don't change packets' src eth addresses\n" + " 1: Change packets' src eth addresses (default)\n" + " -r, --dst_addr Destination addresses (comma-separated, no spaces)\n" + " Requires also the -d flag to be set\n" + " -e, --error_check 0: Don't check packet errors (default)\n" + " 1: Check packet errors\n" + " -g, --groups Number of groups to use: 0 ... num\n" + " 0: SCHED_GROUP_ALL (default)\n" + " num: must not exceed number of interfaces or workers\n" + " -h, --help Display help and exit.\n\n" "\n", NO_PATH(progname), NO_PATH(progname), MAX_PKTIOS ); } @@ -1079,11 +1109,12 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) {"dst_change", required_argument, NULL, 'd'}, {"src_change", required_argument, NULL, 's'}, {"error_check", required_argument, NULL, 'e'}, + {"groups", required_argument, NULL, 'g'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} }; - static const char *shortopts = "+c:+t:+a:i:m:o:r:d:s:e:h"; + static const char *shortopts = "+c:+t:+a:i:m:o:r:d:s:e:g:h"; /* let helper collect its own arguments (e.g. --odph_proc) */ odph_parse_options(argc, argv, shortopts, longopts); @@ -1092,6 +1123,7 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) appl_args->accuracy = 1; /* get and print pps stats second */ appl_args->dst_change = 1; /* change eth dst address by default */ appl_args->src_change = 1; /* change eth src address by default */ + appl_args->num_groups = 0; /* use default group */ appl_args->error_check = 0; /* don't check packet errors by default */ opterr = 0; /* do not issue errors on helper options */ @@ -1217,6 +1249,9 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args) case 'e': appl_args->error_check = atoi(optarg); break; + case 'g': + appl_args->num_groups = atoi(optarg); + break; case 'h': usage(argv[0]); exit(EXIT_SUCCESS); @@ -1305,6 +1340,24 @@ static void gbl_args_init(args_t *args) } } +static void create_groups(int num, odp_schedule_group_t *group) +{ + int i; + odp_thrmask_t zero; + + odp_thrmask_zero(&zero); + + /* Create groups */ + for (i = 0; i < num; i++) { + group[i] = odp_schedule_group_create(NULL, &zero); + + if (group[i] == ODP_SCHED_GROUP_INVALID) { + LOG_ERR("Group create failed\n"); + exit(EXIT_FAILURE); + } + } +} + /** * ODP L2 forwarding main function */ @@ -1325,6 +1378,8 @@ int main(int argc, char *argv[]) int if_count; int (*thr_run_func)(void *); odp_instance_t instance; + int num_groups; + odp_schedule_group_t group[MAX_PKTIOS]; /* Init ODP before calling anything else */ if (odp_init_global(&instance, NULL, NULL)) { @@ -1374,10 +1429,23 @@ int main(int argc, char *argv[]) if_count = gbl_args->appl.if_count; + num_groups = gbl_args->appl.num_groups; + printf("num worker threads: %i\n", num_workers); printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); printf("cpu mask: %s\n", cpumaskstr); + if (num_groups) + printf("num groups: %i\n", num_groups); + + printf("\n"); + + if (num_groups > if_count || num_groups > num_workers) { + LOG_ERR("Too many groups. Number of groups may not exceed " + "number of interfaces or workers.\n"); + exit(EXIT_FAILURE); + } + /* Create packet pool */ odp_pool_param_init(¶ms); params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; @@ -1399,9 +1467,18 @@ int main(int argc, char *argv[]) bind_workers(); + /* Default */ + if (num_groups == 0) { + group[0] = ODP_SCHED_GROUP_ALL; + num_groups = 1; + } else { + create_groups(num_groups, group); + } + for (i = 0; i < if_count; ++i) { const char *dev = gbl_args->appl.if_names[i]; int num_rx, num_tx; + odp_schedule_group_t grp; /* A queue per worker in scheduled mode */ num_rx = num_workers; @@ -1413,7 +1490,10 @@ int main(int argc, char *argv[]) num_tx = gbl_args->pktios[i].num_tx_thr; } - if (create_pktio(dev, i, num_rx, num_tx, pool)) + /* Round robin pktios to groups */ + grp = group[i % num_groups]; + + if (create_pktio(dev, i, num_rx, num_tx, pool, grp)) exit(EXIT_FAILURE); /* Save interface ethernet address */ @@ -1473,6 +1553,10 @@ int main(int argc, char *argv[]) thr_params.thr_type = ODP_THREAD_WORKER; thr_params.instance = instance; + /* Round robin threads to groups */ + gbl_args->thread[i].num_groups = 1; + gbl_args->thread[i].group[0] = group[i % num_groups]; + gbl_args->thread[i].stats = &stats[i]; odp_cpumask_zero(&thd_mask); From patchwork Thu Apr 6 11:59:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petri Savolainen X-Patchwork-Id: 96932 Delivered-To: patch@linaro.org Received: by 10.140.89.233 with SMTP id v96csp694345qgd; Thu, 6 Apr 2017 04:59:56 -0700 (PDT) X-Received: by 10.55.108.131 with SMTP id h125mr30590780qkc.199.1491479996134; Thu, 06 Apr 2017 04:59:56 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id w3si1195386qtg.225.2017.04.06.04.59.55; Thu, 06 Apr 2017 04:59:56 -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=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id BD40664368; Thu, 6 Apr 2017 11:59:55 +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_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, URIBL_BLOCKED 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 7C65B60762; Thu, 6 Apr 2017 11:59:49 +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 4F17560A24; Thu, 6 Apr 2017 11:59:46 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0123.outbound.protection.outlook.com [104.47.2.123]) by lists.linaro.org (Postfix) with ESMTPS id 9F3FA6097D for ; Thu, 6 Apr 2017 11:59:43 +0000 (UTC) Received: from DB4PR07CA013.eurprd07.prod.outlook.com (10.242.229.23) by VI1PR0701MB1902.eurprd07.prod.outlook.com (10.167.197.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1019.8; Thu, 6 Apr 2017 11:59:40 +0000 Received: from VE1EUR03FT041.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e09::203) by DB4PR07CA013.outlook.office365.com (2a01:111:e400:9828::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1019.8 via Frontend Transport; Thu, 6 Apr 2017 11:59:41 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning linaro.org discourages use of 131.228.2.241 as permitted sender) Received: from mailrelay.int.nokia.com (131.228.2.241) by VE1EUR03FT041.mail.protection.outlook.com (10.152.19.163) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.1019.14 via Frontend Transport; Thu, 6 Apr 2017 11:59:40 +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 v36Bx4NF006034 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 6 Apr 2017 14:59:04 +0300 Received: from 10.144.19.15 ([10.144.104.219]) by fihe3nok0735.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id v36Bx4nL006023 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NOT) for ; Thu, 6 Apr 2017 14:59:04 +0300 X-HPESVCS-Source-Ip: 10.144.104.219 From: Petri Savolainen To: Date: Thu, 6 Apr 2017 14:59:03 +0300 Message-ID: <1491479944-31232-2-git-send-email-petri.savolainen@linaro.org> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1491479944-31232-1-git-send-email-petri.savolainen@linaro.org> References: <1491479944-31232-1-git-send-email-petri.savolainen@linaro.org> X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.228.2.241; IPV:CAL; CTRY:FI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(39840400002)(39850400002)(39410400002)(39860400002)(39450400003)(39400400002)(2980300002)(199003)(189002)(9170700003)(22756006)(86362001)(110136004)(5660300001)(2351001)(5003940100001)(76176999)(50986999)(47776003)(189998001)(53936002)(38730400002)(48376002)(36756003)(6916009)(2950100002)(50226002)(305945005)(106466001)(105596002)(8676002)(77096006)(2906002)(33646002)(81166006)(8936002)(356003); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0701MB1902; H:mailrelay.int.nokia.com; FPR:; SPF:SoftFail; MLV:sfv; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; VE1EUR03FT041; 1:QLOiiTU0cejGsRAZyuoFEpU+NThvi/ZR/oJ0cZs5q4/njo6BWfeTCi2MpTxggD1Nr6HEVkl4kCinll2LN5bVEIRMBdT8bpJLTqz8cBqDOEZ5A1+LPs1X0nnmYpRgiRBB3GX+1z3HSbS1A06+5LjiHzcM4dz7xzIE0EBKN2xtodxYALBQxSsev/UJkjGLlvq/64uWtWOA2ZdtwLeml2kPiDhekR8ipQC98TujGAna5c58LIqF8Y2sSN/iCKKe9nOm/xGHDXgp9Qco2NUJaFSEMMbVLdIoLq5figoMkuKY9z51/76nDYFH66DmscjapEiA6gpknkkF5y7kkQAM5MaW9gTLniBDSlce5PgNk2ulqrMCy5AxliBs0RtD5YhwtBEzm2qIZ8fV4Y3N3UTZ98tg5oP66CF9mJfrrrPiYWvBec19O0posIyM4X+wrL7YjTDtlbMG0PFNLzw9VYCzoexWfAfxzmSpaefZnzth8Eaknb6Y+VMMKP3D8eW9noCDmmVn+O57reFh5jwQlbSB2wVNdA== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 674cdcbe-f85d-4032-a97c-08d47ce467f9 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(201703131423075)(201703031133081); SRVR:VI1PR0701MB1902; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 3:xlq1HRKDO4Uiu7o7ynohIi/uIMTqHSxbH4RvBsrZlF+U2lQMSvxcILAaqd/jVMLy4Nysf3Xkr7CXk+jHHxV88PbKNiY3ct9rvhihL6/AvRCgKwNZptLPe0mDglHXJK/B03/pRxXlaG1M13mnaImPtVGjiIEYjRK89VxtfvzrqQ6ZStnqBggjqtggh8EcFyvxKw+M9CUfaRgMpmrS+z8kMYOvw5BA5G9WeUts1zqGEEPacG3DjLksEU4uzlDzfHeb0nOai5JBjYMd+PbyemIn+EXOUAq7234I9ORkOECCkg2fMjhls3c4oM7efGr7Tn4ok4aw0afuTwWFAChLWNHVhfrhzKaQyq+eYvcsu2olPgYS3RtSy2yhL/1MuKfVwkPm+zmp9v7f/i+a8CZPPgI/wXYgOSwcW4FJUAv3UJIJp4DZ5gbmMSiSmWCrd0NZ4+fw72kh2E9igolRpVTImUSb0g== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 25:sCeAS79WgP9IJZn2eNyH+wQHG79oF+cJW2iVnQGbHAZEmlq9mG7DMJReZ5wYTUb3pUDwVfZJc3f4awdmgr2tNRS+UkzKbeiWnTkcVhTlJgsEALTH9UkpgdFKkyN1qlolBXNcHtqj643A9ffvHzt9Yq1IZaLL+a9FURkTGThI9mOjlfiTzkZw5R3HkJE01xXdXk/40DhtmXh08etOpKXNQYBwIzpCktzrWkBp1JpI/g9y5V0CC6sZ/eCoJW1y0sgmXeAU68VPjYuLJo3UvDv/clKhsGadXOAYByPPnSBvPcVJ6Qi5BkNMCD86eEePay/qUNkTAh4/gY2cQYc/+8iX+2LkhTQJsdh+ZWD8mk38ui2F7+Uxt6seN/11fKI661cUqfCr692ScPSSwAf6BP0oPruvYJjuunxf/KWhLMtWPQMYeDksqH6uan19PXhtf2e5pZdgrNlXg5cMvNmjNnYqHA==; 31:jGd4JIRCufQzUVs9aXhAUg4ePH48HgbBz39HOYejFFOJan/Sb80GcR0tA8hF7nHlYMsGb9dN27UoJgypq/CwgJjf068okLmP2R38lfx7dhvc/zJlw6igKgqRGQlvYwo2QH5PfnFvncZzvwBWbyWyMbKAHdDNn8U5M9YxhT6D6wnVEGiwHGLoztLXJYDDQpXqolLf7PIBJqeogAKzQDyy7925kGuS7+uZ+yfcBUXFMhkjhNivbHae+QOY0HIDGAR+36YXeNTwKx1iuxeEb0D1IBuv3yTPNMPpgD3xYkfo270= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 20:xumA+olDG56CwAqKZkCZ4osIf6ubDdkIdwCQ9v7HJbokzFLRbT50gcxHbAe9JH0f9QcCysR8KKQRuw42tr6iqD2vDtowemD7lFRtoDjtqo53maX0dJmrmcfChFOBmuHWfChzokEB3vf8uJGDML4SnV3tmUZn+vnOLTjScEtOQ6rY76yexVQoDzmsCB+CHmRxAgU1SdlXk5RMT8XOf3r+YV/izl8lN2quvp/IvYTLLGIukGwh8EbthCOTo/fhEdv3y29aj9FjePy/y0wMIGscCoYmG7LadfhIJ+2RMGn+yDaw1S9cNQ0sQTH5Yr4mxlqMabq4e6v1wupGwJpzpKi9ByAs+kgtgAiIkDYK189OrRVPCM0mkhtVvfZJtyx8I+czKUHQFkmycB1avuQ+11w++qau+LyTiFK0CJEVJ2cHTB1PdiPRyEsIM0O4LnmP4K8BtUfflvLc4CDdUd/DJ3nH+FMiSIlL48msHETsVp8gU55OUlBiOt7HInMklBnE+TtHb1wME1lxTVHLBFEEbks0bt9HE5WCrsw2a9AHlMy7Gh0px/ai/YbZ5Ol0cDoWZpOM19jw6jLN1zFHFnvEN4mvsLP6ScHDhW2WbPZ3eMkNMwk= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(13013025)(13021025)(5005006)(13023025)(8121501046)(3002001)(10201501046)(93006095)(93003095)(6055026)(6041248)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(20161123562025)(20161123555025)(6072148); SRVR:VI1PR0701MB1902; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0701MB1902; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 4:1Dfbk8/Lp16wxf9L1lAU/psa3UJxtFgzweQG49zXIxiSRiTC5bHv7iyoDF03VC5WKULYRg8hsPUl3EvWs+TMJkmPLS1aOeZPvY41PApQiVZq0A/1S5CKrJj7BPX2AjhNJsC4Mna22yFl1U6vkYlRE8HoiTTJmSOQktZ4iDfRmFuej4z6uCak8p2kauL9DRqdLwuc5sMo0QONjJXsv7XEPH2TjOSUeW2gDZICkqP8qge/HA2D0zpO9DXgHjXhI/lXVgXBrIQp5oicWSVeSLOwwGRynXIIyoyw3kIWNUUzSkPjYbVCWwfdu4wlzPyYjxo/rglbz89LuE6jvX7jjPYTeOkCsEKyeYQaQ7cAtYaDQ/E+6hX2HEYAjqzhKglqD7GDpWwgPfeivNOOZVInS2nTgvMX+jM0NlQall42IXT0BMr4d8Ve5SKFbTHAMmOgIf9m5+hfElMqr+lNvP0aUhnMCxv1/IJgASndM5KyQ7aHs0bLTkqwg4Y2qvQ7bbkT60rXFRG+hCu426rraes1Lxeqxb2gxC3HNehSTHTJ9XM3mA36YbU49NwQnmD4rusJxkExXs6Lr/ddPS4am6x+jIfMoQUkU+5n9dRdsQ6GFjDiCg94euTNfrUjfQT5D7DU0+Za0klIVJdGcE9RRewvbTl+xyNVsr+8Frgz8e/Pd5Ny5MTCmkSKTZ4qZm9JQ0EJ/b8oFW0Lc8Vhr5BPii0hD5RPkforaneaOerf8AVpCnJoYHwQz9lblErjCMmy78AbOX5A3PI2o3Z5lI1jeY2RbxGACMxGc3wv8Z4QU0PTcfK1KGY= X-Forefront-PRVS: 02698DF457 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0701MB1902; 23:4gLn3/r/UtOZxdckfhfdAdUa2uoXXIoG0aI+knR?= gk19fkMDMrCNukWmjGw+8g/YLw60iE/dSNGO3A8pw9yZwQreiW1KymWCZ1Buq+D/8itrn7M8T0xMr6CbFsEh4I8cC8i2fwKYZZDYDGo2ienVw5pzmbO1o0jlk66zP2ArAFlIirW7bn3mauSNXxU6ltjf+fOeO8BzLF8543y1ZXfj+iPQS0Vtx6oi+epXsO8MfROnfrTYFCnPcdv59dSQ7lfGQJFCnz1diExS8WIke8wOns30MdDdrfrNtdyDh3s0SU7emYaMfNTabYVS9e5AlGCUsJBXxM/H34SeEPrUnUb9qrXCuMauKcFKVbv09qWGmFAw8Pkf7q8dp59t+GYo1gcn+Oezr4lRInyk09Xzsxk7a8MSU0GzmULPCgDSMDzyibHCHCOwRq8NOjVNSfUQaH3roDTauv0DHXrfByhCwH/9FlmmERlS5+ABfoPmeJHJ4oyLPmg6PlF0Zxq6jSpoUnnvVTEtI9ZxZKVkXp4M9j5g/iIn9kbGrBYhO0jN64lcExqdNyESOyX1hPFQ+nl4BvECgWGMdiyPFG0ZU/rSTFWAeuH/y6OnR41T48dQrPPYH9qexg9W62JjpNB/nsnPx5JW5CgvJ6E6J1CRr5rEmP94G7MV25omYCnN/y/eQ6ZXMTslKgm/fesgUwQexjiu7xDAqNN0pebcKgXK7tFZje+LmEFbYHHKlailTXO50uuuMjZdsP2R+KOI8BTLpBmAb1inAw+Dg5Ys8KWvqOl5piGI8KW71054HMM/Rueu//WnLxN+gToH7JYtUTo7KFQ5Q8NsP0VjLmsxApIkkxkwJ5CsFmllGptwagjgpgIs6P3biqZmhC4l5Ul/ZvsQ8nDmZAh/y5cjGwL+2wui3bR6fj2uowRHD4joCeob7Mi8zy/CGG0XnG2YmkD/yvJDw9hJ5mi5NjUoEawpRSSNPjAg4blBOSzEdaxWAv85j+/g9EiYIv/M= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 6:VbzFbbylH3kK/JEt6qVmuMnohcKTKpghZSvTKcpow9L5q46WB/vOy6We90Cs2MqjchVvWoqohB3vx0iXoV3tTWgmwaShVLd3IGM5HiSUhqBrWfR960EvvnXfS7/SmBOoC2MLqmZ0A+ewFcSL537v7bpkGrpSg8n8ti7jnM1NTVYjeQdS2e7iTfGPBuDgMYUP3nvEUwBFmV2kNTxLp+nNMWIbeuKxvcVND1GMKC9quYZP1zmUtg2/PCP11rFH9ne2Mi//eOiYwry67IVIdUgjaq1PHicw4aZd4VdFjq54Ik4AinMvf8xE5NZGkajGcGd3OAoXs0ZPJmf8GmpabLckG8NLnajjMdprKp+Zn7fGEHyfvsi8ps+F5UqVNu837pFw5PfDNhPlEv1AtaloI3UY1suX5RYjynUshX6/zmWHyZeXllmul3MUtVz5f703KiIg9zlf1RCRy6e2CzGUAwbhV3nzJS6MCEIo8vSah1Q5KQI=; 5:whFeoa+7nnr0Yh1X1rVT1O+AOfwJXDwAPNTw4mx3jcR7aamQn7qqQArg/fvx0VhQilw3ln4ERXzuTbma3sTeWLzG9YtSai2zoeG5bHI7cm85f28EHKGc7VLMiM2PLBf0ASysyU6POPgSJN5UBCFkfg==; 24:zPrVmcrDP0frDmNuQ9KCY+YQl18LPnuvw6gOBudpJkLY3AhbeWm/kYvvlgGHA2Lj9bB5Jt+lp6lCS6HRxr7KS2X1r4G3aktav9rKS/4XEPA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB1902; 7:WRkALrDJ2wbVBVGCd7pKTH6Nyt/lSVplhfJhfadnpyVmY52NlP1IkL1vPdxE+a3Xe9/9jtZdBk43d6DIl/chFx/HItHngR7sz8UC1pc+xZEhnuhGvEARnmXhaTC/21/JUuF6s30P7Hz0ZI2uF4dd1uDddNFffZ3J0hFoJduXoznt5aBY13afsbC7723GzA4/5gQ4xjz/QUf94T82jMlDJSXwNhPpzXK7jdZKgZfLOhoOt6G8RQWmfQPoW0z5k6mHrkLABEBUiJpsYsW7lc+g98ruJ0wTFqCWy9EkR17DgJR+6DRXHHdjvwZ5MUH6tLrkM9uY/THWFwOq/3e0SgAm7w== X-OriginatorOrg: nokia.onmicrosoft.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2017 11:59:40.3010 (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=[mailrelay.int.nokia.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0701MB1902 Subject: [lng-odp] [PATCH 2/3] linux-gen: sched: use weight table for preferences 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" A precalculated table is more flexible for tunning weights than hard coding. As future development, the table may be updated with different weights at init or run time. Signed-off-by: Petri Savolainen --- platform/linux-generic/odp_schedule.c | 51 ++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 12 deletions(-) -- 2.8.1 diff --git a/platform/linux-generic/odp_schedule.c b/platform/linux-generic/odp_schedule.c index cd5bf21..e7079b9 100644 --- a/platform/linux-generic/odp_schedule.c +++ b/platform/linux-generic/odp_schedule.c @@ -39,6 +39,13 @@ ODP_STATIC_ASSERT((ODP_SCHED_PRIO_NORMAL > 0) && /* Priority queues per priority */ #define QUEUES_PER_PRIO 4 +/* A thread polls a non preferred sched queue every this many polls + * of the prefer queue. */ +#define PREFER_RATIO 64 + +/* Size of poll weight table */ +#define WEIGHT_TBL_SIZE ((QUEUES_PER_PRIO - 1) * PREFER_RATIO) + /* Packet input poll cmd queues */ #define PKTIO_CMD_QUEUES 4 @@ -142,7 +149,6 @@ typedef struct { int index; int pause; uint16_t round; - uint16_t prefer_offset; uint16_t pktin_polls; uint32_t queue_index; odp_queue_t queue; @@ -157,6 +163,8 @@ typedef struct { ordered_stash_t stash[MAX_ORDERED_STASH]; } ordered; + uint8_t weight_tbl[WEIGHT_TBL_SIZE]; + } sched_local_t; /* Priority queue */ @@ -237,11 +245,29 @@ static inline void schedule_release_context(void); static void sched_local_init(void) { + int i; + uint8_t id; + uint8_t offset = 0; + memset(&sched_local, 0, sizeof(sched_local_t)); sched_local.thr = odp_thread_id(); sched_local.queue = ODP_QUEUE_INVALID; sched_local.queue_index = PRIO_QUEUE_EMPTY; + + id = sched_local.thr & (QUEUES_PER_PRIO - 1); + + for (i = 0; i < WEIGHT_TBL_SIZE; i++) { + sched_local.weight_tbl[i] = id; + + if (i % PREFER_RATIO == 0) { + offset++; + sched_local.weight_tbl[i] = (id + offset) & + (QUEUES_PER_PRIO - 1); + if (offset == QUEUES_PER_PRIO - 1) + offset = 0; + } + } } static int schedule_init_global(void) @@ -670,10 +696,10 @@ static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], { int prio, i; int ret; - int id; - int offset = 0; + int id, first; unsigned int max_deq = MAX_DEQ; uint32_t qi; + uint16_t round; if (sched_local.num) { ret = copy_events(out_ev, max_num); @@ -689,15 +715,15 @@ static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], if (odp_unlikely(sched_local.pause)) return 0; - /* Each thread prefers a priority queue. This offset avoids starvation - * of other priority queues on low thread counts. */ - if (odp_unlikely((sched_local.round & 0x3f) == 0)) { - offset = sched_local.prefer_offset; - sched_local.prefer_offset = (offset + 1) & - (QUEUES_PER_PRIO - 1); - } + /* Each thread prefers a priority queue. Poll weight table avoids + * starvation of other priority queues on low thread counts. */ + round = sched_local.round + 1; + + if (odp_unlikely(round == WEIGHT_TBL_SIZE)) + round = 0; - sched_local.round++; + sched_local.round = round; + first = sched_local.weight_tbl[round]; /* Schedule events */ for (prio = 0; prio < NUM_PRIO; prio++) { @@ -705,7 +731,8 @@ static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], if (sched->pri_mask[prio] == 0) continue; - id = (sched_local.thr + offset) & (QUEUES_PER_PRIO - 1); + /* Select the first ring based on weights */ + id = first; for (i = 0; i < QUEUES_PER_PRIO;) { int num; From patchwork Thu Apr 6 11:59:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petri Savolainen X-Patchwork-Id: 96934 Delivered-To: patch@linaro.org Received: by 10.140.89.233 with SMTP id v96csp695443qgd; Thu, 6 Apr 2017 05:01:56 -0700 (PDT) X-Received: by 10.200.41.42 with SMTP id y39mr33728504qty.37.1491480116147; Thu, 06 Apr 2017 05:01:56 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id p53si1190801qtp.306.2017.04.06.05.01.55; Thu, 06 Apr 2017 05:01:56 -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=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id BFF5F62C41; Thu, 6 Apr 2017 12:01:55 +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,URIBL_BLOCKED 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 4067C64368; Thu, 6 Apr 2017 12:00:00 +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 E0A0960762; Thu, 6 Apr 2017 11:59:48 +0000 (UTC) Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on0112.outbound.protection.outlook.com [104.47.0.112]) by lists.linaro.org (Postfix) with ESMTPS id 69A0960734 for ; Thu, 6 Apr 2017 11:59:45 +0000 (UTC) Received: from DB4PR07CA042.eurprd07.prod.outlook.com (2a01:111:e400:9828::52) by AM3PR07MB1060.eurprd07.prod.outlook.com (2a01:111:e400:536e::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1019.8; Thu, 6 Apr 2017 11:59:43 +0000 Received: from DB5EUR03FT051.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e0a::201) by DB4PR07CA042.outlook.office365.com (2a01:111:e400:9828::52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1019.8 via Frontend Transport; Thu, 6 Apr 2017 11:59:43 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning linaro.org discourages use of 131.228.2.241 as permitted sender) Received: from mailrelay.int.nokia.com (131.228.2.241) by DB5EUR03FT051.mail.protection.outlook.com (10.152.21.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.1005.5 via Frontend Transport; Thu, 6 Apr 2017 11:59:43 +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 v36Bx5t4006041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 6 Apr 2017 14:59:05 +0300 Received: from 10.144.19.15 ([10.144.104.219]) by fihe3nok0735.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id v36Bx4nM006023 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NOT) for ; Thu, 6 Apr 2017 14:59:05 +0300 X-HPESVCS-Source-Ip: 10.144.104.219 From: Petri Savolainen To: Date: Thu, 6 Apr 2017 14:59:04 +0300 Message-ID: <1491479944-31232-3-git-send-email-petri.savolainen@linaro.org> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1491479944-31232-1-git-send-email-petri.savolainen@linaro.org> References: <1491479944-31232-1-git-send-email-petri.savolainen@linaro.org> X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.228.2.241; IPV:CAL; CTRY:FI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(39840400002)(39450400003)(39400400002)(39850400002)(39860400002)(39410400002)(2980300002)(199003)(189002)(9170700003)(305945005)(356003)(47776003)(50986999)(76176999)(5660300001)(22756006)(36756003)(86362001)(48376002)(77096006)(2950100002)(33646002)(6916009)(38730400002)(53936002)(110136004)(189998001)(50226002)(2906002)(5003940100001)(106466001)(81166006)(8936002)(2351001)(105596002)(8676002); DIR:OUT; SFP:1102; SCL:1; SRVR:AM3PR07MB1060; H:mailrelay.int.nokia.com; FPR:; SPF:SoftFail; MLV:sfv; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB5EUR03FT051; 1:5mF8FyNY9eZf6mOvKu4ULvXg+NLHQ7Kgyh7fypggsY3dGYYxUihmToTaR8Dpd9PQuESXD2jFVsYMfzq15d6bakz32EDEKj2YbjgG5i4NIcM2JWe11Wv/+70imlcYdwyDo4pu4axZ+n9rV2SAIrxEuy1bS53wxR9PLTS++t9S3x8z9lcIGWgnB9Kdbmmpq4pBouG10E0x+dFWwCyotY9mNstLUQvxCfanNC+E+Rp3kX3VlY/3LVdYsGiNgyx1kIsgA33RBakrbk3rLowgL0I7HPXaMsK27sn1N/zEa6uw3e4JM4fQTOo8dULqVfJMhZQ/6x6U+SSVE/pn3x7iTzBVT0dJMADGPX3US9O37U/Q5TowUVQDmKPhr1KOb7FkXPgn17ppmzErCz/60EyINCKGp5kxNfLAi2X4Sj5aksHXV6XuECLmOPQ5ve4WIhgMGcNRgH116bLF2oynwkKloDXUU7RYFZ7XKZoYQmFUEv+0xQ9+JNMK5g8WDoGclIBpFuHnqnZYVc7qMhxrVuUgsYGing== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: b7afedd2-0f0b-440a-2b7e-08d47ce469ac X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(201703131423075)(201703031133081); SRVR:AM3PR07MB1060; X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB1060; 3:jq0sa5TeES6wlYmjmZGhx2xfWopoIFmk0zNH8mmr5XeqUO6BuX92RkSkREZweNZqYsnhWEP6cLsFyjC8sh3Ku8C4LvO2s+z06PNN9KnY7AAVHIns8cOngsJG3IecbEaU0EqWvkIPqcGDn7RmqoYeSpy/aX8K+EavmCNUhdrm0+wcfvV20S9r1eaHeYQnvV9Yd05ua69ue/6+niSqB1713pabD2AaKaDNLKjxTkuEw2TZXI1MT7no17pV+7zx0mdC/3yah3IZRzA9ONEdh8XHfkRk/bHqnTfmOhIsTEczCTRJJ8Sw94ZI0wdrVQQuCokyqxk0x2u1AFOnx1DjOksSb5omhXhGBATZ0ml4ddZru0HjFSeIeANPmxa0VbysS6nBawqb7+sPa2SjlTz5pLmwr6dbgLHcKH51s6M4IlKyJRdPgd+m+bndIIoCIyv6aj3N2UF4rYWJilzeaOBE/JvpmA==; 25:8OyOelox1MwO0nd6GP4U2rFHQ+RVvDwntt+S3mGzodI9/OYXKoBykUB2zeYdOOVO78dbq/J5nhgIM/+gD0jXOJ4plvbXPxm4aLFqCosNVR9GaSA3WABwV5IKx0213mctO52Ry6bbySkBJWu9/4ASV0I7UEFz+xvlZlxg3vJEkTFQ6XxXlNlZeVqnz1cIPjwscV10QiOTr/q+CHOauqEji36zETDUjYTYiz2CiaNbuSyXnd1M2tVdsDXRWYThE1+8IfNnrc0oraqdH0WVFTLZImoCzkD025EJV8YDMANXWZU5c9U+HMSiN2CSRxu9AAQ78UxWZW0M2CpqQt6KgnVtM0L5+9fw0i7aD6TdMNqst5O56cB4aWEgVmcfgg2JfJTxKeQNzjgkgA1bdXrs9BtLABOtwQnCgLPUwfyqCPjkYky8FBXbp5avdr3TlEY8ly1f8lohBxflR9rumf35Wpg2jQ== X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB1060; 31:wlvaiu9EE5zmEid0DrbpMfNE5ZU0n8YOsyp9GIYz2XbGtissQV1alzreF++4DGI0LNhO07vdi+2zvF2QpyGEtfvsCvC1KnN7zjUZio8GdXolR/8a/1jLDaejvlcFYGcs7oOauomR1oBWpDjiEXOvond+OsFrs1qgSidJmWPBFjNuVnr9RfsJsOl4C07becxMKhsCVl33JLkz6uA/4uyYpmnhEmbu61UqZWaozij+QoMYiiMAxyXrCGRZXyAqXLDQ6Cbff1f1FJqGF73+jl7ZfUBh3VJIQGzxNS5mjp4Bkts=; 20:0x04QbMlYej1wmcVKtYJ9jpyQVxA6v/7YRXH8RzZoHzRJ9B+daESro0zqobvIQVgtSMRfk565TvZfG1tVb4/5U1pciCzUiM69ANxDht8vkrg16+B/mz7cyrr3H3LKk0+4xFcxCiVm5mnU0AVcxGklcT9PoAtUUE4iklOnM6ZQMT7c85fsS08FjgPZUMrIdRSiXN+DslGr/f2yFO2+xM8DcC9vkj7w26/MCBu5lsfqpxnJUwd2XpHR+jpRrGR9/W4gt1opM5dJ3cKIGo/GIi31EzOXl4qCjL0K666icHeQ/kxspAZgA+hg2t7TIJJf5CG0UQIDS3RyXKp/EsEV/hddPU6lCstWnQuw4zzMbrucowmZPi655cy+M/JIxuC7pqMn9rJkIesPrlkfouv4wcFRIPANhED+mWOb7eLmp/Hg7mIK/jQ190+/vAF9NyGHiAPevzTtXQYKFtZ+C27aPBdpdzMF1PwP7cPKe7HL/rRYXBtEH0E3Hrrimxl11tVkHYgsn9hXI4K5Zj9mzZErdXLNWFWBG0OMh1h8MOGfRXdWDKLbv8X2kcWll/WSnBrfiqCX6OxcH3OteRydBqwBhAwlQJI/duu6sQGLMjcH9zrDrk= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(13023025)(13021025)(13013025)(93006095)(93003095)(10201501046)(3002001)(6055026)(6041248)(20161123555025)(20161123560025)(20161123564025)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(6072148); SRVR:AM3PR07MB1060; BCL:0; PCL:0; RULEID:; SRVR:AM3PR07MB1060; X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB1060; 4:4F8DwAUJUSU4VOL0345CXg8E9lZ2jCl8591spq915wCyz5RoDjmEAodL0hx1Jh7rT1J8q7vrSEpQi75aKiH/7r1+xblNUpvA/52PBGWjBxUjcX1+tf72wo1rXuBsTOvQpbX04elGZtDAXp7Mk4633exAQrWB51hfyD6wZYCjRrn8bo5PvlFHQfiAwCkEiRimQRoOVzHk0RFGkOuDb9zvSLeUoWgVp548/e1Kyn+B77U28iDUbu0qoRBo/+wXwBYk+TAJ0PhxA7xAmIOf1TkoWyMA2I+ERb/Owabz+hIYVAln2l4+xa9sdc8leXvttFBjKcmRjjclfHH+C1S3DAIwcY/kcfBU7++V3MC/0aPgOIPHgrosRc03Qp0n5B9CXFnKmu1GNuOergDar0m3tIeipdMPccxqTMt/zoeL8pqhZPu7wxz+debfQBerAu1YCqeQJFTfV8vzuN9maGJtg8ZyDq6kqTeSIi5sdriDxiZRCNdnQx4/t4kcXdz7JxCVPetjYCpKwY7Jb+NuRrQ7vORb8k4YVVvdm166ii0UbIWHovM+X3v4vSIE9P7D2IE9oSHWhPZ8BWbbZ67F7EcO9cqd59vd2uVRnTzn4/rIFqcTl3CDXu2xFL2kDH0DnEUg0y4Kn41vqbfTvvPeYI58vtZ76vxqnis3mIipm/jseslJboPCruSV0FN4ZhgMtc2B6GuAiZg+KRR8boy4g5eGL/Wx+N2Xygh25JAfU+VZsio7IFbeP3Js05ft9KmKwgcNQwOFK7hxpjhfmJoNYri5c9GbIduTdkNOtSzcVi+pgqLj9h4= X-Forefront-PRVS: 02698DF457 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM3PR07MB1060; 23:sCvVOV2+XTLw7tMoen1UJk7woVZMkTISaRQ93oAJI?= L3HdhTfNw5EZEev+JjzrapGiTMbl/HWm8BPzrQ8OR9qMkv3zC+6yEiufnIl7XhD0sBKKmkXZ4bUvbSEMLqWOezxnYaVZgQv1AFATZICgFvOKr+k0k1IDmY1Ofa63c+7kje6MHBzdfFEz4qbrQUhd/4hsG1RSqRQxR/jPB7TXtY4vFvURpztvMy92pxKUbwa8+X1ql1w/a4NEMcaNmmF5lK5ssQdLBjjK4renROirQafrzlfSrX8QygUX+L+Hlgg1gA2z2y0zdqOowUSTJGS0guBJvMJO+t4m9k/YlFsNXDAjPVJYPJC5f3WKxklO9aGnu6qRzrtFkDhMpUGntYCJkXpyXG2xCcsVXlcX6UJkwvGF89q1Rd3Xs/5MDJGyWTP3MXm3nOv2XTWvKXrfrMN2xALkHGYgJ+Ev5G928wAQnx9pOo4V72cczW0yRp+ADuLtvbq4uQ+xZ1+pHvGRCLh7bLPQk+YltVpxaRtPRx/5y5lVSw1pqrFoBs2HUF+osFZ5bjC02ad3wwINqk293HOhipsBr3KTdoad/F9pIG0F8Ud4pbg9TUG9d+zFHCQUYQ9KSnAVEyCXUjQblJgoBFkwLBCs7m17Nx5ewsguVCiQECqgS7UXf8k1KSk9xPim6/qpZ4eX07YJxfqBFQzazofjmnnOIndHJoFdqTykEQcQbMKV0uXGvP5h3K0BViskjmzkZkTJ1eo1otrOOq4qL7sw79S2uHUfiwtEWRaHHYWHmrFWqo2p+YVjBZj12hfi5PeIEa95rB4XEtANI116w6uY7yt9g7n4UOpPnOKnbEoi4hn1qS7CcVij+8DqyvIDcaEc+XV0bKdO4mfKnTgGNiujBP7o7fCTUkK2OhtSX3lTMmbxSehlyxobQ462vLuggm4CwIoW8d2GoSY3CPzL3XgOHLgx0biOlaylUr3jPa9r2bRkjD3FjUpCi060s1+9RXBxf8= X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB1060; 6:jxEq9mmzsCi/bYpTNVTJS5RrD8uSLLUzi4MObmePY9TvkpfRNBAz7bpymOBKTbA48fJ2Lez/vxfoXP3P7hZIYl2EWydpTbnvBakxqwSiK/9YVkqKCu71mSzeABFF6qoA2c8PWb4gTWRN5gJ7+s6sp2jZ9xt8FycEzu5O8/QC04sTYrTVherfrefgrUW7fzpKbyFEvIDKQR+0QDAziGnhCCf2cTLB+w3Gwi+Bw0H/JCWSjNmtI2VI+4rPmLs9Ml8SWB1sVXQxk1Tg/NHcFXm4HeWYeSsVrw+TvK3I2TIsqhRCM+nwTUUuISSpDnN5nrqeZBegYcQH+QdhAV/3YwaeUqgYFsJdiC8CGO9dDDXk+ehgVf76dYrYJQwKDUjf2Oe1p5mDalETlX6FspqEQ23Iu+LFz8g5zuCzU1SFU6J86txRMR+ys34Q3VWiPyimE6372Q65pG/CK6lMe/cAwfWf4fUmlzRHIsn07Eb3ul07OfQ=; 5:YswTb0fG5/zbYGflMCw3jsnzCpJwk2q4/haVk6r0H38SERrE6DgrKFl8CqyS37k3tR4Jw/vpHmnlST0hAIavzWD22csa8wdCtV2Go4po2AD0dGrqx40+j+9myntnP7kvTHmBzOWgKowpasbSPhlapw==; 24:ZmiNBigtJ9kSSXcGsLLeN5N4mgU3+sR/oLGf7D8XyPlFKCr/mRGpOi1/OCSCAI+4gK0iTN+0BE0pju8Iqh715f4COqYqYxtw73BMG8O016Y= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM3PR07MB1060; 7:8ODFs0S+Rw3jBodk76YACzPgRAAx2K/CYsxN04hMrgfudzAKBbsyiUhyj34xoK4vZOfPpY8BaAbAjbZTgsTQOJJZWenHwkJd6tP0lUuYjQ1mY9s14Paep1Ja8OtVhcQ4sXvI8bV7FhrVRLXAVDoGIj2lrEpWaLbYl2nQDlluQ90P1FlTdEs+SssEgrPgtj3p7ycGKSA9zzEmb1VwTzWiGpM4V5RBx21twGqumlbJs2hrSgLEsb5Gx86GvnN3X9ew4B2M83HnorJdFOeqT25rFZ5ZCWgRHJeOLrSs0mpKXNdMoGcSjoXGYN4P/dAwqmZsem9odaHLSDR+Z+JwaW1CRw== X-OriginatorOrg: nokia.onmicrosoft.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2017 11:59:43.1329 (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=[mailrelay.int.nokia.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR07MB1060 Subject: [lng-odp] [PATCH 3/3] linux-gen: sched: optimize group scheduling 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" Use separate priority queues for different groups. Sharing the same priority queue over multiple groups caused multiple issues: * latency and ordering issues when threads push back events (from wrong groups) to the tail of the priority queue * unnecessary contention (scaling issues) when threads belong to different groups Lowered the maximum number of groups from 256 to 32 (in the default configuration) to limit memory usage of priority queues. This should be enough for the most users. Signed-off-by: Petri Savolainen --- platform/linux-generic/odp_schedule.c | 284 +++++++++++++++++++++++----------- 1 file changed, 195 insertions(+), 89 deletions(-) -- 2.8.1 diff --git a/platform/linux-generic/odp_schedule.c b/platform/linux-generic/odp_schedule.c index e7079b9..f366e7e 100644 --- a/platform/linux-generic/odp_schedule.c +++ b/platform/linux-generic/odp_schedule.c @@ -34,7 +34,7 @@ ODP_STATIC_ASSERT((ODP_SCHED_PRIO_NORMAL > 0) && "normal_prio_is_not_between_highest_and_lowest"); /* Number of scheduling groups */ -#define NUM_SCHED_GRPS 256 +#define NUM_SCHED_GRPS 32 /* Priority queues per priority */ #define QUEUES_PER_PRIO 4 @@ -163,7 +163,11 @@ typedef struct { ordered_stash_t stash[MAX_ORDERED_STASH]; } ordered; + uint32_t grp_epoch; + int num_grp; + uint8_t grp[NUM_SCHED_GRPS]; uint8_t weight_tbl[WEIGHT_TBL_SIZE]; + uint8_t grp_weight[WEIGHT_TBL_SIZE]; } sched_local_t; @@ -199,7 +203,7 @@ typedef struct { pri_mask_t pri_mask[NUM_PRIO]; odp_spinlock_t mask_lock; - prio_queue_t prio_q[NUM_PRIO][QUEUES_PER_PRIO]; + prio_queue_t prio_q[NUM_SCHED_GRPS][NUM_PRIO][QUEUES_PER_PRIO]; odp_spinlock_t poll_cmd_lock; /* Number of commands in a command queue */ @@ -214,8 +218,10 @@ typedef struct { odp_shm_t shm; uint32_t pri_count[NUM_PRIO][QUEUES_PER_PRIO]; - odp_spinlock_t grp_lock; - odp_thrmask_t mask_all; + odp_thrmask_t mask_all; + odp_spinlock_t grp_lock; + odp_atomic_u32_t grp_epoch; + struct { char name[ODP_SCHED_GROUP_NAME_LEN]; odp_thrmask_t mask; @@ -223,6 +229,7 @@ typedef struct { } sched_grp[NUM_SCHED_GRPS]; struct { + int grp; int prio; int queue_per_prio; } queue[ODP_CONFIG_QUEUES]; @@ -273,7 +280,7 @@ static void sched_local_init(void) static int schedule_init_global(void) { odp_shm_t shm; - int i, j; + int i, j, grp; ODP_DBG("Schedule init ... "); @@ -293,15 +300,20 @@ static int schedule_init_global(void) sched->shm = shm; odp_spinlock_init(&sched->mask_lock); - for (i = 0; i < NUM_PRIO; i++) { - for (j = 0; j < QUEUES_PER_PRIO; j++) { - int k; + for (grp = 0; grp < NUM_SCHED_GRPS; grp++) { + for (i = 0; i < NUM_PRIO; i++) { + for (j = 0; j < QUEUES_PER_PRIO; j++) { + prio_queue_t *prio_q; + int k; - ring_init(&sched->prio_q[i][j].ring); + prio_q = &sched->prio_q[grp][i][j]; + ring_init(&prio_q->ring); - for (k = 0; k < PRIO_QUEUE_RING_SIZE; k++) - sched->prio_q[i][j].queue_index[k] = - PRIO_QUEUE_EMPTY; + for (k = 0; k < PRIO_QUEUE_RING_SIZE; k++) { + prio_q->queue_index[k] = + PRIO_QUEUE_EMPTY; + } + } } } @@ -317,12 +329,17 @@ static int schedule_init_global(void) sched->pktio_cmd[i].cmd_index = PKTIO_CMD_FREE; odp_spinlock_init(&sched->grp_lock); + odp_atomic_init_u32(&sched->grp_epoch, 0); for (i = 0; i < NUM_SCHED_GRPS; i++) { memset(sched->sched_grp[i].name, 0, ODP_SCHED_GROUP_NAME_LEN); odp_thrmask_zero(&sched->sched_grp[i].mask); } + sched->sched_grp[ODP_SCHED_GROUP_ALL].allocated = 1; + sched->sched_grp[ODP_SCHED_GROUP_WORKER].allocated = 1; + sched->sched_grp[ODP_SCHED_GROUP_CONTROL].allocated = 1; + odp_thrmask_setall(&sched->mask_all); ODP_DBG("done\n"); @@ -330,29 +347,38 @@ static int schedule_init_global(void) return 0; } +static inline void queue_destroy_finalize(uint32_t qi) +{ + sched_cb_queue_destroy_finalize(qi); +} + static int schedule_term_global(void) { int ret = 0; int rc = 0; - int i, j; + int i, j, grp; - for (i = 0; i < NUM_PRIO; i++) { - for (j = 0; j < QUEUES_PER_PRIO; j++) { - ring_t *ring = &sched->prio_q[i][j].ring; - uint32_t qi; + for (grp = 0; grp < NUM_SCHED_GRPS; grp++) { + for (i = 0; i < NUM_PRIO; i++) { + for (j = 0; j < QUEUES_PER_PRIO; j++) { + ring_t *ring = &sched->prio_q[grp][i][j].ring; + uint32_t qi; - while ((qi = ring_deq(ring, PRIO_QUEUE_MASK)) != - RING_EMPTY) { - odp_event_t events[1]; - int num; + while ((qi = ring_deq(ring, PRIO_QUEUE_MASK)) != + RING_EMPTY) { + odp_event_t events[1]; + int num; - num = sched_cb_queue_deq_multi(qi, events, 1); + num = sched_cb_queue_deq_multi(qi, + events, + 1); - if (num < 0) - sched_cb_queue_destroy_finalize(qi); + if (num < 0) + queue_destroy_finalize(qi); - if (num > 0) - ODP_ERR("Queue not empty\n"); + if (num > 0) + ODP_ERR("Queue not empty\n"); + } } } } @@ -383,6 +409,40 @@ static int schedule_term_local(void) return 0; } +static inline void grp_update_mask(int grp, const odp_thrmask_t *new_mask) +{ + odp_thrmask_copy(&sched->sched_grp[grp].mask, new_mask); + odp_atomic_add_rel_u32(&sched->grp_epoch, 1); +} + +static inline int grp_update_tbl(void) +{ + int i; + int num = 0; + int thr = sched_local.thr; + + odp_spinlock_lock(&sched->grp_lock); + + for (i = 0; i < NUM_SCHED_GRPS; i++) { + if (sched->sched_grp[i].allocated == 0) + continue; + + if (odp_thrmask_isset(&sched->sched_grp[i].mask, thr)) { + sched_local.grp[num] = i; + num++; + } + } + + odp_spinlock_unlock(&sched->grp_lock); + + /* Update group weights. Round robin over all thread's groups. */ + for (i = 0; i < WEIGHT_TBL_SIZE; i++) + sched_local.grp_weight[i] = i % num; + + sched_local.num_grp = num; + return num; +} + static unsigned schedule_max_ordered_locks(void) { return MAX_ORDERED_LOCKS_PER_QUEUE; @@ -433,6 +493,7 @@ static int schedule_init_queue(uint32_t queue_index, int prio = sched_param->prio; pri_set_queue(queue_index, prio); + sched->queue[queue_index].grp = sched_param->group; sched->queue[queue_index].prio = prio; sched->queue[queue_index].queue_per_prio = queue_per_prio(queue_index); @@ -444,6 +505,7 @@ static void schedule_destroy_queue(uint32_t queue_index) int prio = sched->queue[queue_index].prio; pri_clr_queue(queue_index, prio); + sched->queue[queue_index].grp = 0; sched->queue[queue_index].prio = 0; sched->queue[queue_index].queue_per_prio = 0; } @@ -535,9 +597,10 @@ static void schedule_release_atomic(void) uint32_t qi = sched_local.queue_index; if (qi != PRIO_QUEUE_EMPTY && sched_local.num == 0) { - int prio = sched->queue[qi].prio; + int grp = sched->queue[qi].grp; + int prio = sched->queue[qi].prio; int queue_per_prio = sched->queue[qi].queue_per_prio; - ring_t *ring = &sched->prio_q[prio][queue_per_prio].ring; + ring_t *ring = &sched->prio_q[grp][prio][queue_per_prio].ring; /* Release current atomic queue */ ring_enq(ring, PRIO_QUEUE_MASK, qi); @@ -688,42 +751,14 @@ static int schedule_ord_enq_multi(uint32_t queue_index, void *buf_hdr[], return 1; } -/* - * Schedule queues - */ -static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], - unsigned int max_num) +static inline int do_schedule_grp(odp_queue_t *out_queue, odp_event_t out_ev[], + unsigned int max_num, int grp, int first) { int prio, i; int ret; - int id, first; + int id; unsigned int max_deq = MAX_DEQ; uint32_t qi; - uint16_t round; - - if (sched_local.num) { - ret = copy_events(out_ev, max_num); - - if (out_queue) - *out_queue = sched_local.queue; - - return ret; - } - - schedule_release_context(); - - if (odp_unlikely(sched_local.pause)) - return 0; - - /* Each thread prefers a priority queue. Poll weight table avoids - * starvation of other priority queues on low thread counts. */ - round = sched_local.round + 1; - - if (odp_unlikely(round == WEIGHT_TBL_SIZE)) - round = 0; - - sched_local.round = round; - first = sched_local.weight_tbl[round]; /* Schedule events */ for (prio = 0; prio < NUM_PRIO; prio++) { @@ -736,7 +771,6 @@ static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], for (i = 0; i < QUEUES_PER_PRIO;) { int num; - int grp; int ordered; odp_queue_t handle; ring_t *ring; @@ -753,7 +787,7 @@ static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], } /* Get queue index from the priority queue */ - ring = &sched->prio_q[prio][id].ring; + ring = &sched->prio_q[grp][prio][id].ring; qi = ring_deq(ring, PRIO_QUEUE_MASK); /* Priority queue empty */ @@ -763,21 +797,6 @@ static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], continue; } - grp = sched_cb_queue_grp(qi); - - if (grp > ODP_SCHED_GROUP_ALL && - !odp_thrmask_isset(&sched->sched_grp[grp].mask, - sched_local.thr)) { - /* This thread is not eligible for work from - * this queue, so continue scheduling it. - */ - ring_enq(ring, PRIO_QUEUE_MASK, qi); - - i++; - id++; - continue; - } - /* Low priorities have smaller batch size to limit * head of line blocking latency. */ if (odp_unlikely(prio > ODP_SCHED_PRIO_DEFAULT)) @@ -845,6 +864,70 @@ static int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], } } + return 0; +} + +/* + * Schedule queues + */ +static inline int do_schedule(odp_queue_t *out_queue, odp_event_t out_ev[], + unsigned int max_num) +{ + int i, num_grp; + int ret; + int id, first, grp_id; + uint16_t round; + uint32_t epoch; + + if (sched_local.num) { + ret = copy_events(out_ev, max_num); + + if (out_queue) + *out_queue = sched_local.queue; + + return ret; + } + + schedule_release_context(); + + if (odp_unlikely(sched_local.pause)) + return 0; + + /* Each thread prefers a priority queue. Poll weight table avoids + * starvation of other priority queues on low thread counts. */ + round = sched_local.round + 1; + + if (odp_unlikely(round == WEIGHT_TBL_SIZE)) + round = 0; + + sched_local.round = round; + first = sched_local.weight_tbl[round]; + + epoch = odp_atomic_load_acq_u32(&sched->grp_epoch); + num_grp = sched_local.num_grp; + + if (odp_unlikely(sched_local.grp_epoch != epoch)) { + num_grp = grp_update_tbl(); + sched_local.grp_epoch = epoch; + } + + grp_id = sched_local.grp_weight[round]; + + /* Schedule queues per group and priority */ + for (i = 0; i < num_grp; i++) { + int grp; + + grp = sched_local.grp[grp_id]; + ret = do_schedule_grp(out_queue, out_ev, max_num, grp, first); + + if (odp_likely(ret)) + return ret; + + grp_id++; + if (odp_unlikely(grp_id >= num_grp)) + grp_id = 0; + } + /* * Poll packet input when there are no events * * Each thread starts the search for a poll command from its @@ -1050,7 +1133,8 @@ static odp_schedule_group_t schedule_group_create(const char *name, ODP_SCHED_GROUP_NAME_LEN - 1); grp_name[ODP_SCHED_GROUP_NAME_LEN - 1] = 0; } - odp_thrmask_copy(&sched->sched_grp[i].mask, mask); + + grp_update_mask(i, mask); group = (odp_schedule_group_t)i; sched->sched_grp[i].allocated = 1; break; @@ -1063,13 +1147,16 @@ static odp_schedule_group_t schedule_group_create(const char *name, static int schedule_group_destroy(odp_schedule_group_t group) { + odp_thrmask_t zero; int ret; + odp_thrmask_zero(&zero); + odp_spinlock_lock(&sched->grp_lock); if (group < NUM_SCHED_GRPS && group >= SCHED_GROUP_NAMED && sched->sched_grp[group].allocated) { - odp_thrmask_zero(&sched->sched_grp[group].mask); + grp_update_mask(group, &zero); memset(sched->sched_grp[group].name, 0, ODP_SCHED_GROUP_NAME_LEN); sched->sched_grp[group].allocated = 0; @@ -1109,9 +1196,11 @@ static int schedule_group_join(odp_schedule_group_t group, if (group < NUM_SCHED_GRPS && group >= SCHED_GROUP_NAMED && sched->sched_grp[group].allocated) { - odp_thrmask_or(&sched->sched_grp[group].mask, - &sched->sched_grp[group].mask, - mask); + odp_thrmask_t new_mask; + + odp_thrmask_or(&new_mask, &sched->sched_grp[group].mask, mask); + grp_update_mask(group, &new_mask); + ret = 0; } else { ret = -1; @@ -1124,18 +1213,19 @@ static int schedule_group_join(odp_schedule_group_t group, static int schedule_group_leave(odp_schedule_group_t group, const odp_thrmask_t *mask) { + odp_thrmask_t new_mask; int ret; + odp_thrmask_xor(&new_mask, mask, &sched->mask_all); + odp_spinlock_lock(&sched->grp_lock); if (group < NUM_SCHED_GRPS && group >= SCHED_GROUP_NAMED && sched->sched_grp[group].allocated) { - odp_thrmask_t leavemask; + odp_thrmask_and(&new_mask, &sched->sched_grp[group].mask, + &new_mask); + grp_update_mask(group, &new_mask); - odp_thrmask_xor(&leavemask, mask, &sched->mask_all); - odp_thrmask_and(&sched->sched_grp[group].mask, - &sched->sched_grp[group].mask, - &leavemask); ret = 0; } else { ret = -1; @@ -1186,12 +1276,19 @@ static int schedule_group_info(odp_schedule_group_t group, static int schedule_thr_add(odp_schedule_group_t group, int thr) { + odp_thrmask_t mask; + odp_thrmask_t new_mask; + if (group < 0 || group >= SCHED_GROUP_NAMED) return -1; + odp_thrmask_zero(&mask); + odp_thrmask_set(&mask, thr); + odp_spinlock_lock(&sched->grp_lock); - odp_thrmask_set(&sched->sched_grp[group].mask, thr); + odp_thrmask_or(&new_mask, &sched->sched_grp[group].mask, &mask); + grp_update_mask(group, &new_mask); odp_spinlock_unlock(&sched->grp_lock); @@ -1200,12 +1297,20 @@ static int schedule_thr_add(odp_schedule_group_t group, int thr) static int schedule_thr_rem(odp_schedule_group_t group, int thr) { + odp_thrmask_t mask; + odp_thrmask_t new_mask; + if (group < 0 || group >= SCHED_GROUP_NAMED) return -1; + odp_thrmask_zero(&mask); + odp_thrmask_set(&mask, thr); + odp_thrmask_xor(&new_mask, &mask, &sched->mask_all); + odp_spinlock_lock(&sched->grp_lock); - odp_thrmask_clr(&sched->sched_grp[group].mask, thr); + odp_thrmask_and(&new_mask, &sched->sched_grp[group].mask, &new_mask); + grp_update_mask(group, &new_mask); odp_spinlock_unlock(&sched->grp_lock); @@ -1219,9 +1324,10 @@ static void schedule_prefetch(int num ODP_UNUSED) static int schedule_sched_queue(uint32_t queue_index) { + int grp = sched->queue[queue_index].grp; int prio = sched->queue[queue_index].prio; int queue_per_prio = sched->queue[queue_index].queue_per_prio; - ring_t *ring = &sched->prio_q[prio][queue_per_prio].ring; + ring_t *ring = &sched->prio_q[grp][prio][queue_per_prio].ring; ring_enq(ring, PRIO_QUEUE_MASK, queue_index); return 0;