get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 28068,
    "url": "https://patches.dpdk.org/api/patches/28068/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1504032378-5483-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": "<1504032378-5483-2-git-send-email-pbhagavatula@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1504032378-5483-2-git-send-email-pbhagavatula@caviumnetworks.com",
    "date": "2017-08-29T18:46:18",
    "name": "[dpdk-dev,2/2] eal: add u64 bit variant for reciprocal",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "a65f1053345545ff196a9465ba547c84b3478200",
    "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/1504032378-5483-2-git-send-email-pbhagavatula@caviumnetworks.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/28068/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/28068/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 5E5F92BEF;\n\tTue, 29 Aug 2017 20:47:16 +0200 (CEST)",
            "from NAM02-SN1-obe.outbound.protection.outlook.com\n\t(mail-sn1nam02on0078.outbound.protection.outlook.com [104.47.36.78])\n\tby dpdk.org (Postfix) with ESMTP id 8721C2BEF\n\tfor <dev@dpdk.org>; Tue, 29 Aug 2017 20:47:15 +0200 (CEST)",
            "from localhost.localdomain (103.16.71.100) by\n\tDM5PR07MB3467.namprd07.prod.outlook.com (10.164.153.22) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.1.1385.9; Tue, 29 Aug 2017 18:47:10 +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=baXK7qqo2Z5m1GymuqTfS9jZexTRYGTjTrRcvxn84ek=;\n\tb=bOkQC0z2PGlFKLTs3nE3wO3hgkn1/kU6Al8T/WKsnhC8r89LtA3mkq0v1CNjcpwnP8VJVwIZC6Qw/vZJxvgg9VLQePoQcj7kG3oaQ8BChi56mg7dBzrbzGyiQ0wKAphwtqXvzMeF6/LaMC5rAlIAbs9o6tFBQ0jmObGV2+4peRA=",
        "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 Nikhilesh <pbhagavatula@caviumnetworks.com>",
        "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\n\tDM5PR07MB3467.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;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(300000502095)(300135100095)(22001)(2017030254152)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:DM5PR07MB3467; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; DM5PR07MB3467;\n\t3:XAbz7n082AuYGIqebDFQMBrklyI6D6J/WX8XcDK8ArC2YJRTSZRUYmQGzfwRu13C3198es3lW8jXcp6YR/H7R6RgOpAzuMHYY3NJhzdpOo8bMySnspaIgb7tlHDiPlGIl0un5Qv6FEgjwDdYKoxRGe8++cgRnDac35U1Yie/vFjpkQOBX8+EUfYYUsBuS/unxrzFwq/OY1XjuuTu0xq4eeTY8VgI3G4rjA2FTP1rYayr0iVcAgcmmac2M3VIFGXB;\n\t25:o7gOWvNJGY6Q/8+hlxGEAL8j2b2u30NIgXDAQwDT5op9VghoAB3X6/GoIOJCM7qHel9etn8PDMk7Jgzf8gj2oqnMYVyYrS+y3i+D2FO+3ICRo4zpSuoQKzjMwPHzxXXo19BwVvvl8yH3ImaBK44AuR2oTekIVODOjX2IgTtVG92Zl4yGGlD17IZiYRtVl5VYPuycH87BMzWh0d+NWRZ0zHt2usynkkv0K5KD92dOR/xYCRoEQDVfWsNwH+4K1Lw+TH0m3R4/H9JaUx8fmN7hT4ImpY2nQStIsQAHzwtlamKs6B8D1HXCTBKwate3Fm+EI+lqYxY/+UbJr/FRGQPNUA==;\n\t31:n2j512Ek20rkRsxK3JCky2gEvgK0ZBmrsn1r5K72U4XDt5t1c2cCnOqDQ81KG2y51xBYDyWjstVkpWPKDU5gfgVuYWSQ0URuOvl1qboBRhPeyhUtM9e2frWZL9NxzY8FGbil62m+kGaLjZoEvJ1rW4/N8KuAgDigx/jOFx/MwGITKLzEdZWWTR1msaU4bgHebAMxgYGJMttORxxJVZAKSsMuSzDn4UerTNvLCaz9ba0=",
            "1; DM5PR07MB3467;\n\t20:ZupiHe+t1nGQYWK/1XbFstbQFq0vB9wkR2EZmYD+w1Ex27/DwErvSqttJvA6dQmXDqQJOUyCp5UUiCjWiONUqr4G7g5WLibXmEYa8dCM7MPa+owxoQ8AMd9ILtb4sMfrWjzi7az3cNQLyWymBvhA63TQf4yX3CBJuuBqB+xkSr20hNCoMuR6zzpGi1UNxsEbYg5ydxf2ZE/6x/cs3TPBHP7BNpHYl1+kWxUtyh490ZRk740S2a+313P8Qh42aGHhIBH7R87ZQD3npF+J7kOcqDT7gEFiBWzrB/mPJKN9hzHlHdeUQNB/KSndnCnKdiSedz3P1z8k2XD/Z5cRxaF2IPvbhPftOUY+hF2M9+Eg5sdpILOG7W5eZ/lDqLdoKs5wzHZbtj+PbPrwi34Eq1+RkknXibdEMniUtjOtrho/PCW6JNOrzuvH4MaCAE0uGJIPfxuSdV+mtuMAv4O92lCU4Yo75N84XvYR2Dylpoo0JcxcYQ0+oQPclKvLAiC6Ote2KoPo54lj0AVhUfngSfVef3K3ouMeZb4PBCsfdFBt42rmXBrl8kY7FvCRyFDQWdeepDy1AVkgf/RfPL8kxmBbKkGbNzGiu9cA109KWTsUEAs=;\n\t4:0KTyXQ1jI8+IYyLF7DQgfpVL8qhZ4KzcaTa7Bdll3X+xBnbVosGGxFah8u6kZNnVZIQIrNvkcwuLQa1Xts7DEeqzbV5L+NuXwT2T8anOu98ZJpmG/TNJa2HXxAfZ4SixCGPBa2CI6H6vFnJ0y1jBjft7UfS72Gg85nE+jXBsqz/hterCWYOKV4xJjZ82HOfDa5GOLn1u7y2Fi6W3j7IQ7cUxn2jOPH5PXIaV4yE3xW2+u+f7+Iy5OvH6wGOkYeZSQB9adpi7hqDYRTBe6O0Wk9Omb2BArpYmMJmm0ZVy1S4=",
            "=?us-ascii?Q?1; DM5PR07MB3467;\n\t23:xW0p4H/T7qu67a0x2sIsXJp/mXKY5q2LBFy8WcaYZ?=\n\thexBbaliutdfUjHDVPqevFjmcxtxzpk/0K9dBp4t4iKEYUeoQlI4fG+IgbFUYeghM3CggG1cU1GSaJcyxjHQJtXK5uOUR0CLDmU5tJbwIPQU5cVmdOUd57oUFpDl2fAYAaDxxKIBu6SFdugVjygwstGTXUJZL/I+mfCd5oT5T15mq8WcLMlu82EsLIu69OGYJqdjaXdyLC3MK2+HEio+Dx2w9kZFFqnelh12IBN44oN0KPm+LI6ebVWGxAoy5P4gv+KbhnzEjvqHuEWnB8EiU9Ez5+Tn1+frfHY5F+8Y5MhEdfSHNRZX5zO4u7CGywa5RHDLX0or52M8InjXtd5+9paSuvA4gOjq1E2FrLpDAOmWAqqpzBDg0gND7hQ8gwANRzJ/NHkHaTOMQ/ka9ZYRXxQ98gq0Pgr4/aEJFh1c29VF3ZwkhyT320jvZOyqJwU7XA8nBt3s4KOyd5azCSUm6jUk8tuikUTWiqB6Aq/ArpYpqSPaK4ZW/z3xe/Wzz/U4VNYKB22Wzk/KxqKZDXxz8mygu9sgwpuAQHuz/RXH78TEOwCMEv0KdKQ4+Z8E8Ag7pRPSHrpatSWFSxjpNNwyHLLMEVLNorsKEUrr6Ygx62Hvr9mGsnzRpXmJxeQhbb6+GADvlgyQGHObFJJS29up0WC9iADplyzWqh2OFUII+nTI7TriRlbotm/wM1QbyPl7A6A67qUevfu7HPEY0VriIWoaxl7K3sS+2R42uWPWQt1hswG70E48XarUuR2EA2nqXdYbPEyJszEkTgBtiuiZIsNKnPFvrIloQv3Lq39K3YYTh+mPKv3YuuM7/sNth0FQH+sW9hfODa3ezoa8FSygcTQc5mXuL9CI7CgolFtyjXHG5+002SMZgnJ/AQgdKPPYH6BUcXX4rMpg44UAy1ZzPDiF4xbG4Z3tZqAEhml8QOmHJwE90JFqOoR/NogKpWPz1s66O7rOh3INnfKFDXE1mcvKw4fb0VvUrIjjURPmpO5d4UjNIRnZuARB9+PLo48PijHcgF8zaAmOWQzUCE7IvgoVhmcnq9kHMOZJoVRDvxeAAUrfUQfeAJ0LHR8fuGb0aHugtvqkLgBnJHqjH/bat/EJW2oRFyr9Zafu3BvC9LkbkdClnIVaeNiCuPA34bVdnEoO/9Ik4/HLyD9cbRzll4XWWN2XQutvORhMSchuiVeVQ==",
            "1; DM5PR07MB3467;\n\t6:R8Wb3bW69PTbkVTk5k20A4IuqCYzqs0H6rmv6WJVM39YUyFeYrnoulC4YrX+sYkDm88QDasb2vz6z4O+TrIir2XC8AIjfCqRblATIta6c/XdMbsXwhFhDkW64vmpa8DRm+jpXwktso9eSybDeD8D0lnz1ORa7PR0EjeMpvnpjK5Q9e3n7vyd0BpJ4fZRqXzlPrztPoc9hwFHtmERDHQKKqa+aKcscD80E+K0LA1/0oWPLmH/U6BCwkdTc3P+wC+QCcGHpdg/SsfFCrlOg9gjb0ZRefL24UPsc1oPa2kvWYyws6LACEWax2GM0BBzg3k6/SgC50AUSLZMgy3Fk07Y/g==;\n\t5:v8QxhFmS3tzwdVgA/vtvw05sw1M3TnmHwv/UlUmkJLsmicSYBllsX8BKX+bQsV37zEBCJUX0gvaBsPUNpw6rD94bKGZCYMwyEfVWxWcpxIml+WmDB+zjBcN2XIWcH6m8CO1RCiD+MC/KlmqjmntTsw==;\n\t24:j5lqvxRlQBSMFiDuhYfA2Fb7u8gwcQ5TvDvwsxBMFZ/HRXACttvofIlMpcnKqsRMlg2LlrQiVKczcp7wFeoC73MbKsN52hMZkiVaTmxcnzQ=;\n\t7:ZXktGshz6zqokXzKzEOpb6hwrmhTu8h2u+2Z3I8BvT/J72XscFWvBLbcWJHbyWcr6AU4vFyV5fRxSzJgrHzFNsar3EU7254k2VwxXqSCmcNyfTDufdd3Hz+T9yO9F91xX3lfpOEuRoWgid8ezPLk3sNEkYUUCUhqzMmqwltBSJvvznfNYOKWsGa7+f+c1tEHy1N1XemIP5I18GOe5SUTGLa0c8lK8vlIUNOyt5xK1rs="
        ],
        "X-MS-TrafficTypeDiagnostic": "DM5PR07MB3467:",
        "X-Exchange-Antispam-Report-Test": "UriScan:(278428928389397);",
        "X-Microsoft-Antispam-PRVS": "<DM5PR07MB34675F5E7363687D233D9C12809F0@DM5PR07MB3467.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(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);\n\tSRVR:DM5PR07MB3467; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:DM5PR07MB3467; ",
        "X-Forefront-PRVS": "0414DF926F",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(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);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR07MB3467; H:localhost.localdomain;\n\tFPR:; \n\tSPF:None; PTR:InfoNoRecords; MX:1; A: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": "29 Aug 2017 18:47:10.9514\n\t(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 <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": "Currently, 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          | 120 +++++++++++++++++++++---\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, 222 insertions(+), 28 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 00d5f60..f7f1013 100644\n--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map\n@@ -242,6 +242,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.11;\ndiff --git a/lib/librte_eal/common/include/rte_reciprocal.h b/lib/librte_eal/common/include/rte_reciprocal.h\nindex b6d752f..fccbc09 100644\n--- a/lib/librte_eal/common/include/rte_reciprocal.h\n+++ b/lib/librte_eal/common/include/rte_reciprocal.h\n@@ -19,25 +19,120 @@\n  * to calculate the division A/B.\n  */\n \n+/*\n+ * libdivide\n+ * Copyright (C) 2010 ridiculous_fish\n+ * This software is provided 'as-is', without any express or implied\n+ * warranty.  In no event will the authors be held liable for any damages\n+ * arising from the use of this software.\n+ * Permission is granted to anyone to use this software for any purpose,\n+ * including commercial applications, and to alter it and redistribute it\n+ * freely, subject to the following restrictions:\n+ *\n+ * 1. The origin of this software must not be misrepresented; you must not\n+ *    claim that you wrote the original software. If you use this software\n+ *    in a product, an acknowledgment in the product documentation would be\n+ *    appreciated but is not required.\n+ *\n+ * 2. Altered source versions must be plainly marked as such, and must not be\n+ *    misrepresented as being the original software.\n+ *\n+ * 3. This notice may not be removed or altered from any source distribution.\n+ *\n+ * libdivide@ridiculousfish.com\n+ *\n+ */\n+\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 = (uint32_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-\tuint32_t t = (uint32_t)(((uint64_t)a * R.m) >> 32);\n+\t__uint128_t xl = x;\n+\t__uint128_t yl = y;\n+\t__uint128_t rl = xl * yl;\n+\treturn (uint64_t)(rl >> 64);\n+}\n \n-\treturn (t + ((a - t) >> R.sh1)) >> R.sh2;\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+\tuint64_t q = mullhi_u64(R->m, a);\n+\tuint64_t t = ((a - q) >> 1) + q;\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..5d7e367 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,21 +49,120 @@ 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 \t++m;\n \tR.m = m;\n-\tR.sh1 = RTE_MIN(l, 1);\n-\tR.sh2 = RTE_MAX(l - 1, 0);\n+\tR.sh1 = l > 1 ? 1 : l;\n+\tR.sh2 = (l - 1 > 0) ? l - 1 : 0;\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 ac68fb3..e64840c 100644\n--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map\n@@ -247,6 +247,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.11;\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",
        "2/2"
    ]
}