get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 806399,
    "url": "http://patchwork.ozlabs.org/api/patches/806399/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1503902477-39829-2-git-send-email-chrism@mellanox.com/",
    "project": {
        "id": 7,
        "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api",
        "name": "Linux network development",
        "link_name": "netdev",
        "list_id": "netdev.vger.kernel.org",
        "list_email": "netdev@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1503902477-39829-2-git-send-email-chrism@mellanox.com>",
    "list_archive_url": null,
    "date": "2017-08-28T06:41:15",
    "name": "[net-next,1/3] idr: Add new APIs to support unsigned long",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "a6c8237fc6d2e655f60fe40b2466c8604f884e97",
    "submitter": {
        "id": 72170,
        "url": "http://patchwork.ozlabs.org/api/people/72170/?format=api",
        "name": "Chris Mi",
        "email": "chrism@mellanox.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/users/34/?format=api",
        "username": "davem",
        "first_name": "David",
        "last_name": "Miller",
        "email": "davem@davemloft.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1503902477-39829-2-git-send-email-chrism@mellanox.com/mbox/",
    "series": [
        {
            "id": 87,
            "url": "http://patchwork.ozlabs.org/api/series/87/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=87",
            "date": "2017-08-28T06:41:15",
            "name": "net/sched: Improve getting objects by indexes",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/87/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/806399/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/806399/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<netdev-owner@vger.kernel.org>",
        "X-Original-To": "patchwork-incoming@ozlabs.org",
        "Delivered-To": "patchwork-incoming@ozlabs.org",
        "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xghxz1LB4z9sP3\n\tfor <patchwork-incoming@ozlabs.org>;\n\tMon, 28 Aug 2017 16:41:43 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751231AbdH1Glm (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 28 Aug 2017 02:41:42 -0400",
            "from mail-il-dmz.mellanox.com ([193.47.165.129]:48360 \"EHLO\n\tmellanox.co.il\" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org\n\twith ESMTP id S1750767AbdH1Glk (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Mon, 28 Aug 2017 02:41:40 -0400",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n\tchrism@mellanox.com)\n\twith ESMTPS (AES256-SHA encrypted); 28 Aug 2017 09:41:35 +0300",
            "from bjglab-18.mtbc.labs.mlnx (bjglab-18.mtbc.labs.mlnx\n\t[10.200.0.168])\n\tby labmailer.mlnx (8.13.8/8.13.8) with ESMTP id v7S6fPZn022940;\n\tMon, 28 Aug 2017 09:41:33 +0300"
        ],
        "From": "Chris Mi <chrism@mellanox.com>",
        "To": "netdev@vger.kernel.org",
        "Cc": "jhs@mojatatu.com, xiyou.wangcong@gmail.com, jiri@resnulli.us,\n\tdavem@davemloft.net, mawilcox@microsoft.com",
        "Subject": "[patch net-next 1/3] idr: Add new APIs to support unsigned long",
        "Date": "Mon, 28 Aug 2017 02:41:15 -0400",
        "Message-Id": "<1503902477-39829-2-git-send-email-chrism@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1503902477-39829-1-git-send-email-chrism@mellanox.com>",
        "References": "<1503902477-39829-1-git-send-email-chrism@mellanox.com>",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "The following new APIs are added:\n\nint idr_alloc_ext(struct idr *idr, void *ptr, unsigned long *index,\n                  unsigned long start, unsigned long end, gfp_t gfp);\nstatic inline void *idr_remove_ext(struct idr *idr, unsigned long id);\nstatic inline void *idr_find_ext(const struct idr *idr, unsigned long id);\nvoid *idr_replace_ext(struct idr *idr, void *ptr, unsigned long id);\nvoid *idr_get_next_ext(struct idr *idr, unsigned long *nextid);\n\nSigned-off-by: Chris Mi <chrism@mellanox.com>\nSigned-off-by: Jiri Pirko <jiri@mellanox.com>\n---\n include/linux/idr.h        | 16 ++++++++++\n include/linux/radix-tree.h |  3 ++\n lib/idr.c                  | 56 +++++++++++++++++++++++++++++++++++\n lib/radix-tree.c           | 73 ++++++++++++++++++++++++++++++++++++++++++++++\n 4 files changed, 148 insertions(+)",
    "diff": "diff --git a/include/linux/idr.h b/include/linux/idr.h\nindex bf70b3e..e0a030b 100644\n--- a/include/linux/idr.h\n+++ b/include/linux/idr.h\n@@ -81,11 +81,15 @@ static inline void idr_set_cursor(struct idr *idr, unsigned int val)\n \n void idr_preload(gfp_t gfp_mask);\n int idr_alloc(struct idr *, void *entry, int start, int end, gfp_t);\n+int idr_alloc_ext(struct idr *idr, void *ptr, unsigned long *index,\n+\t\t  unsigned long start, unsigned long end, gfp_t gfp);\n int idr_alloc_cyclic(struct idr *, void *entry, int start, int end, gfp_t);\n int idr_for_each(const struct idr *,\n \t\t int (*fn)(int id, void *p, void *data), void *data);\n void *idr_get_next(struct idr *, int *nextid);\n+void *idr_get_next_ext(struct idr *idr, unsigned long *nextid);\n void *idr_replace(struct idr *, void *, int id);\n+void *idr_replace_ext(struct idr *idr, void *ptr, unsigned long id);\n void idr_destroy(struct idr *);\n \n static inline void *idr_remove(struct idr *idr, int id)\n@@ -93,6 +97,11 @@ static inline void *idr_remove(struct idr *idr, int id)\n \treturn radix_tree_delete_item(&idr->idr_rt, id, NULL);\n }\n \n+static inline void *idr_remove_ext(struct idr *idr, unsigned long id)\n+{\n+\treturn radix_tree_delete_item(&idr->idr_rt, id, NULL);\n+}\n+\n static inline void idr_init(struct idr *idr)\n {\n \tINIT_RADIX_TREE(&idr->idr_rt, IDR_RT_MARKER);\n@@ -133,6 +142,11 @@ static inline void *idr_find(const struct idr *idr, int id)\n \treturn radix_tree_lookup(&idr->idr_rt, id);\n }\n \n+static inline void *idr_find_ext(const struct idr *idr, unsigned long id)\n+{\n+\treturn radix_tree_lookup(&idr->idr_rt, id);\n+}\n+\n /**\n  * idr_for_each_entry - iterate over an idr's elements of a given type\n  * @idr:     idr handle\n@@ -145,6 +159,8 @@ static inline void *idr_find(const struct idr *idr, int id)\n  */\n #define idr_for_each_entry(idr, entry, id)\t\t\t\\\n \tfor (id = 0; ((entry) = idr_get_next(idr, &(id))) != NULL; ++id)\n+#define idr_for_each_entry_ext(idr, entry, id)\t\t\t\\\n+\tfor (id = 0; ((entry) = idr_get_next_ext(idr, &(id))) != NULL; ++id)\n \n /**\n  * idr_for_each_entry_continue - continue iteration over an idr's elements of a given type\ndiff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h\nindex 3e57350..947299e 100644\n--- a/include/linux/radix-tree.h\n+++ b/include/linux/radix-tree.h\n@@ -359,6 +359,9 @@ int radix_tree_join(struct radix_tree_root *, unsigned long index,\n \t\t\tunsigned new_order, void *);\n void __rcu **idr_get_free(struct radix_tree_root *, struct radix_tree_iter *,\n \t\t\tgfp_t, int end);\n+void __rcu **idr_get_free_ext(struct radix_tree_root *root,\n+\t\t\t      struct radix_tree_iter *iter,\n+\t\t\t      gfp_t gfp, unsigned long end);\n \n enum {\n \tRADIX_TREE_ITER_TAG_MASK = 0x0f,\t/* tag index in lower nybble */\ndiff --git a/lib/idr.c b/lib/idr.c\nindex b13682b..2a091b9 100644\n--- a/lib/idr.c\n+++ b/lib/idr.c\n@@ -47,6 +47,29 @@ int idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp)\n }\n EXPORT_SYMBOL_GPL(idr_alloc);\n \n+int idr_alloc_ext(struct idr *idr, void *ptr, unsigned long *index,\n+\t\t  unsigned long start, unsigned long end, gfp_t gfp)\n+{\n+\tvoid __rcu **slot;\n+\tstruct radix_tree_iter iter;\n+\n+\tif (WARN_ON_ONCE(radix_tree_is_internal_node(ptr)))\n+\t\treturn -EINVAL;\n+\n+\tradix_tree_iter_init(&iter, start);\n+\tslot = idr_get_free_ext(&idr->idr_rt, &iter, gfp, end);\n+\tif (IS_ERR(slot))\n+\t\treturn PTR_ERR(slot);\n+\n+\tradix_tree_iter_replace(&idr->idr_rt, &iter, slot, ptr);\n+\tradix_tree_iter_tag_clear(&idr->idr_rt, &iter, IDR_FREE);\n+\n+\tif (index)\n+\t\t*index = iter.index;\n+\treturn 0;\n+}\n+EXPORT_SYMBOL_GPL(idr_alloc_ext);\n+\n /**\n  * idr_alloc_cyclic - allocate new idr entry in a cyclical fashion\n  * @idr: idr handle\n@@ -134,6 +157,20 @@ void *idr_get_next(struct idr *idr, int *nextid)\n }\n EXPORT_SYMBOL(idr_get_next);\n \n+void *idr_get_next_ext(struct idr *idr, unsigned long *nextid)\n+{\n+\tstruct radix_tree_iter iter;\n+\tvoid __rcu **slot;\n+\n+\tslot = radix_tree_iter_find(&idr->idr_rt, &iter, *nextid);\n+\tif (!slot)\n+\t\treturn NULL;\n+\n+\t*nextid = iter.index;\n+\treturn rcu_dereference_raw(*slot);\n+}\n+EXPORT_SYMBOL(idr_get_next_ext);\n+\n /**\n  * idr_replace - replace pointer for given id\n  * @idr: idr handle\n@@ -169,6 +206,25 @@ void *idr_replace(struct idr *idr, void *ptr, int id)\n }\n EXPORT_SYMBOL(idr_replace);\n \n+void *idr_replace_ext(struct idr *idr, void *ptr, unsigned long id)\n+{\n+\tstruct radix_tree_node *node;\n+\tvoid __rcu **slot = NULL;\n+\tvoid *entry;\n+\n+\tif (WARN_ON_ONCE(radix_tree_is_internal_node(ptr)))\n+\t\treturn ERR_PTR(-EINVAL);\n+\n+\tentry = __radix_tree_lookup(&idr->idr_rt, id, &node, &slot);\n+\tif (!slot || radix_tree_tag_get(&idr->idr_rt, id, IDR_FREE))\n+\t\treturn ERR_PTR(-ENOENT);\n+\n+\t__radix_tree_replace(&idr->idr_rt, node, slot, ptr, NULL, NULL);\n+\n+\treturn entry;\n+}\n+EXPORT_SYMBOL(idr_replace_ext);\n+\n /**\n  * DOC: IDA description\n  *\ndiff --git a/lib/radix-tree.c b/lib/radix-tree.c\nindex 898e879..06bfdbd 100644\n--- a/lib/radix-tree.c\n+++ b/lib/radix-tree.c\n@@ -2208,6 +2208,79 @@ void __rcu **idr_get_free(struct radix_tree_root *root,\n \treturn slot;\n }\n \n+void __rcu **idr_get_free_ext(struct radix_tree_root *root,\n+\t\t\t      struct radix_tree_iter *iter,\n+\t\t\t      gfp_t gfp, unsigned long end)\n+{\n+\tstruct radix_tree_node *node = NULL, *child;\n+\tvoid __rcu **slot = (void __rcu **)&root->rnode;\n+\tunsigned long maxindex, start = iter->next_index;\n+\tunsigned long max = end - 1;\n+\tunsigned int shift, offset = 0;\n+\n+ grow:\n+\tshift = radix_tree_load_root(root, &child, &maxindex);\n+\tif (!radix_tree_tagged(root, IDR_FREE))\n+\t\tstart = max(start, maxindex + 1);\n+\tif (start > max)\n+\t\treturn ERR_PTR(-ENOSPC);\n+\n+\tif (start > maxindex) {\n+\t\tint error = radix_tree_extend(root, gfp, start, shift);\n+\n+\t\tif (error < 0)\n+\t\t\treturn ERR_PTR(error);\n+\t\tshift = error;\n+\t\tchild = rcu_dereference_raw(root->rnode);\n+\t}\n+\n+\twhile (shift) {\n+\t\tshift -= RADIX_TREE_MAP_SHIFT;\n+\t\tif (child == NULL) {\n+\t\t\t/* Have to add a child node.  */\n+\t\t\tchild = radix_tree_node_alloc(gfp, node, root, shift,\n+\t\t\t\t\t\t      offset, 0, 0);\n+\t\t\tif (!child)\n+\t\t\t\treturn ERR_PTR(-ENOMEM);\n+\t\t\tall_tag_set(child, IDR_FREE);\n+\t\t\trcu_assign_pointer(*slot, node_to_entry(child));\n+\t\t\tif (node)\n+\t\t\t\tnode->count++;\n+\t\t} else if (!radix_tree_is_internal_node(child))\n+\t\t\tbreak;\n+\n+\t\tnode = entry_to_node(child);\n+\t\toffset = radix_tree_descend(node, &child, start);\n+\t\tif (!tag_get(node, IDR_FREE, offset)) {\n+\t\t\toffset = radix_tree_find_next_bit(node, IDR_FREE,\n+\t\t\t\t\t\t\t  offset + 1);\n+\t\t\tstart = next_index(start, node, offset);\n+\t\t\tif (start > max)\n+\t\t\t\treturn ERR_PTR(-ENOSPC);\n+\t\t\twhile (offset == RADIX_TREE_MAP_SIZE) {\n+\t\t\t\toffset = node->offset + 1;\n+\t\t\t\tnode = node->parent;\n+\t\t\t\tif (!node)\n+\t\t\t\t\tgoto grow;\n+\t\t\t\tshift = node->shift;\n+\t\t\t}\n+\t\t\tchild = rcu_dereference_raw(node->slots[offset]);\n+\t\t}\n+\t\tslot = &node->slots[offset];\n+\t}\n+\n+\titer->index = start;\n+\tif (node)\n+\t\titer->next_index = 1 + min(max, (start | node_maxindex(node)));\n+\telse\n+\t\titer->next_index = 1;\n+\titer->node = node;\n+\t__set_iter_shift(iter, shift);\n+\tset_iter_tags(iter, node, offset, IDR_FREE);\n+\n+\treturn slot;\n+}\n+\n /**\n  * idr_destroy - release all internal memory from an IDR\n  * @idr: idr handle\n",
    "prefixes": [
        "net-next",
        "1/3"
    ]
}