get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 45796,
    "url": "http://patches.dpdk.org/api/patches/45796/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1538418902-154892-2-git-send-email-yipeng1.wang@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": "<1538418902-154892-2-git-send-email-yipeng1.wang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1538418902-154892-2-git-send-email-yipeng1.wang@intel.com",
    "date": "2018-10-01T18:34:59",
    "name": "[v5,1/4] hash: fix race condition in iterate",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "eef45940a0adbc5b894f65651bcf472de4d35432",
    "submitter": {
        "id": 754,
        "url": "http://patches.dpdk.org/api/people/754/?format=api",
        "name": "Wang, Yipeng1",
        "email": "yipeng1.wang@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/1538418902-154892-2-git-send-email-yipeng1.wang@intel.com/mbox/",
    "series": [
        {
            "id": 1624,
            "url": "http://patches.dpdk.org/api/series/1624/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1624",
            "date": "2018-10-01T18:34:58",
            "name": "hash: add extendable bucket and partial key hashing",
            "version": 5,
            "mbox": "http://patches.dpdk.org/series/1624/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/45796/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/45796/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 678015A6A;\n\tTue,  2 Oct 2018 03:40:19 +0200 (CEST)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby dpdk.org (Postfix) with ESMTP id 808904F90\n\tfor <dev@dpdk.org>; Tue,  2 Oct 2018 03:40:15 +0200 (CEST)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n\tby orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t01 Oct 2018 18:40:13 -0700",
            "from skx-yipeng.jf.intel.com ([10.54.81.175])\n\tby fmsmga002.fm.intel.com with ESMTP; 01 Oct 2018 18:40:13 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.54,329,1534834800\"; d=\"scan'208\";a=\"91287629\"",
        "From": "Yipeng Wang <yipeng1.wang@intel.com>",
        "To": "bruce.richardson@intel.com",
        "Cc": "konstantin.ananyev@intel.com, dev@dpdk.org, yipeng1.wang@intel.com,\n\thonnappa.nagarahalli@arm.com, sameh.gobriel@intel.com",
        "Date": "Mon,  1 Oct 2018 11:34:59 -0700",
        "Message-Id": "<1538418902-154892-2-git-send-email-yipeng1.wang@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1538418902-154892-1-git-send-email-yipeng1.wang@intel.com>",
        "References": "<1537993618-92630-1-git-send-email-yipeng1.wang@intel.com>\n\t<1538418902-154892-1-git-send-email-yipeng1.wang@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v5 1/4] hash: fix race condition in iterate",
        "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://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "In rte_hash_iterate, the reader lock did not protect the\nwhile loop which checks empty entry. This created a race\ncondition that the entry may become empty when enters\nthe lock, then a wrong key data value would be read out.\n\nThis commit reads out the position in the while condition,\nwhich makes sure that the position will not be changed\nto empty before entering the lock.\n\nFixes: f2e3001b53ec (\"hash: support read/write concurrency\")\nCc: stable@dpdk.org\n\nSigned-off-by: Yipeng Wang <yipeng1.wang@intel.com>\nReported-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>\n---\n lib/librte_hash/rte_cuckoo_hash.c | 5 ++---\n 1 file changed, 2 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c\nindex f7b86c8..da8ddf4 100644\n--- a/lib/librte_hash/rte_cuckoo_hash.c\n+++ b/lib/librte_hash/rte_cuckoo_hash.c\n@@ -1318,7 +1318,7 @@ rte_hash_iterate(const struct rte_hash *h, const void **key, void **data, uint32\n \tidx = *next % RTE_HASH_BUCKET_ENTRIES;\n \n \t/* If current position is empty, go to the next one */\n-\twhile (h->buckets[bucket_idx].key_idx[idx] == EMPTY_SLOT) {\n+\twhile ((position = h->buckets[bucket_idx].key_idx[idx]) == EMPTY_SLOT) {\n \t\t(*next)++;\n \t\t/* End of table */\n \t\tif (*next == total_entries)\n@@ -1326,9 +1326,8 @@ rte_hash_iterate(const struct rte_hash *h, const void **key, void **data, uint32\n \t\tbucket_idx = *next / RTE_HASH_BUCKET_ENTRIES;\n \t\tidx = *next % RTE_HASH_BUCKET_ENTRIES;\n \t}\n+\n \t__hash_rw_reader_lock(h);\n-\t/* Get position of entry in key table */\n-\tposition = h->buckets[bucket_idx].key_idx[idx];\n \tnext_key = (struct rte_hash_key *) ((char *)h->key_store +\n \t\t\t\tposition * h->key_entry_size);\n \t/* Return key and data */\n",
    "prefixes": [
        "v5",
        "1/4"
    ]
}