get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 40991,
    "url": "http://patches.dpdk.org/api/patches/40991/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/65767a81393fa034a9813559d657b7ba34bf5df2.1528749451.git.anatoly.burakov@intel.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<65767a81393fa034a9813559d657b7ba34bf5df2.1528749451.git.anatoly.burakov@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/65767a81393fa034a9813559d657b7ba34bf5df2.1528749451.git.anatoly.burakov@intel.com",
    "date": "2018-06-11T20:55:40",
    "name": "[7/9] fbarray: add reverse find contig used/free",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "b528382b3ebf85a7f884fc0505cddf050b829803",
    "submitter": {
        "id": 4,
        "url": "http://patches.dpdk.org/api/people/4/?format=api",
        "name": "Burakov, Anatoly",
        "email": "anatoly.burakov@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/65767a81393fa034a9813559d657b7ba34bf5df2.1528749451.git.anatoly.burakov@intel.com/mbox/",
    "series": [
        {
            "id": 85,
            "url": "http://patches.dpdk.org/api/series/85/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=85",
            "date": "2018-06-11T20:55:33",
            "name": "mem: reduce memory fragmentation",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/85/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/40991/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/40991/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 455061DE9C;\n\tMon, 11 Jun 2018 22:56:00 +0200 (CEST)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n\tby dpdk.org (Postfix) with ESMTP id ED5741DE46\n\tfor <dev@dpdk.org>; Mon, 11 Jun 2018 22:55:47 +0200 (CEST)",
            "from fmsmga006.fm.intel.com ([10.253.24.20])\n\tby fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t11 Jun 2018 13:55:44 -0700",
            "from irvmail001.ir.intel.com ([163.33.26.43])\n\tby fmsmga006.fm.intel.com with ESMTP; 11 Jun 2018 13:55:44 -0700",
            "from sivswdev01.ir.intel.com (sivswdev01.ir.intel.com\n\t[10.237.217.45])\n\tby irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id\n\tw5BKthND026386 for <dev@dpdk.org>; Mon, 11 Jun 2018 21:55:43 +0100",
            "from sivswdev01.ir.intel.com (localhost [127.0.0.1])\n\tby sivswdev01.ir.intel.com with ESMTP id w5BKthZo021617\n\tfor <dev@dpdk.org>; Mon, 11 Jun 2018 21:55:43 +0100",
            "(from aburakov@localhost)\n\tby sivswdev01.ir.intel.com with LOCAL id w5BKthMf021613\n\tfor dev@dpdk.org; Mon, 11 Jun 2018 21:55:43 +0100"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.51,211,1526367600\"; d=\"scan'208\";a=\"236556764\"",
        "From": "Anatoly Burakov <anatoly.burakov@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon, 11 Jun 2018 21:55:40 +0100",
        "Message-Id": "<65767a81393fa034a9813559d657b7ba34bf5df2.1528749451.git.anatoly.burakov@intel.com>",
        "X-Mailer": "git-send-email 1.7.0.7",
        "In-Reply-To": [
            "<cover.1528749451.git.anatoly.burakov@intel.com>",
            "<cover.1528749451.git.anatoly.burakov@intel.com>"
        ],
        "References": [
            "<cover.1528749451.git.anatoly.burakov@intel.com>",
            "<cover.1528749451.git.anatoly.burakov@intel.com>"
        ],
        "Subject": "[dpdk-dev] [PATCH 7/9] fbarray: add reverse find contig used/free",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://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": "<https://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": "Add a function to return starting point of current contiguous\nblock, going backwards. All semantics are kept the same as the\nexisting function, with the only difference being that given the\nsame input, results will be returned in reverse order.\n\nSigned-off-by: Anatoly Burakov <anatoly.burakov@intel.com>\n---\n lib/librte_eal/common/eal_common_fbarray.c  | 90 +++++++++++++++++++--\n lib/librte_eal/common/include/rte_fbarray.h | 36 +++++++++\n lib/librte_eal/rte_eal_version.map          |  2 +\n 3 files changed, 122 insertions(+), 6 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/common/eal_common_fbarray.c b/lib/librte_eal/common/eal_common_fbarray.c\nindex a2e01148b..977174c4f 100644\n--- a/lib/librte_eal/common/eal_common_fbarray.c\n+++ b/lib/librte_eal/common/eal_common_fbarray.c\n@@ -569,6 +569,60 @@ find_prev(const struct rte_fbarray *arr, unsigned int start, bool used)\n \treturn -1;\n }\n \n+static int\n+find_rev_contig(const struct rte_fbarray *arr, unsigned int start, bool used)\n+{\n+\tconst struct used_mask *msk = get_used_mask(arr->data, arr->elt_sz,\n+\t\t\tarr->len);\n+\tunsigned int idx, first, first_mod;\n+\tunsigned int need_len, result = 0;\n+\n+\tfirst = MASK_LEN_TO_IDX(start);\n+\tfirst_mod = MASK_LEN_TO_MOD(start);\n+\n+\t/* go backwards, include zero */\n+\tidx = first;\n+\tdo {\n+\t\tuint64_t cur = msk->data[idx];\n+\t\tunsigned int run_len;\n+\n+\t\tneed_len = MASK_ALIGN;\n+\n+\t\t/* if we're looking for free entries, invert mask */\n+\t\tif (!used)\n+\t\t\tcur = ~cur;\n+\n+\t\t/* ignore everything after start on first iteration */\n+\t\tif (idx == first) {\n+\t\t\tunsigned int end_len = MASK_ALIGN - first_mod - 1;\n+\t\t\tcur <<= end_len;\n+\t\t\t/* at the start, we don't need the full mask len */\n+\t\t\tneed_len -= end_len;\n+\t\t}\n+\n+\t\t/* we will be looking for zeroes, so invert the mask */\n+\t\tcur = ~cur;\n+\n+\t\t/* if mask is zero, we have a complete run */\n+\t\tif (cur == 0)\n+\t\t\tgoto endloop;\n+\n+\t\t/*\n+\t\t * see where run ends, starting from the end.\n+\t\t */\n+\t\trun_len = __builtin_clzll(cur);\n+\n+\t\t/* add however many zeroes we've had in the last run and quit */\n+\t\tif (run_len < need_len) {\n+\t\t\tresult += run_len;\n+\t\t\tbreak;\n+\t\t}\n+endloop:\n+\t\tresult += need_len;\n+\t} while (idx-- != 0); /* decrement after check to include zero */\n+\treturn result;\n+}\n+\n static int\n set_used(struct rte_fbarray *arr, unsigned int idx, bool used)\n {\n@@ -1039,7 +1093,8 @@ rte_fbarray_find_prev_n_used(struct rte_fbarray *arr, unsigned int start,\n }\n \n static int\n-fbarray_find_contig(struct rte_fbarray *arr, unsigned int start, bool used)\n+fbarray_find_contig(struct rte_fbarray *arr, unsigned int start, bool next,\n+\t\tbool used)\n {\n \tint ret = -1;\n \n@@ -1057,22 +1112,33 @@ fbarray_find_contig(struct rte_fbarray *arr, unsigned int start, bool used)\n \t\t\tret = 0;\n \t\t\tgoto out;\n \t\t}\n-\t\tif (arr->len == arr->count) {\n+\t\tif (next && arr->count == arr->len) {\n \t\t\tret = arr->len - start;\n \t\t\tgoto out;\n \t\t}\n+\t\tif (!next && arr->count == arr->len) {\n+\t\t\tret = start + 1;\n+\t\t\tgoto out;\n+\t\t}\n \t} else {\n \t\tif (arr->len == arr->count) {\n \t\t\tret = 0;\n \t\t\tgoto out;\n \t\t}\n-\t\tif (arr->count == 0) {\n+\t\tif (next && arr->count == 0) {\n \t\t\tret = arr->len - start;\n \t\t\tgoto out;\n \t\t}\n+\t\tif (!next && arr->count == 0) {\n+\t\t\tret = start + 1;\n+\t\t\tgoto out;\n+\t\t}\n \t}\n \n-\tret = find_contig(arr, start, false);\n+\tif (next)\n+\t\tret = find_contig(arr, start, used);\n+\telse\n+\t\tret = find_rev_contig(arr, start, used);\n out:\n \trte_rwlock_read_unlock(&arr->rwlock);\n \treturn ret;\n@@ -1081,13 +1147,25 @@ fbarray_find_contig(struct rte_fbarray *arr, unsigned int start, bool used)\n int __rte_experimental\n rte_fbarray_find_contig_free(struct rte_fbarray *arr, unsigned int start)\n {\n-\treturn fbarray_find_contig(arr, start, false);\n+\treturn fbarray_find_contig(arr, start, true, false);\n }\n \n int __rte_experimental\n rte_fbarray_find_contig_used(struct rte_fbarray *arr, unsigned int start)\n {\n-\treturn fbarray_find_contig(arr, start, true);\n+\treturn fbarray_find_contig(arr, start, true, true);\n+}\n+\n+int __rte_experimental\n+rte_fbarray_find_rev_contig_free(struct rte_fbarray *arr, unsigned int start)\n+{\n+\treturn fbarray_find_contig(arr, start, false, false);\n+}\n+\n+int __rte_experimental\n+rte_fbarray_find_rev_contig_used(struct rte_fbarray *arr, unsigned int start)\n+{\n+\treturn fbarray_find_contig(arr, start, false, true);\n }\n \n int __rte_experimental\ndiff --git a/lib/librte_eal/common/include/rte_fbarray.h b/lib/librte_eal/common/include/rte_fbarray.h\nindex 980b4969f..5d8805515 100644\n--- a/lib/librte_eal/common/include/rte_fbarray.h\n+++ b/lib/librte_eal/common/include/rte_fbarray.h\n@@ -414,6 +414,42 @@ rte_fbarray_find_prev_n_used(struct rte_fbarray *arr, unsigned int start,\n \t\tunsigned int n);\n \n \n+/**\n+ * Find how many more free entries there are before specified index (like\n+ * ``rte_fbarray_find_contig_free`` but going in reverse).\n+ *\n+ * @param arr\n+ *   Valid pointer to allocated and correctly set up ``rte_fbarray`` structure.\n+ *\n+ * @param start\n+ *   Element index to start search from.\n+ *\n+ * @return\n+ *  - non-negative integer on success.\n+ *  - -1 on failure, with ``rte_errno`` indicating reason for failure.\n+ */\n+int __rte_experimental\n+rte_fbarray_find_rev_contig_free(struct rte_fbarray *arr,\n+\t\tunsigned int start);\n+\n+\n+/**\n+ * Find how many more used entries there are before specified index (like\n+ * ``rte_fbarray_find_contig_used`` but going in reverse).\n+ *\n+ * @param arr\n+ *   Valid pointer to allocated and correctly set up ``rte_fbarray`` structure.\n+ *\n+ * @param start\n+ *   Element index to start search from.\n+ *\n+ * @return\n+ *  - non-negative integer on success.\n+ *  - -1 on failure, with ``rte_errno`` indicating reason for failure.\n+ */\n+int __rte_experimental\n+rte_fbarray_find_rev_contig_used(struct rte_fbarray *arr, unsigned int start);\n+\n \n /**\n  * Dump ``rte_fbarray`` metadata.\ndiff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map\nindex 3a1b93e12..6936ba308 100644\n--- a/lib/librte_eal/rte_eal_version.map\n+++ b/lib/librte_eal/rte_eal_version.map\n@@ -275,6 +275,8 @@ EXPERIMENTAL {\n \trte_fbarray_find_prev_n_used;\n \trte_fbarray_find_contig_free;\n \trte_fbarray_find_contig_used;\n+\trte_fbarray_find_rev_contig_free;\n+\trte_fbarray_find_rev_contig_used;\n \trte_fbarray_get;\n \trte_fbarray_init;\n \trte_fbarray_is_used;\n",
    "prefixes": [
        "7/9"
    ]
}