From patchwork Tue Sep 5 11:38:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavan Nikhilesh X-Patchwork-Id: 28367 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 8BC1D5323; Tue, 5 Sep 2017 13:39:11 +0200 (CEST) Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0040.outbound.protection.outlook.com [104.47.36.40]) by dpdk.org (Postfix) with ESMTP id 9B5D53989 for ; Tue, 5 Sep 2017 13:39:09 +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=imILeUbgOSu2/RVqMqLpZP/pstpxlVWQ+4RIQtkpIfs=; b=VwJ6nN04zg0Knvz1OQ/gwQZ0+fvxTDziAjLToIGTNmtXhJMD2lMfZ5tSZxIpAToZJ405tJv5EQOlhRivYw2x4yhPxVY+Z6eMIy3/TY1IGgh6jxhXjrpm3lmM3cNrNwI0UA7VZm0w/Ixd0J5g/tFu6ioFphu4K28DjBntNllPBuc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Pavan.Bhagavatula@cavium.com; Received: from PBHAGAVATULA-LT.caveonetworks.com (111.93.218.67) by CY4PR07MB3464.namprd07.prod.outlook.com (10.171.252.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.20.13.10; Tue, 5 Sep 2017 11:39:05 +0000 From: Pavan Nikhilesh To: cristian.dumitrescu@intel.com, stephen@networkplumber.org Cc: dev@dpdk.org, Pavan Bhagavatula Date: Tue, 5 Sep 2017 17:08:35 +0530 Message-Id: <1504611516-27404-2-git-send-email-pbhagavatula@caviumnetworks.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504611516-27404-1-git-send-email-pbhagavatula@caviumnetworks.com> References: <1504611516-27404-1-git-send-email-pbhagavatula@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: BM1PR01CA0090.INDPRD01.PROD.OUTLOOK.COM (10.174.208.158) To CY4PR07MB3464.namprd07.prod.outlook.com (10.171.252.145) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 20df616f-e65b-4a6c-c0d1-08d4f452b791 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:CY4PR07MB3464; X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464; 3:hg8fnAQEWsZSm0nbagfe4LtCWl3lH6sSmSQslI3Zviiajrw7BV4+fTo4fWVnWcMoDy3qMY9inanZhfhKhjowr4A3PP8IdOcGTAOP31RQJDMIHWKbjDfnXS4T87ujHEgkZ8GzTp6VfaTytG4v+rQMwNtXZ6CTVgHuzmm2CUtZ+yMj+3Whf/Br3EoxwBde/3vLyrqMvcUtq/WaUMQfN+6orvhAzmakUGZtkIJtdKcRlPObX32ZLdGis6S58vrzSPlp; 25:n0G8vH2kCeEG9JyjDneNT04K/gngJ3B9riRBsjdwHzOr4ahrEbErpI771ZVNQprbUJPwaPUbVdxoH05oPHkdq+M3Xohr7oX8uDXrwIQ0dxYk/9XdxAj5lvH1GIHbd3JoPU30j29nKQSO+VMi5UzmtyeVAVf8zYcbBiVI5bbaJvf8tKt+HsE3QQXHPMp86SnR92vMtwH0Ls4ybjMx5G19ekiKiFav0LIIQ7Zxij9RaDaqXDvPUivzhn6CBtnPPRXSQZo7FPadNQnsePIrv/gaVdgEEyWSQrhQo9sC5qZ8uppzFyn7OW0Lhm+GwKObNxf3QJjt1gW+spUBN8+yOmXesA==; 31:wOSy5FHMCZ7O6npHKLlyoHESUpKMaAORycujZaT7GAMbmgQ0WxfIGvhE4wD+zKB7dx4AjeQE2fPgPrA2mTFCxLkhfYN+hyCjYaZhNCw42Txp4u432tZNwNCjTm7F15B48Dla7CDC9yXgZjXsJ2EbTrLV/e+jZ4FSIHOLGG7apZrwlG6vYo/2j8mZNmiXC66lQ4Aei8BW6sUo1+PEtmdbRXS0ueZJf/kmiScSJC2uJs0= X-MS-TrafficTypeDiagnostic: CY4PR07MB3464: X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464; 20:Trj1uD+fUQ3yAUh6CacWz+1WUmCtSRrO0yVy2mh2YdAOZAVmi+B+ziChEmgHBmCLWoqNUjUW2q6n+h4rkr3KRkIVL7QmAZcvL1FIvjcsgiqlqkuNz+pQ5Wb363CfQYEG1gON+pAx9I/Tpzj/fxHGQBCaX1jimmpn3qeQh6raGxg5jn1sQo9h8ZQ7UJUrlwxELiQdsgYG/ZJOy37+IS5tiLseu9NqbyH7/wZMw6AZY+dPIprevmrup5w+3DYnSnC5zrqWsK/WTBwyotw2qqHqCKEIpwaIMwIAAWLYztNaLbXvLBsIwAmO19nNg/XcFyULn3DAgy3N84zhaxd49oq2PsjPxoyz1ycQKRcqkDE55pqPKFsNBh/e+lAqHQNos4YfpnSl88Q/wab8mlvCBKJ7tU5ye3fFM+gXtleBmCMt1od/oX51wqRR69Q0dIX4PyhXqWbpxB9G+MHOaMgPVKFfkPISfTAYFxpN3uIPrX7K0SsAOrzTuxbVmwEVYgqH/b5B2gCav7yYlb+RQ/cOy/OhSGNVo6FeP/zn/Xd4i8xYE6WKob2idCRbNnasU21pnneYSUOnnOiDeFMTJs4xKjm0I6Zo2VbdZK3OIuhxO8O9HvI=; 4:MuyzYTa01DYmorcOArJB7ZWj/611x1ix9Xr2qB149IKrV+7C7WByivR8Sd8breGAhSWCSOAlKlKvlkg1aG9MmTRl/jZlon953l6AgBSnxfhY7OJjcRzQ5u7pXQwpqc8QWLPA8/ZfImanICCdE6eq6e0OA/Lr9Z77k4wJMmJzmhf1PUXY0IOobRaoyhForR8hmb75aPo2IlMAbyT3H51VK8wnWYh71maBLmnGBu4sZQv+lOYibxp2eFfHsMy57m4H X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(93006095)(100000703101)(100105400095)(10201501046)(3002001)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123555025)(20161123558100)(20161123560025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY4PR07MB3464; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY4PR07MB3464; X-Forefront-PRVS: 0421BF7135 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(189002)(199003)(36756003)(68736007)(42186005)(189998001)(50466002)(305945005)(5003940100001)(7736002)(33646002)(66066001)(6512007)(69596002)(8676002)(6306002)(53936002)(81156014)(81166006)(106356001)(105586002)(48376002)(47776003)(110136004)(53416004)(107886003)(5009440100003)(50986999)(50226002)(76176999)(8936002)(101416001)(97736004)(6116002)(6506006)(6486002)(3846002)(2950100002)(6666003)(478600001)(966005)(42882006)(575784001)(72206003)(5660300001)(25786009)(4326008)(2906002)(42262002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3464; H:PBHAGAVATULA-LT.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR07MB3464; 23:idRkRMZB2sc27233WiYqdk5kyGZaYtrr6tT5n74gF?= /YsDCOrMZuA25D7HgCcch6jnRSYDQ2WX3w8UBDNDRg8tJOJTAlcS1edR3YeSNo0GHJI4bL0dXsqecKlBo8qEaFPzOCjea2ZzyC64i0DeKR+zw0rkT/ITif05G4ojUa/m0pT/63eDwa9i9Psp3+mTsKVxFVMKXPwhDk4Rh5Ta2Li5GyFfdeo6xZBtUbKbqqp27bobsMa48k+TGOdLW5pGZXhOGLf06ZtI/YUgnGevIXQtj2qx8iLw668MdUIxnfsuIwCY2tfM2BUZrnLv/MgyNtYXyepMZb/WcZBe+KSb5aNMHIj4K8lxQz+dwC8k23UMoEVGGoOe28dWEngcwa974/bUOguaAqFe1TiXrhSEkUvZ0U5/3ARIuZ/M+dHNFrnuSiX3iD4y2YbslSkpsFM0K+J8gAAyDaCAFd0NHyCVJFaEf0x8s2bdyJPsXCfmudXVUyzQnuZKBelQJIMRISmXPt48BcNtajBfDHUYuMwtXqa/8nXA5JWYvt7mKtSPjtimFK5zaO2aMIt0ygyx4HFK+9E16JJtFtU3OG7dE42dqrMs2j9G0zuoMKMtFv+m/RCNyGtnYpaON1/ERZXGRKJkFuwOMSIjhIy6Lfo+dcpFyRM2bOpI9pE3QrF/AIw+415hIf4jJ5HipUhX7uRV5iNceQbg8QsZlQ7vFaQKEq+2ZTo8Pz2ktH2nLN4qx8NGiGXuJZvUZ2cDbaD+bluwMWoyfxzPw998+Kp9UWcghhtc7B0Fs9/+4Tggt5DBIa9wxbv1pA3rMna8js6qZ7AP/2Y+EuQRjPdCR7bTZZ4k6eWbZ2qcl/dwbd4z9Tlv49x+Va/ByBCvZv1WXGPDK2Mx8dJpeVzBcPZXMYZvt8MfPowePjolWDb1UaY4a//GKOeDmdrIeM/i+MYUzLIzzmMrNK/kPVwcplnPBq1BX/Ym4JO1DLoYAF5HpfDICTKg4iozUbft7bppjxbOppocgke6XjpyfE1J1Kwjn+BKIi/PS2wE3qUoqZHVUdLuLnELDAufO8x3oI9dnYgAj/VNX2CpJUXsJQKCmrWvNaiToH3kWsgvbVMf5z9WTLBMLnZAN0IM3v8xIbM1Xs16tScmDdbMC4H5zybMEtI4SlHQW3gKRWqQ/Wim0AvEoV0/9LJtl7RV+sfVResuseNG4c9N2J5Lc5LjgOJ X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3464; 6:AhLGQaoy9x2CEV6EL+AeryTKOxlsN0zNdBukkPkzoR9UVIDqGP70teCcKFIw8M3je7D9C3JglMg/uTatcZiCWqVLC+IbIBRlTsOXZzjtvSS07rXeFxACewrvYnx0AqCS/dPF+gxFEJn93u/q412s/d6Qe4w2Vh2lLy0fFIYEFTbde8th+Meqho2NbMxAU59ijqHkhRmt9CFeHzchagDCzS8PSmcTnEfqUhJrkcoTLsbVK3e/XXSjCkunS9X2sFfbL7KoKulnkmgP/2yiPjSJDjDx9aZzX41cgajMBuWIgMtZhmXRf40mRWcT90LYgpeaj9aOdVXsCpiz+I/QB9IPDg==; 5:x/LJ+YFjOqCTF09meHE9VGwVQsrJkngdSvrtC3f8QD/wrFkpGV0Ix77WhB9OigzVfsPyzYMEcJaAcsh6LbBxAMnGMxr5dLPu/RffqPOaFpj7qFHYeGOvST2gs/CfR3fnQAztFjLq2P1gyQO0IRAJJw==; 24:jto8VTi2pSIQNb/JETrRSSxkQ9iQ4WRNEdmFTfi4uqUAcji59gID7ZLxKeekMhMVlCEBsg9RohesVp2CuKnnSIejs60b+J7uUeQlR0Xbe2c=; 7:1qkaPEUWkQY+d5fmrN3IqUVcsrCQo5YaLsTRj659OQmhCncasHie0INKgED7AU4cRPS0GBHe5pEaQhNIpCtui3x0h1wLoRHnOrQpExIMcVLsOIidEe0miqr9O072o1iT96FmvG1370oNZnchKvTpIccR7Zw4Lc8wkJmrbD4zzvBc40WqtIBsll1i1QZgT+c+ADdTtxj7hbZPKBFe3fLYz0J0vD0qYR9/us+T1cqwS9Q= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2017 11:39:05.2860 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3464 Subject: [dpdk-dev] [PATCH v5 2/3] 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Pavan Bhagavatula 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 | 116 +++++++++++++++++++++--- 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, 220 insertions(+), 26 deletions(-) diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map index d0bda66..5fd6101 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.08; diff --git a/lib/librte_eal/common/include/rte_reciprocal.h b/lib/librte_eal/common/include/rte_reciprocal.h index b6d752f..801d1c8 100644 --- a/lib/librte_eal/common/include/rte_reciprocal.h +++ b/lib/librte_eal/common/include/rte_reciprocal.h @@ -22,22 +22,117 @@ #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 = (((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) +{ +#ifdef __SIZEOF_INT128__ + __uint128_t xl = x; + __uint128_t rl = xl * y; + + return (rl >> 64); +#else + uint64_t u0, u1, v0, v1, k, t; + uint64_t w1, w2; + uint64_t whi; + + u1 = x >> 32; u0 = x & 0xFFFFFFFF; + v1 = y >> 32; v0 = y & 0xFFFFFFFF; + + t = u0*v0; + k = t >> 32; + + t = u1*v0 + k; + w1 = t & 0xFFFFFFFF; + w2 = t >> 32; + + t = u0*v1 + w1; + k = t >> 32; + + whi = u1*v1 + w2 + k; + + return whi; +#endif +} + +/** + * 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) { - uint32_t t = (uint32_t)(((uint64_t)a * R.m) >> 32); + uint64_t q = mullhi_u64(R->m, a); + uint64_t t = ((a - q) >> 1) + q; - return (t + ((a - t) >> R.sh1)) >> R.sh2; + 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..2024e62 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,14 +49,14 @@ 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; @@ -72,3 +67,102 @@ rte_reciprocal_value(uint32_t d) 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 65117cb..63ff2b8 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.08; 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;