get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/28364/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 28364,
    "url": "https://patches.dpdk.org/api/patches/28364/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1504608532-18598-2-git-send-email-pbhagavatula@caviumnetworks.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1504608532-18598-2-git-send-email-pbhagavatula@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1504608532-18598-2-git-send-email-pbhagavatula@caviumnetworks.com",
    "date": "2017-09-05T10:48:51",
    "name": "[dpdk-dev,v4,2/3] eal: add u64 bit variant for reciprocal",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "6b64917d30d863f54f22eec529ef554c8ccd1c73",
    "submitter": {
        "id": 768,
        "url": "https://patches.dpdk.org/api/people/768/?format=api",
        "name": "Pavan Nikhilesh",
        "email": "pbhagavatula@caviumnetworks.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1504608532-18598-2-git-send-email-pbhagavatula@caviumnetworks.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/28364/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/28364/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 398E33989;\n\tTue,  5 Sep 2017 12:49:18 +0200 (CEST)",
            "from NAM03-DM3-obe.outbound.protection.outlook.com\n\t(mail-dm3nam03on0071.outbound.protection.outlook.com [104.47.41.71])\n\tby dpdk.org (Postfix) with ESMTP id 64B83378E\n\tfor <dev@dpdk.org>; Tue,  5 Sep 2017 12:49:16 +0200 (CEST)",
            "from PBHAGAVATULA-LT.caveonetworks.com (111.93.218.67) by\n\tCY4PR07MB3461.namprd07.prod.outlook.com (10.171.252.142) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.13.10; Tue, 5 Sep 2017 10:49:13 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=jpsfyXh2CMvJbI/T94GTIlwCDdUIdUq3YqzIJKddKa0=;\n\tb=ZaTkTo0ND3Q5MJgsckxm7tdG2P5hCJR1sCvGh3NlHj26RDgDGYSRA70Xt+PfoRvwJp0sOLfc5E423pHL/862w+gO8Zlznp9DASZZ9fq5GOmmdrA8ZL0Y+/yXFCPWpuvoQxmn7BGRiEpk2jDiqLR4yAJg/s8qo8F1d7ItZFGvGCE=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Pavan.Bhagavatula@cavium.com; ",
        "From": "Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>",
        "To": "dev@dpdk.org",
        "Cc": "cristian.dumitrescu@intel.com, stephen@networkplumber.org,\n\tPavan Bhagavatula <pbhagavatula@caviumnetworks.com>",
        "Date": "Tue,  5 Sep 2017 16:18:51 +0530",
        "Message-Id": "<1504608532-18598-2-git-send-email-pbhagavatula@caviumnetworks.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1504608532-18598-1-git-send-email-pbhagavatula@caviumnetworks.com>",
        "References": "<1504608532-18598-1-git-send-email-pbhagavatula@caviumnetworks.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[111.93.218.67]",
        "X-ClientProxiedBy": "MWHPR15CA0070.namprd15.prod.outlook.com (10.174.254.32) To\n\tCY4PR07MB3461.namprd07.prod.outlook.com (10.171.252.142)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "9b6d49ed-667f-4342-fdd6-08d4f44bbfee",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:CY4PR07MB3461; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; CY4PR07MB3461;\n\t3:kp+lp5mHDe3KMavMFvAN2xv0r6Ymvgxy6DdIpqrWgapn+0zqj1l5klSrM1Eb6rqKSx4E5Wa7za+OYqUPHM62bSBioxkFw782whhgg/xJSJWc1VmLVmdGkRAse09q54MiPCIKzgKO5BQpHlL+32zb7r1PVUOe5bqvEJ7dOhxsBdI/16DePonz9obpUtl59Gvn2vg3WWzg+cikbZsLL7P9jvjsTIZDvPR7wd+akQ7a09pgcXs3WxheUA6AZUPmntIW;\n\t25:UFJfKlfgXeSOyfQaoE+KhpTLhkOuvxc23ZfewkxppD08A5NaKk6hIiOAPjgPcQy4a0SI3kP8BUUme12eYiB8tcyh5R9dXk9DnM/C2f6gf6hKP526OAhGkFcy8pkKfQ45ie+42uOLRKPgOXGq0MZm3P5QMyBSN3I5iqxJEAqvEpAP85YoLzVTW74+N+uQEqLFPwld5FHSoLf6t3Kbtwn/pEI3j7+nOAow7zd/Jad5JB1Zbm9ziM5E3OZFRsaDz2rKnGlk0MM4tHvR9ZXq7PZHvrVo6j/C4xJe59haEYraedTng+XpgXXd2D2R56kCn6cl4b3Cq32M8AQItty7Ks8sbQ==;\n\t31:5TexQFP2IeVQ4jFCCx9fnaHRDc33NqrvaF1wrfCewpy5H9SQ2FdmgPSn7qtW/N6VMYd16NRCbgOVnztPcSSrZZAfdNOeW4ISj83KadhMopj5jf4QbIitHmM4JsbYcBolLyPAOAoFQc9qcTWec6x1+5GXrZ6gHAlaxYTE0LDCizMp6vELG4Z2B/MMK6nB/eLdVyoxvE61t7NxHWcasZUARP30bneEmwSHaD709Z32B1w=",
            "1; CY4PR07MB3461;\n\t20:iWUDoWXpGh/RtdZk8bAkmRdvJi14ED2N1+13pz3mgzlBXFpkOnYx8uS+YFxYJtiWOyTLA4O5bGeaQFHlGhghSghJ8AjyYHdZ0LaqpoYHQk3JyRi6seatkUFpMZVrxtv1eN1zpa2NA6R8sCJ0LOrTDbpCdRepxsDCHA5WhKbiqCepQkA3eNY/xoQMko3Q4SFGEMvb7JJPVu1SI+H1jitulvBCjcGR0BYmxX5Y59Tf04xtuUJjZwBPs/CXFQ1SMHKY5UxAio98n3B4eAL2sV9sWor3uNVYyrIDEAC8v17Zf9U0VHhFconOG+sRjnFCKVEkUfnpkXg5AivOV6cx7mgSpXLxTO9OoE8gy5Xr0E45NtfVdtcq2f/0l6fPRvofsXpEoHYxLWIoLNrlCF3IpmLxPGfssO7y3/SljBaMJpCI+mWTQLFZv5gv1CuvqNiDAlC9MP8umMeWk1yp0obTOSXqwrc4l6A/Dg7T7eNXyXVEiqis7qRkaesFxStcc7KAPz9tag+U8NbJFSaF03ER6PbhRZGySIS50+kQ++787pdXOZCJpBj0DdWN6yfdVQZWZ8lRg3V7kzBlYDG8MEQqCQzYksY2cP6x31O3x63SXLtsyQo=;\n\t4:Xa0ycrrmvX0jlpD3sWngnlMFVpo7uGNcM4Gvm1Zs+NO4y2OWY7vfsv6YcsU0Cu2wpnQimGYjxk2B9dItxa6nfUTv4W6RfmeGJ1WJYjhgjE6oJmPTx2Knv6HsAczWrj9v7XETKncbUqfZbUMwXyAuH9Ag2Hil2pprGr3weD60UeLlfqanjzDYGJtwpFBAg5spiBNt+v029jq4utqwpbWpQ2wZSevbp3afJSobgVGQ0DfBrD4E4I7m8o8D3Xwtj4Kv",
            "=?us-ascii?Q?1; CY4PR07MB3461;\n\t23:kGSEzB3bouCHcUqMmeNqC2f1aW2DvnnWp5oAwWBe+?=\n\t5eih8fEJ136zmmNPpfbEjGLxiloaj+W/GCMqLtaMkioFZ+P+Ewiy8ufqhwI9X42I0R/ca8azh9cuEotZwmcaNIqPa6FAi6Zpa3QQUoo176uRt07tW3ty+1Kygv4mpKifCo7H/wUtJermmrgoPi7Krmd7vtQ04spo/hpoNvPb+mnyOaL3Jao5EAhUPnuau3lx9VPvaU4JtP8Ig2QIf/Xf/m0aVw0jUe84vFsI9Zm1Jit6jxsXaGl1o43boeIifLhLckF8hIEZdweECeqqJ9rxcCDnNUfqH9xUpv5P312JTiGlI8NCncmva7TqZVnMRftS+lwQ58IG26PZB28d48dhyX+43J1SojQv3ubol3nkEvy+c9oxNjGcnfgEoqv+N7NujHD1d1BAOH+1rQB9a22SmhZrnhBc4cYSQRQ/rpM2e1mNYlLxh2fUxhmuBbJjmUNLKm1iAwqhY5bHjkv/Xf1Sci1RBv5roIyf2Z9KeKbp93oGETpPb13OS7xtaRsbbQMoKQjl9JYA4Hjaq6tIrN04ROvxbwAtKh4cKCeqaM8EW1jUOiZsUaztdFyYUOBYTU4O7XmOOUIScjuP6Fbxo/IA0M6L3LsUFjyehZIk8M02fBMN710BJVg5q+2Fc9cEFCxjdBFA2PVlXYFRfH54bhSte9Ki0dTqt3piGxhhOLyHDYjznbmHqrO/CHDoXq0JEsA/sOkFsEfV02kkaR3fhjgi2E+YAGOSIOUiC0O2OUGro4Tb9a+EsykrqfFSehB1YarclRVgXD15HPPA++348PrdMjZkZyE6h6SircWmy0agkLiIIb9djD0f0OOrSrfrh1SrpbVde6So/xpAi7O4mJ/59b0Eb2VgIufS/dM+ilS7t8Te8LRbsjnz4A8+cRz9V+COwxIQwdgj5baipNVp5VpwRzSzwjKJ0wIScdWgFRcpI1TW54gQ36jmkugROSU8zfVWmFSWjqs+xeGHQwdvgIGfd9BeWDBZU+/EUiOhJxHKzFrcnPa/rL3MLqrZbgXJwEtm3EWuEm8M1sAmbq9O5ArmQG/NhNN0BMpuTaxIEeMTnqHdIg3i8/DNj8UkS5zlzSsAef16Pg43kuK015CBub48VKYL9AOpjnyQPE2YOwWrV02a6crFhX14CGs+HRfdJ5hA+LMcd2hOyyqFv+zkgsu9X3UjmxJWuqw40/sytmj1bby0Q==",
            "1; CY4PR07MB3461;\n\t6:tn++2N6rau53/G40QVSh5ElcSBwh4ewxCi8mPbqNNTD5pFzIWnFvHgBVqV/jDGPyx1O4WszRx6ADNCbORyqxkAm8plivpFBOrwTp0LrqUqUX6ZdyYOMU9Zy6xGoPLkBpInl7LNiDqwpOnDKCP65J4tJZuiKPuddsntMuEVR1OppritlHguEIOUoRNSkhrMD8hdwYDGBtazGGLHCT4lQbQN50gqxAHNaog5igJCVouL8gkWvJfcBVyzgb+EZ02RCnfCV8TsP6nlkRWkQnikZsbW2jCRq1GeLrMO1pHhSxbucy8d3sQ3GIoGAlCzpVWwNnJQxsX+4+lNwFyjx10KqLew==;\n\t5:1t0H7ZjtdnkhH0bMjgrzh596O8CkUxU2ww5tzLM21YydLw3isG1MvIWHzAAtfHcswtvKRcCg14QSpMmrUhU9jwt7h9i/dEfULjofnSkHwWmLmhgjJGax8n+Q6daBZSZFsqbGAnAams3oxkBXkZLopQ==;\n\t24:o2AQp/1tv2eODM4J2G2ojKV2o2qNBihV4oKF7cjc8bR0CiO4XzBvJEOOE1riBQMrFfoIXbfFmBTscvT/yGNZ3N05PG9fYdQcBNtklIyScOw=;\n\t7:IyZ2Cr7cE1Y3pnBbDk6Pb8aPw6X5fuGFzOzQULOuVb6l9ktSbBTDbk59rRcIZBk32rrTJrSts+HGJal5JobQcSlktRlnuEiiUXu6/YayMEGClyLpIvq47yytfeiZuT1QFcATdib+/T+X55MFjD7/U6CN3zpoBADZH9GXzkrpnXB+LZogRg7g0o43Cy974Vnl/mN68SFSLWRAqLRKF3gRmOEQebdiqbhoIGTd08VWuV0="
        ],
        "X-MS-TrafficTypeDiagnostic": "CY4PR07MB3461:",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-Microsoft-Antispam-PRVS": "<CY4PR07MB3461EEE21CB3CA0F325E043780960@CY4PR07MB3461.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(10201501046)(93006095)(100000703101)(100105400095)(3002001)(6041248)(20161123555025)(20161123560025)(20161123558100)(20161123562025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:CY4PR07MB3461; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:CY4PR07MB3461; ",
        "X-Forefront-PRVS": "0421BF7135",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(6009001)(199003)(189002)(50466002)(72206003)(69596002)(48376002)(305945005)(66066001)(97736004)(478600001)(107886003)(4326008)(110136004)(8936002)(53936002)(6512007)(6306002)(81156014)(5660300001)(8676002)(68736007)(7736002)(25786009)(966005)(81166006)(36756003)(50226002)(42186005)(5003940100001)(105586002)(2361001)(33646002)(101416001)(53416004)(6116002)(189998001)(3846002)(2950100002)(6916009)(42882006)(2906002)(5009440100003)(50986999)(47776003)(6486002)(76176999)(6666003)(6506006)(106356001)(2351001)(42262002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3461;\n\tH:PBHAGAVATULA-LT.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords;\n\tA:1; MX:1; LANG:en; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "caviumnetworks.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "05 Sep 2017 10:49:13.0292\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY4PR07MB3461",
        "Subject": "[dpdk-dev] [PATCH v4 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 <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Pavan Bhagavatula <pbhagavatula@caviumnetworks.com>\n\nCurrently, rte_reciprocal only supports unsigned 32bit divisors. This\ncommit adds support for unsigned 64bit divisors.\n\nRename unsigned 32bit specific functions appropriately and update\nlibrte_sched accordingly.\n\nSigned-off-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>\n---\n lib/librte_eal/bsdapp/eal/rte_eal_version.map   |   3 +-\n lib/librte_eal/common/include/rte_reciprocal.h  | 111 +++++++++++++++++++++--\n lib/librte_eal/common/rte_reciprocal.c          | 116 +++++++++++++++++++++---\n lib/librte_eal/linuxapp/eal/rte_eal_version.map |   3 +-\n lib/librte_sched/Makefile                       |   4 +-\n lib/librte_sched/rte_sched.c                    |   9 +-\n 6 files changed, 220 insertions(+), 26 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\nindex 90d7258..59a85bb 100644\n--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n@@ -241,6 +241,7 @@ EXPERIMENTAL {\n DPDK_17.11 {\n \tglobal:\n \n-\trte_reciprocal_value;\n+\trte_reciprocal_value_u32;\n+\trte_reciprocal_value_u64;\n \n } DPDK_17.08;\ndiff --git a/lib/librte_eal/common/include/rte_reciprocal.h b/lib/librte_eal/common/include/rte_reciprocal.h\nindex b6d752f..801d1c8 100644\n--- a/lib/librte_eal/common/include/rte_reciprocal.h\n+++ b/lib/librte_eal/common/include/rte_reciprocal.h\n@@ -22,22 +22,117 @@\n #ifndef _RTE_RECIPROCAL_H_\n #define _RTE_RECIPROCAL_H_\n \n-#include <stdint.h>\n+#include <rte_memory.h>\n \n-struct rte_reciprocal {\n+/**\n+ * Unsigned 32-bit divisor structure.\n+ */\n+struct rte_reciprocal_u32 {\n \tuint32_t m;\n \tuint8_t sh1, sh2;\n-};\n+} __rte_cache_aligned;\n+\n+/**\n+ * Unsigned 64-bit divisor structure.\n+ */\n+struct rte_reciprocal_u64 {\n+\tuint64_t m;\n+\tuint8_t sh1;\n+} __rte_cache_aligned;\n \n+/**\n+ * Divide given unsigned 32-bit integer with pre calculated divisor.\n+ *\n+ * @param a\n+ *   The 32-bit dividend.\n+ * @param R\n+ *   The pointer to pre calculated divisor reciprocal structure.\n+ *\n+ * @return\n+ *   The result of the division\n+ */\n static inline uint32_t\n-rte_reciprocal_divide(uint32_t a, struct rte_reciprocal R)\n+rte_reciprocal_divide_u32(uint32_t a, struct rte_reciprocal_u32 *R)\n+{\n+\tuint32_t t = (((uint64_t)a * R->m) >> 32);\n+\n+\treturn (t + ((a - t) >> R->sh1)) >> R->sh2;\n+}\n+\n+static inline uint64_t\n+mullhi_u64(uint64_t x, uint64_t y)\n+{\n+#ifdef __SIZEOF_INT128__\n+\t__uint128_t xl = x;\n+\t__uint128_t rl = xl * y;\n+\n+\treturn (rl >> 64);\n+#else\n+\tuint64_t u0, u1, v0, v1, k, t;\n+\tuint64_t w1, w2;\n+\tuint64_t whi;\n+\n+\tu1 = x >> 32; u0 = x & 0xFFFFFFFF;\n+\tv1 = y >> 32; v0 = y & 0xFFFFFFFF;\n+\n+\tt = u0*v0;\n+\tk = t >> 32;\n+\n+\tt = u1*v0 + k;\n+\tw1 = t & 0xFFFFFFFF;\n+\tw2 = t >> 32;\n+\n+\tt = u0*v1 + w1;\n+\tk = t >> 32;\n+\n+\twhi = u1*v1 + w2 + k;\n+\n+\treturn whi;\n+#endif\n+}\n+\n+/**\n+ * Divide given unsigned 64-bit integer with pre calculated divisor.\n+ *\n+ * @param a\n+ *   The 64-bit dividend.\n+ * @param R\n+ *   The pointer to pre calculated divisor reciprocal structure.\n+ *\n+ * @return\n+ *   The result of the division\n+ */\n+static inline uint64_t\n+rte_reciprocal_divide_u64(uint64_t a, struct rte_reciprocal_u64 *R)\n {\n-\tuint32_t t = (uint32_t)(((uint64_t)a * R.m) >> 32);\n+\tuint64_t q = mullhi_u64(R->m, a);\n+\tuint64_t t = ((a - q) >> 1) + q;\n \n-\treturn (t + ((a - t) >> R.sh1)) >> R.sh2;\n+\treturn t >> R->sh1;\n }\n \n-struct rte_reciprocal\n-rte_reciprocal_value(uint32_t d);\n+/**\n+ * Generate pre calculated divisor structure.\n+ *\n+ * @param d\n+ *   The unsigned 32-bit divisor.\n+ *\n+ * @return\n+ *   Divisor structure.\n+ */\n+struct rte_reciprocal_u32\n+rte_reciprocal_value_u32(uint32_t d);\n+\n+/**\n+ * Generate pre calculated divisor structure.\n+ *\n+ * @param d\n+ *   The unsigned 64-bit divisor.\n+ *\n+ * @return\n+ *   Divisor structure.\n+ */\n+struct rte_reciprocal_u64\n+rte_reciprocal_value_u64(uint64_t d);\n \n #endif /* _RTE_RECIPROCAL_H_ */\ndiff --git a/lib/librte_eal/common/rte_reciprocal.c b/lib/librte_eal/common/rte_reciprocal.c\nindex 7ab99b4..2024e62 100644\n--- a/lib/librte_eal/common/rte_reciprocal.c\n+++ b/lib/librte_eal/common/rte_reciprocal.c\n@@ -31,18 +31,13 @@\n  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  */\n \n-#include <stdio.h>\n-#include <stdint.h>\n-\n-#include <rte_common.h>\n-\n-#include \"rte_reciprocal.h\"\n+#include <rte_reciprocal.h>\n \n /* find largest set bit.\n  * portable and slow but does not matter for this usage.\n  */\n static inline int\n-fls(uint32_t x)\n+fls_u32(uint32_t x)\n {\n \tint b;\n \n@@ -54,14 +49,14 @@ fls(uint32_t x)\n \treturn 0;\n }\n \n-struct rte_reciprocal\n-rte_reciprocal_value(uint32_t d)\n+struct rte_reciprocal_u32\n+rte_reciprocal_value_u32(uint32_t d)\n {\n-\tstruct rte_reciprocal R;\n+\tstruct rte_reciprocal_u32 R;\n \tuint64_t m;\n \tint l;\n \n-\tl = fls(d - 1);\n+\tl = fls_u32(d - 1);\n \tm = ((1ULL << 32) * ((1ULL << l) - d));\n \tm /= d;\n \n@@ -72,3 +67,102 @@ rte_reciprocal_value(uint32_t d)\n \n \treturn R;\n }\n+\n+/* Code taken from Hacker's Delight:\n+ * http://www.hackersdelight.org/HDcode/divlu.c.\n+ * License permits inclusion here per:\n+ * http://www.hackersdelight.org/permissions.htm\n+ */\n+static inline uint64_t\n+divide_128_div_64_to_64(uint64_t u1, uint64_t u0, uint64_t v, uint64_t *r)\n+{\n+\tconst uint64_t b = (1ULL << 32); /* Number base (16 bits). */\n+\tuint64_t un1, un0,           /* Norm. dividend LSD's. */\n+\t\t\t vn1, vn0,           /* Norm. divisor digits. */\n+\t\t\t q1, q0,             /* Quotient digits. */\n+\t\t\t un64, un21, un10,   /* Dividend digit pairs. */\n+\t\t\t rhat;               /* A remainder. */\n+\tint s;                       /* Shift amount for norm. */\n+\n+    /* If overflow, set rem. to an impossible value. */\n+\tif (u1 >= v) {\n+\t\tif (r != NULL)\n+\t\t\t*r = (uint64_t) -1;\n+\t\treturn (uint64_t) -1;\n+\t}\n+\n+\t/* Count leading zeros. */\n+\ts = __builtin_clzll(v);\n+\tif (s > 0) {\n+\t\tv = v << s;\n+\t\tun64 = (u1 << s) | ((u0 >> (64 - s)) & (-s >> 31));\n+\t\tun10 = u0 << s;\n+\t} else {\n+\n+\t\tun64 = u1 | u0;\n+\t\tun10 = u0;\n+\t}\n+\n+\tvn1 = v >> 32;\n+\tvn0 = v & 0xFFFFFFFF;\n+\n+\tun1 = un10 >> 32;\n+\tun0 = un10 & 0xFFFFFFFF;\n+\n+\tq1 = un64/vn1;\n+\trhat = un64 - q1*vn1;\n+again1:\n+\tif (q1 >= b || q1*vn0 > b*rhat + un1) {\n+\t\tq1 = q1 - 1;\n+\t\trhat = rhat + vn1;\n+\t\tif (rhat < b)\n+\t\t\tgoto again1;\n+\t}\n+\n+\tun21 = un64*b + un1 - q1*v;\n+\n+\tq0 = un21/vn1;\n+\trhat = un21 - q0*vn1;\n+again2:\n+\tif (q0 >= b || q0*vn0 > b*rhat + un0) {\n+\t\tq0 = q0 - 1;\n+\t\trhat = rhat + vn1;\n+\t\tif (rhat < b)\n+\t\t\tgoto again2;\n+\t}\n+\n+\tif (r != NULL)\n+\t\t*r = (un21*b + un0 - q0*v) >> s;\n+\treturn q1*b + q0;\n+}\n+\n+struct rte_reciprocal_u64\n+rte_reciprocal_value_u64(uint64_t d)\n+{\n+\tstruct rte_reciprocal_u64 R;\n+\n+\tconst uint32_t fld = 63 - __builtin_clzll(d);\n+\n+\tif ((d & (d - 1)) == 0) {\n+\t\tR.m = 0;\n+\t\tR.sh1 = (fld - 1) | 0x40;\n+\t} else {\n+\t\tuint64_t rem;\n+\t\tuint64_t multiplier;\n+\t\tuint8_t more;\n+\n+\t\tmultiplier = divide_128_div_64_to_64(1ULL << fld, 0, d, &rem);\n+\t\tmultiplier += multiplier;\n+\n+\t\tconst uint64_t twice_rem = rem + rem;\n+\t\tif (twice_rem >= d || twice_rem < rem)\n+\t\t\tmultiplier += 1;\n+\t\tmore = fld;\n+\t\tR.m = 1 + multiplier;\n+\t\tR.sh1 = more | 0x40;\n+\t}\n+\n+\tR.sh1 &= 0x3F;\n+\n+\treturn R;\n+}\ndiff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\nindex 2070cba..2671627 100644\n--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n@@ -246,6 +246,7 @@ EXPERIMENTAL {\n DPDK_17.11 {\n \tglobal:\n \n-\trte_reciprocal_value;\n+\trte_reciprocal_value_u32;\n+\trte_reciprocal_value_u64;\n \n } DPDK_17.08;\ndiff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile\nindex 569656b..a2fd6f3 100644\n--- a/lib/librte_sched/Makefile\n+++ b/lib/librte_sched/Makefile\n@@ -54,6 +54,8 @@ LIBABIVER := 1\n SRCS-$(CONFIG_RTE_LIBRTE_SCHED) += rte_sched.c rte_red.c rte_approx.c\n \n # install includes\n-SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include := rte_sched.h rte_bitmap.h rte_sched_common.h rte_red.h rte_approx.h\n+SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include := rte_sched.h rte_bitmap.h\n+SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include += rte_sched_common.h rte_red.h\n+SYMLINK-$(CONFIG_RTE_LIBRTE_SCHED)-include += rte_approx.h\n \n include $(RTE_SDK)/mk/rte.lib.mk\ndiff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c\nindex 3b8ccaa..7bb6d51 100644\n--- a/lib/librte_sched/rte_sched.c\n+++ b/lib/librte_sched/rte_sched.c\n@@ -228,7 +228,7 @@ struct rte_sched_port {\n \tuint64_t time_cpu_cycles;     /* Current CPU time measured in CPU cyles */\n \tuint64_t time_cpu_bytes;      /* Current CPU time measured in bytes */\n \tuint64_t time;                /* Current NIC TX time measured in bytes */\n-\tstruct rte_reciprocal inv_cycles_per_byte; /* CPU cycles per byte */\n+\tstruct rte_reciprocal_u32 inv_cycles_per_byte; /* CPU cycles per byte */\n \n \t/* Scheduling loop detection */\n \tuint32_t pipe_loop;\n@@ -677,7 +677,7 @@ rte_sched_port_config(struct rte_sched_port_params *params)\n \n \tcycles_per_byte = (rte_get_tsc_hz() << RTE_SCHED_TIME_SHIFT)\n \t\t/ params->rate;\n-\tport->inv_cycles_per_byte = rte_reciprocal_value(cycles_per_byte);\n+\tport->inv_cycles_per_byte = rte_reciprocal_value_u32(cycles_per_byte);\n \n \t/* Scheduling loop detection */\n \tport->pipe_loop = RTE_SCHED_PIPE_INVALID;\n@@ -2147,8 +2147,9 @@ rte_sched_port_time_resync(struct rte_sched_port *port)\n \tuint64_t bytes_diff;\n \n \t/* Compute elapsed time in bytes */\n-\tbytes_diff = rte_reciprocal_divide(cycles_diff << RTE_SCHED_TIME_SHIFT,\n-\t\t\t\t\t   port->inv_cycles_per_byte);\n+\tbytes_diff = rte_reciprocal_divide_u32(\n+\t\t\tcycles_diff << RTE_SCHED_TIME_SHIFT,\n+\t\t\t&port->inv_cycles_per_byte);\n \n \t/* Advance port time */\n \tport->time_cpu_cycles = cycles;\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "2/3"
    ]
}