get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 40989,
    "url": "http://patchwork.dpdk.org/api/patches/40989/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/35f3ada5026b8619499ddd3a8b41b2d1066c3e31.1528749451.git.anatoly.burakov@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<35f3ada5026b8619499ddd3a8b41b2d1066c3e31.1528749451.git.anatoly.burakov@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/35f3ada5026b8619499ddd3a8b41b2d1066c3e31.1528749451.git.anatoly.burakov@intel.com",
    "date": "2018-06-11T20:55:38",
    "name": "[5/9] fbarray: add reverse find_free/used",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "3e1a5a873b975f09273a68f8171eddff9a8b27a7",
    "submitter": {
        "id": 4,
        "url": "http://patchwork.dpdk.org/api/people/4/?format=api",
        "name": "Burakov, Anatoly",
        "email": "anatoly.burakov@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/35f3ada5026b8619499ddd3a8b41b2d1066c3e31.1528749451.git.anatoly.burakov@intel.com/mbox/",
    "series": [
        {
            "id": 85,
            "url": "http://patchwork.dpdk.org/api/series/85/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=85",
            "date": "2018-06-11T20:55:33",
            "name": "mem: reduce memory fragmentation",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/85/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/40989/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/40989/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 125351DE7F;\n\tMon, 11 Jun 2018 22:55:56 +0200 (CEST)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n\tby dpdk.org (Postfix) with ESMTP id 5E5B81D940\n\tfor <dev@dpdk.org>; Mon, 11 Jun 2018 22:55:46 +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:43 -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\tw5BKthP3026380 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 w5BKthaM021599\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 w5BKtheo021595\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=\"236556763\"",
        "From": "Anatoly Burakov <anatoly.burakov@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon, 11 Jun 2018 21:55:38 +0100",
        "Message-Id": "<35f3ada5026b8619499ddd3a8b41b2d1066c3e31.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 5/9] fbarray: add reverse find_free/used",
        "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 function to look up used/free indexes starting from specified\nindex, but going backwards instead of forward. Semantics are kept\nsimilar to the existing function, except for the fact that, given\nthe same input, the results returned will be in reverse order.\n\nSigned-off-by: Anatoly Burakov <anatoly.burakov@intel.com>\n---\n lib/librte_eal/common/eal_common_fbarray.c  | 78 +++++++++++++++++++--\n lib/librte_eal/common/include/rte_fbarray.h | 34 +++++++++\n lib/librte_eal/rte_eal_version.map          |  2 +\n 3 files changed, 109 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/common/eal_common_fbarray.c b/lib/librte_eal/common/eal_common_fbarray.c\nindex 22370398f..d5d72e37b 100644\n--- a/lib/librte_eal/common/eal_common_fbarray.c\n+++ b/lib/librte_eal/common/eal_common_fbarray.c\n@@ -352,6 +352,60 @@ find_contig(const struct rte_fbarray *arr, unsigned int start, bool used)\n \treturn result;\n }\n \n+static int\n+find_prev(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+\tuint64_t ignore_msk;\n+\n+\t/*\n+\t * mask only has granularity of MASK_ALIGN, but start may not be aligned\n+\t * on that boundary, so construct a special mask to exclude anything we\n+\t * don't want to see to avoid confusing clz.\n+\t */\n+\tfirst = MASK_LEN_TO_IDX(start);\n+\tfirst_mod = MASK_LEN_TO_MOD(start);\n+\t/* we're going backwards, so mask must start from the top */\n+\tignore_msk = first_mod == MASK_ALIGN - 1 ?\n+\t\t\t\t-1ULL : /* prevent overflow */\n+\t\t\t\t~(-1ULL << (first_mod + 1));\n+\n+\t/* go backwards, include zero */\n+\tidx = first;\n+\tdo {\n+\t\tuint64_t cur = msk->data[idx];\n+\t\tint found;\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 before start on first iteration */\n+\t\tif (idx == first)\n+\t\t\tcur &= ignore_msk;\n+\n+\t\t/* check if we have any entries */\n+\t\tif (cur == 0)\n+\t\t\tcontinue;\n+\n+\t\t/*\n+\t\t * find last set bit - that will correspond to whatever it is\n+\t\t * that we're looking for. we're counting trailing zeroes, thus\n+\t\t * the value we get is counted from end of mask, so calculate\n+\t\t * position from start of mask.\n+\t\t */\n+\t\tfound = MASK_ALIGN - __builtin_clzll(cur) - 1;\n+\n+\t\treturn MASK_GET_IDX(idx, found);\n+\t} while (idx-- != 0); /* decrement after check  to include zero*/\n+\n+\t/* we didn't find anything */\n+\trte_errno = used ? ENOENT : ENOSPC;\n+\treturn -1;\n+}\n+\n static int\n set_used(struct rte_fbarray *arr, unsigned int idx, bool used)\n {\n@@ -676,7 +730,7 @@ rte_fbarray_is_used(struct rte_fbarray *arr, unsigned int idx)\n }\n \n static int\n-fbarray_find(struct rte_fbarray *arr, unsigned int start, bool used)\n+fbarray_find(struct rte_fbarray *arr, unsigned int start, bool next, bool used)\n {\n \tint ret = -1;\n \n@@ -708,8 +762,10 @@ fbarray_find(struct rte_fbarray *arr, unsigned int start, bool used)\n \t\t\tgoto out;\n \t\t}\n \t}\n-\n-\tret = find_next(arr, start, used);\n+\tif (next)\n+\t\tret = find_next(arr, start, used);\n+\telse\n+\t\tret = find_prev(arr, start, used);\n out:\n \trte_rwlock_read_unlock(&arr->rwlock);\n \treturn ret;\n@@ -718,13 +774,25 @@ fbarray_find(struct rte_fbarray *arr, unsigned int start, bool used)\n int __rte_experimental\n rte_fbarray_find_next_free(struct rte_fbarray *arr, unsigned int start)\n {\n-\treturn fbarray_find(arr, start, false);\n+\treturn fbarray_find(arr, start, true, false);\n }\n \n int __rte_experimental\n rte_fbarray_find_next_used(struct rte_fbarray *arr, unsigned int start)\n {\n-\treturn fbarray_find(arr, start, true);\n+\treturn fbarray_find(arr, start, true, true);\n+}\n+\n+int __rte_experimental\n+rte_fbarray_find_prev_free(struct rte_fbarray *arr, unsigned int start)\n+{\n+\treturn fbarray_find(arr, start, false, false);\n+}\n+\n+int __rte_experimental\n+rte_fbarray_find_prev_used(struct rte_fbarray *arr, unsigned int start)\n+{\n+\treturn fbarray_find(arr, start, false, true);\n }\n \n static int\ndiff --git a/lib/librte_eal/common/include/rte_fbarray.h b/lib/librte_eal/common/include/rte_fbarray.h\nindex 3e61fffee..54abe938a 100644\n--- a/lib/librte_eal/common/include/rte_fbarray.h\n+++ b/lib/librte_eal/common/include/rte_fbarray.h\n@@ -336,6 +336,40 @@ rte_fbarray_find_contig_free(struct rte_fbarray *arr,\n int __rte_experimental\n rte_fbarray_find_contig_used(struct rte_fbarray *arr, unsigned int start);\n \n+/**\n+ * Find index of previous free element, starting at specified index.\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_prev_free(struct rte_fbarray *arr, unsigned int start);\n+\n+\n+/**\n+ * Find index of previous used element, starting at specified index.\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_prev_used(struct rte_fbarray *arr, unsigned int start);\n+\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 f7dd0e7bc..79b87f504 100644\n--- a/lib/librte_eal/rte_eal_version.map\n+++ b/lib/librte_eal/rte_eal_version.map\n@@ -269,6 +269,8 @@ EXPERIMENTAL {\n \trte_fbarray_find_next_used;\n \trte_fbarray_find_next_n_free;\n \trte_fbarray_find_next_n_used;\n+\trte_fbarray_find_prev_free;\n+\trte_fbarray_find_prev_used;\n \trte_fbarray_find_contig_free;\n \trte_fbarray_find_contig_used;\n \trte_fbarray_get;\n",
    "prefixes": [
        "5/9"
    ]
}