From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0078.outbound.protection.outlook.com [104.47.36.78]) by dpdk.org (Postfix) with ESMTP id 8721C2BEF for ; Tue, 29 Aug 2017 20:47:15 +0200 (CEST) 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=baXK7qqo2Z5m1GymuqTfS9jZexTRYGTjTrRcvxn84ek=; b=bOkQC0z2PGlFKLTs3nE3wO3hgkn1/kU6Al8T/WKsnhC8r89LtA3mkq0v1CNjcpwnP8VJVwIZC6Qw/vZJxvgg9VLQePoQcj7kG3oaQ8BChi56mg7dBzrbzGyiQ0wKAphwtqXvzMeF6/LaMC5rAlIAbs9o6tFBQ0jmObGV2+4peRA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Pavan.Bhagavatula@cavium.com; Received: from localhost.localdomain (103.16.71.100) by DM5PR07MB3467.namprd07.prod.outlook.com (10.164.153.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.1.1385.9; Tue, 29 Aug 2017 18:47:10 +0000 From: Pavan Nikhilesh To: dev@dpdk.org Cc: cristian.dumitrescu@intel.com, stephen@networkplumber.org, Pavan Nikhilesh Date: Wed, 30 Aug 2017 00:16:18 +0530 Message-Id: <1504032378-5483-2-git-send-email-pbhagavatula@caviumnetworks.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504032378-5483-1-git-send-email-pbhagavatula@caviumnetworks.com> References: <1504032378-5483-1-git-send-email-pbhagavatula@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [103.16.71.100] X-ClientProxiedBy: SG2PR06CA0166.apcprd06.prod.outlook.com (10.175.208.20) To DM5PR07MB3467.namprd07.prod.outlook.com (10.164.153.22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0f1da253-02c7-4e0f-3cfd-08d4ef0e5c63 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(2017030254152)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:DM5PR07MB3467; X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3467; 3:XAbz7n082AuYGIqebDFQMBrklyI6D6J/WX8XcDK8ArC2YJRTSZRUYmQGzfwRu13C3198es3lW8jXcp6YR/H7R6RgOpAzuMHYY3NJhzdpOo8bMySnspaIgb7tlHDiPlGIl0un5Qv6FEgjwDdYKoxRGe8++cgRnDac35U1Yie/vFjpkQOBX8+EUfYYUsBuS/unxrzFwq/OY1XjuuTu0xq4eeTY8VgI3G4rjA2FTP1rYayr0iVcAgcmmac2M3VIFGXB; 25:o7gOWvNJGY6Q/8+hlxGEAL8j2b2u30NIgXDAQwDT5op9VghoAB3X6/GoIOJCM7qHel9etn8PDMk7Jgzf8gj2oqnMYVyYrS+y3i+D2FO+3ICRo4zpSuoQKzjMwPHzxXXo19BwVvvl8yH3ImaBK44AuR2oTekIVODOjX2IgTtVG92Zl4yGGlD17IZiYRtVl5VYPuycH87BMzWh0d+NWRZ0zHt2usynkkv0K5KD92dOR/xYCRoEQDVfWsNwH+4K1Lw+TH0m3R4/H9JaUx8fmN7hT4ImpY2nQStIsQAHzwtlamKs6B8D1HXCTBKwate3Fm+EI+lqYxY/+UbJr/FRGQPNUA==; 31:n2j512Ek20rkRsxK3JCky2gEvgK0ZBmrsn1r5K72U4XDt5t1c2cCnOqDQ81KG2y51xBYDyWjstVkpWPKDU5gfgVuYWSQ0URuOvl1qboBRhPeyhUtM9e2frWZL9NxzY8FGbil62m+kGaLjZoEvJ1rW4/N8KuAgDigx/jOFx/MwGITKLzEdZWWTR1msaU4bgHebAMxgYGJMttORxxJVZAKSsMuSzDn4UerTNvLCaz9ba0= X-MS-TrafficTypeDiagnostic: DM5PR07MB3467: X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3467; 20:ZupiHe+t1nGQYWK/1XbFstbQFq0vB9wkR2EZmYD+w1Ex27/DwErvSqttJvA6dQmXDqQJOUyCp5UUiCjWiONUqr4G7g5WLibXmEYa8dCM7MPa+owxoQ8AMd9ILtb4sMfrWjzi7az3cNQLyWymBvhA63TQf4yX3CBJuuBqB+xkSr20hNCoMuR6zzpGi1UNxsEbYg5ydxf2ZE/6x/cs3TPBHP7BNpHYl1+kWxUtyh490ZRk740S2a+313P8Qh42aGHhIBH7R87ZQD3npF+J7kOcqDT7gEFiBWzrB/mPJKN9hzHlHdeUQNB/KSndnCnKdiSedz3P1z8k2XD/Z5cRxaF2IPvbhPftOUY+hF2M9+Eg5sdpILOG7W5eZ/lDqLdoKs5wzHZbtj+PbPrwi34Eq1+RkknXibdEMniUtjOtrho/PCW6JNOrzuvH4MaCAE0uGJIPfxuSdV+mtuMAv4O92lCU4Yo75N84XvYR2Dylpoo0JcxcYQ0+oQPclKvLAiC6Ote2KoPo54lj0AVhUfngSfVef3K3ouMeZb4PBCsfdFBt42rmXBrl8kY7FvCRyFDQWdeepDy1AVkgf/RfPL8kxmBbKkGbNzGiu9cA109KWTsUEAs=; 4:0KTyXQ1jI8+IYyLF7DQgfpVL8qhZ4KzcaTa7Bdll3X+xBnbVosGGxFah8u6kZNnVZIQIrNvkcwuLQa1Xts7DEeqzbV5L+NuXwT2T8anOu98ZJpmG/TNJa2HXxAfZ4SixCGPBa2CI6H6vFnJ0y1jBjft7UfS72Gg85nE+jXBsqz/hterCWYOKV4xJjZ82HOfDa5GOLn1u7y2Fi6W3j7IQ7cUxn2jOPH5PXIaV4yE3xW2+u+f7+Iy5OvH6wGOkYeZSQB9adpi7hqDYRTBe6O0Wk9Omb2BArpYmMJmm0ZVy1S4= X-Exchange-Antispam-Report-Test: UriScan:(278428928389397); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(3002001)(100000703101)(100105400095)(10201501046)(6041248)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123555025)(20161123562025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:DM5PR07MB3467; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:DM5PR07MB3467; X-Forefront-PRVS: 0414DF926F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(7370300001)(4630300001)(6069001)(6009001)(189002)(199003)(6306002)(6506006)(6486002)(6512007)(305945005)(7736002)(6116002)(101416001)(7350300001)(3846002)(2906002)(6916009)(2950100002)(42882006)(42186005)(76176999)(966005)(50986999)(5660300001)(25786009)(110136004)(2361001)(2351001)(33646002)(68736007)(478600001)(72206003)(107886003)(36756003)(106356001)(105586002)(47776003)(189998001)(53936002)(97736004)(8676002)(48376002)(4326008)(81156014)(81166006)(50226002)(50466002)(5003940100001)(66066001)(42262002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR07MB3467; H:localhost.localdomain; 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; DM5PR07MB3467; 23:xW0p4H/T7qu67a0x2sIsXJp/mXKY5q2LBFy8WcaYZ?= =?us-ascii?Q?hexBbaliutdfUjHDVPqevFjmcxtxzpk/0K9dBp4t4iKEYUeoQlI4fG+IgbFU?= =?us-ascii?Q?YeghM3CggG1cU1GSaJcyxjHQJtXK5uOUR0CLDmU5tJbwIPQU5cVmdOUd57oU?= =?us-ascii?Q?FpDl2fAYAaDxxKIBu6SFdugVjygwstGTXUJZL/I+mfCd5oT5T15mq8WcLMlu?= =?us-ascii?Q?82EsLIu69OGYJqdjaXdyLC3MK2+HEio+Dx2w9kZFFqnelh12IBN44oN0KPm+?= =?us-ascii?Q?LI6ebVWGxAoy5P4gv+KbhnzEjvqHuEWnB8EiU9Ez5+Tn1+frfHY5F+8Y5MhE?= =?us-ascii?Q?dfSHNRZX5zO4u7CGywa5RHDLX0or52M8InjXtd5+9paSuvA4gOjq1E2FrLpD?= =?us-ascii?Q?AOmWAqqpzBDg0gND7hQ8gwANRzJ/NHkHaTOMQ/ka9ZYRXxQ98gq0Pgr4/aEJ?= =?us-ascii?Q?Fh1c29VF3ZwkhyT320jvZOyqJwU7XA8nBt3s4KOyd5azCSUm6jUk8tuikUTW?= =?us-ascii?Q?iqB6Aq/ArpYpqSPaK4ZW/z3xe/Wzz/U4VNYKB22Wzk/KxqKZDXxz8mygu9sg?= =?us-ascii?Q?wpuAQHuz/RXH78TEOwCMEv0KdKQ4+Z8E8Ag7pRPSHrpatSWFSxjpNNwyHLLM?= =?us-ascii?Q?EVLNorsKEUrr6Ygx62Hvr9mGsnzRpXmJxeQhbb6+GADvlgyQGHObFJJS29up?= =?us-ascii?Q?0WC9iADplyzWqh2OFUII+nTI7TriRlbotm/wM1QbyPl7A6A67qUevfu7HPEY?= =?us-ascii?Q?0VriIWoaxl7K3sS+2R42uWPWQt1hswG70E48XarUuR2EA2nqXdYbPEyJszEk?= =?us-ascii?Q?TgBtiuiZIsNKnPFvrIloQv3Lq39K3YYTh+mPKv3YuuM7/sNth0FQH+sW9hfO?= =?us-ascii?Q?Da3ezoa8FSygcTQc5mXuL9CI7CgolFtyjXHG5+002SMZgnJ/AQgdKPPYH6BU?= =?us-ascii?Q?cXX4rMpg44UAy1ZzPDiF4xbG4Z3tZqAEhml8QOmHJwE90JFqOoR/NogKpWPz?= =?us-ascii?Q?1s66O7rOh3INnfKFDXE1mcvKw4fb0VvUrIjjURPmpO5d4UjNIRnZuARB9+PL?= =?us-ascii?Q?o48PijHcgF8zaAmOWQzUCE7IvgoVhmcnq9kHMOZJoVRDvxeAAUrfUQfeAJ0L?= =?us-ascii?Q?HR8fuGb0aHugtvqkLgBnJHqjH/bat/EJW2oRFyr9Zafu3BvC9LkbkdClnIVa?= =?us-ascii?Q?eNiCuPA34bVdnEoO/9Ik4/HLyD9cbRzll4XWWN2XQutvORhMSchuiVeVQ=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3467; 6:R8Wb3bW69PTbkVTk5k20A4IuqCYzqs0H6rmv6WJVM39YUyFeYrnoulC4YrX+sYkDm88QDasb2vz6z4O+TrIir2XC8AIjfCqRblATIta6c/XdMbsXwhFhDkW64vmpa8DRm+jpXwktso9eSybDeD8D0lnz1ORa7PR0EjeMpvnpjK5Q9e3n7vyd0BpJ4fZRqXzlPrztPoc9hwFHtmERDHQKKqa+aKcscD80E+K0LA1/0oWPLmH/U6BCwkdTc3P+wC+QCcGHpdg/SsfFCrlOg9gjb0ZRefL24UPsc1oPa2kvWYyws6LACEWax2GM0BBzg3k6/SgC50AUSLZMgy3Fk07Y/g==; 5:v8QxhFmS3tzwdVgA/vtvw05sw1M3TnmHwv/UlUmkJLsmicSYBllsX8BKX+bQsV37zEBCJUX0gvaBsPUNpw6rD94bKGZCYMwyEfVWxWcpxIml+WmDB+zjBcN2XIWcH6m8CO1RCiD+MC/KlmqjmntTsw==; 24:j5lqvxRlQBSMFiDuhYfA2Fb7u8gwcQ5TvDvwsxBMFZ/HRXACttvofIlMpcnKqsRMlg2LlrQiVKczcp7wFeoC73MbKsN52hMZkiVaTmxcnzQ=; 7:ZXktGshz6zqokXzKzEOpb6hwrmhTu8h2u+2Z3I8BvT/J72XscFWvBLbcWJHbyWcr6AU4vFyV5fRxSzJgrHzFNsar3EU7254k2VwxXqSCmcNyfTDufdd3Hz+T9yO9F91xX3lfpOEuRoWgid8ezPLk3sNEkYUUCUhqzMmqwltBSJvvznfNYOKWsGa7+f+c1tEHy1N1XemIP5I18GOe5SUTGLa0c8lK8vlIUNOyt5xK1rs= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Aug 2017 18:47:10.9514 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR07MB3467 Subject: [dpdk-dev] [PATCH 2/2] eal: add u64 bit variant for reciprocal X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Aug 2017 18:47:16 -0000 Currently, rte_reciprocal only supports unsigned 32bit divisors. This commit adds support for unsigned 64bit divisors. Rename unsigned 32bit specific functions appropriately and update librte_sched accordingly. Signed-off-by: Pavan Nikhilesh --- lib/librte_eal/bsdapp/eal/rte_eal_version.map | 3 +- lib/librte_eal/common/include/rte_reciprocal.h | 111 ++++++++++++++++++++-- lib/librte_eal/common/rte_reciprocal.c | 120 +++++++++++++++++++++--- lib/librte_eal/linuxapp/eal/rte_eal_version.map | 3 +- lib/librte_sched/Makefile | 4 +- lib/librte_sched/rte_sched.c | 9 +- 6 files changed, 222 insertions(+), 28 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map index 00d5f60..f7f1013 100644 --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map @@ -242,6 +242,7 @@ EXPERIMENTAL { DPDK_17.11 { global: - rte_reciprocal_value; + rte_reciprocal_value_u32; + rte_reciprocal_value_u64; } DPDK_17.11; diff --git a/lib/librte_eal/common/include/rte_reciprocal.h b/lib/librte_eal/common/include/rte_reciprocal.h index b6d752f..fccbc09 100644 --- a/lib/librte_eal/common/include/rte_reciprocal.h +++ b/lib/librte_eal/common/include/rte_reciprocal.h @@ -19,25 +19,120 @@ * to calculate the division A/B. */ +/* + * libdivide + * Copyright (C) 2010 ridiculous_fish + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + * + * libdivide@ridiculousfish.com + * + */ + #ifndef _RTE_RECIPROCAL_H_ #define _RTE_RECIPROCAL_H_ -#include +#include -struct rte_reciprocal { +/** + * Unsigned 32-bit divisor structure. + */ +struct rte_reciprocal_u32 { uint32_t m; uint8_t sh1, sh2; -}; +} __rte_cache_aligned; + +/** + * Unsigned 64-bit divisor structure. + */ +struct rte_reciprocal_u64 { + uint64_t m; + uint8_t sh1; +} __rte_cache_aligned; +/** + * Divide given unsigned 32-bit integer with pre calculated divisor. + * + * @param a + * The 32-bit dividend. + * @param R + * The pointer to pre calculated divisor reciprocal structure. + * + * @return + * The result of the division + */ static inline uint32_t -rte_reciprocal_divide(uint32_t a, struct rte_reciprocal R) +rte_reciprocal_divide_u32(uint32_t a, struct rte_reciprocal_u32 *R) +{ + uint32_t t = (uint32_t)(((uint64_t)a * R->m) >> 32); + + return (t + ((a - t) >> R->sh1)) >> R->sh2; +} + +static inline uint64_t +mullhi_u64(uint64_t x, uint64_t y) { - uint32_t t = (uint32_t)(((uint64_t)a * R.m) >> 32); + __uint128_t xl = x; + __uint128_t yl = y; + __uint128_t rl = xl * yl; + return (uint64_t)(rl >> 64); +} - return (t + ((a - t) >> R.sh1)) >> R.sh2; +/** + * Divide given unsigned 64-bit integer with pre calculated divisor. + * + * @param a + * The 64-bit dividend. + * @param R + * The pointer to pre calculated divisor reciprocal structure. + * + * @return + * The result of the division + */ +static inline uint64_t +rte_reciprocal_divide_u64(uint64_t a, struct rte_reciprocal_u64 *R) +{ + uint64_t q = mullhi_u64(R->m, a); + uint64_t t = ((a - q) >> 1) + q; + return t >> R->sh1; } -struct rte_reciprocal -rte_reciprocal_value(uint32_t d); +/** + * Generate pre calculated divisor structure. + * + * @param d + * The unsigned 32-bit divisor. + * + * @return + * Divisor structure. + */ +struct rte_reciprocal_u32 +rte_reciprocal_value_u32(uint32_t d); + +/** + * Generate pre calculated divisor structure. + * + * @param d + * The unsigned 64-bit divisor. + * + * @return + * Divisor structure. + */ +struct rte_reciprocal_u64 +rte_reciprocal_value_u64(uint64_t d); #endif /* _RTE_RECIPROCAL_H_ */ diff --git a/lib/librte_eal/common/rte_reciprocal.c b/lib/librte_eal/common/rte_reciprocal.c index 7ab99b4..5d7e367 100644 --- a/lib/librte_eal/common/rte_reciprocal.c +++ b/lib/librte_eal/common/rte_reciprocal.c @@ -31,18 +31,13 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include - -#include - -#include "rte_reciprocal.h" +#include /* find largest set bit. * portable and slow but does not matter for this usage. */ static inline int -fls(uint32_t x) +fls_u32(uint32_t x) { int b; @@ -54,21 +49,120 @@ fls(uint32_t x) return 0; } -struct rte_reciprocal -rte_reciprocal_value(uint32_t d) +struct rte_reciprocal_u32 +rte_reciprocal_value_u32(uint32_t d) { - struct rte_reciprocal R; + struct rte_reciprocal_u32 R; uint64_t m; int l; - l = fls(d - 1); + l = fls_u32(d - 1); m = ((1ULL << 32) * ((1ULL << l) - d)); m /= d; ++m; R.m = m; - R.sh1 = RTE_MIN(l, 1); - R.sh2 = RTE_MAX(l - 1, 0); + R.sh1 = l > 1 ? 1 : l; + R.sh2 = (l - 1 > 0) ? l - 1 : 0; + + return R; +} + +/* Code taken from Hacker's Delight: + * http://www.hackersdelight.org/HDcode/divlu.c. + * License permits inclusion here per: + * http://www.hackersdelight.org/permissions.htm + */ +static inline uint64_t +divide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, uint64_t *r) +{ + const uint64_t b = (1ULL << 32); /* Number base (16 bits). */ + uint64_t un1, un0, /* Norm. dividend LSD's. */ + vn1, vn0, /* Norm. divisor digits. */ + q1, q0, /* Quotient digits. */ + un64, un21, un10, /* Dividend digit pairs. */ + rhat; /* A remainder. */ + int s; /* Shift amount for norm. */ + + /* If overflow, set rem. to an impossible value. */ + if (u1 >= v) { + if (r != NULL) + *r = (uint64_t) -1; + return (uint64_t) -1; + } + + /* Count leading zeros. */ + s = __builtin_clzll(v); + if (s > 0) { + v = v << s; + un64 = (u1 << s) | ((u0 >> (64 - s)) & (-s >> 31)); + un10 = u0 << s; + } else { + + un64 = u1 | u0; + un10 = u0; + } + + vn1 = v >> 32; + vn0 = v & 0xFFFFFFFF; + + un1 = un10 >> 32; + un0 = un10 & 0xFFFFFFFF; + + q1 = un64/vn1; + rhat = un64 - q1*vn1; +again1: + if (q1 >= b || q1*vn0 > b*rhat + un1) { + q1 = q1 - 1; + rhat = rhat + vn1; + if (rhat < b) + goto again1; + } + + un21 = un64*b + un1 - q1*v; + + q0 = un21/vn1; + rhat = un21 - q0*vn1; +again2: + if (q0 >= b || q0*vn0 > b*rhat + un0) { + q0 = q0 - 1; + rhat = rhat + vn1; + if (rhat < b) + goto again2; + } + + if (r != NULL) + *r = (un21*b + un0 - q0*v) >> s; + return q1*b + q0; +} + +struct rte_reciprocal_u64 +rte_reciprocal_value_u64(uint64_t d) +{ + struct rte_reciprocal_u64 R; + + const uint32_t fld = 63 - __builtin_clzll(d); + + if ((d & (d - 1)) == 0) { + R.m = 0; + R.sh1 = (fld - 1) | 0x40; + } else { + uint64_t rem; + uint64_t multiplier; + uint8_t more; + + multiplier = divide_128_div_64_to_64(1ULL << fld, 0, d, &rem); + multiplier += multiplier; + + const uint64_t twice_rem = rem + rem; + if (twice_rem >= d || twice_rem < rem) + multiplier += 1; + more = fld; + R.m = 1 + multiplier; + R.sh1 = more | 0x40; + } + + R.sh1 &= 0x3F; return R; } diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map index ac68fb3..e64840c 100644 --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map @@ -247,6 +247,7 @@ EXPERIMENTAL { DPDK_17.11 { global: - rte_reciprocal_value; + rte_reciprocal_value_u32; + rte_reciprocal_value_u64; } DPDK_17.11; diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile index 569656b..a2fd6f3 100644 --- a/lib/librte_sched/Makefile +++ b/lib/librte_sched/Makefile @@ -54,6 +54,8 @@ LIBABIVER := 1 SRCS-$(CONFIG_RTE_LIBRTE_SCHED) += rte_sched.c rte_red.c rte_approx.c # install includes -SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include := rte_sched.h rte_bitmap.h rte_sched_common.h rte_red.h rte_approx.h +SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include := rte_sched.h rte_bitmap.h +SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include += rte_sched_common.h rte_red.h +SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include += rte_approx.h include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c index 3b8ccaa..7bb6d51 100644 --- a/lib/librte_sched/rte_sched.c +++ b/lib/librte_sched/rte_sched.c @@ -228,7 +228,7 @@ struct rte_sched_port { uint64_t time_cpu_cycles; /* Current CPU time measured in CPU cyles */ uint64_t time_cpu_bytes; /* Current CPU time measured in bytes */ uint64_t time; /* Current NIC TX time measured in bytes */ - struct rte_reciprocal inv_cycles_per_byte; /* CPU cycles per byte */ + struct rte_reciprocal_u32 inv_cycles_per_byte; /* CPU cycles per byte */ /* Scheduling loop detection */ uint32_t pipe_loop; @@ -677,7 +677,7 @@ rte_sched_port_config(struct rte_sched_port_params *params) cycles_per_byte = (rte_get_tsc_hz() << RTE_SCHED_TIME_SHIFT) / params->rate; - port->inv_cycles_per_byte = rte_reciprocal_value(cycles_per_byte); + port->inv_cycles_per_byte = rte_reciprocal_value_u32(cycles_per_byte); /* Scheduling loop detection */ port->pipe_loop = RTE_SCHED_PIPE_INVALID; @@ -2147,8 +2147,9 @@ rte_sched_port_time_resync(struct rte_sched_port *port) uint64_t bytes_diff; /* Compute elapsed time in bytes */ - bytes_diff = rte_reciprocal_divide(cycles_diff << RTE_SCHED_TIME_SHIFT, - port->inv_cycles_per_byte); + bytes_diff = rte_reciprocal_divide_u32( + cycles_diff << RTE_SCHED_TIME_SHIFT, + &port->inv_cycles_per_byte); /* Advance port time */ port->time_cpu_cycles = cycles; -- 2.7.4