get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 833477,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/833477/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20171102184112.32584-2-fw@strlen.de/",
    "project": {
        "id": 26,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/26/?format=api",
        "name": "Netfilter Development",
        "link_name": "netfilter-devel",
        "list_id": "netfilter-devel.vger.kernel.org",
        "list_email": "netfilter-devel@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20171102184112.32584-2-fw@strlen.de>",
    "list_archive_url": null,
    "date": "2017-11-02T18:41:09",
    "name": "[nf-next,1/4] netfilter: conntrack: don't cache nlattr_tuple_size result in nla_size",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "6f85f6c784fa4d0349d5ecaa5856a8f40eb5e672",
    "submitter": {
        "id": 1025,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/1025/?format=api",
        "name": "Florian Westphal",
        "email": "fw@strlen.de"
    },
    "delegate": {
        "id": 6139,
        "url": "http://patchwork.ozlabs.org/api/1.2/users/6139/?format=api",
        "username": "pablo",
        "first_name": "Pablo",
        "last_name": "Neira",
        "email": "pablo@netfilter.org"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20171102184112.32584-2-fw@strlen.de/mbox/",
    "series": [
        {
            "id": 11563,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/11563/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/list/?series=11563",
            "date": "2017-11-02T18:41:09",
            "name": "[nf-next,1/4] netfilter: conntrack: don't cache nlattr_tuple_size result in nla_size",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/11563/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/833477/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/833477/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<netfilter-devel-owner@vger.kernel.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.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=netfilter-devel-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 3ySYnR70clz9sP1\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri,  3 Nov 2017 05:40:59 +1100 (AEDT)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S933854AbdKBSk7 (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tThu, 2 Nov 2017 14:40:59 -0400",
            "from Chamillionaire.breakpoint.cc ([146.0.238.67]:60414 \"EHLO\n\tChamillionaire.breakpoint.cc\" rhost-flags-OK-OK-OK-OK)\n\tby vger.kernel.org with ESMTP id S933748AbdKBSk6 (ORCPT\n\t<rfc822;netfilter-devel@vger.kernel.org>);\n\tThu, 2 Nov 2017 14:40:58 -0400",
            "from fw by Chamillionaire.breakpoint.cc with local (Exim 4.84_2)\n\t(envelope-from <fw@breakpoint.cc>)\n\tid 1eAKPm-0000GV-Kp; Thu, 02 Nov 2017 19:40:30 +0100"
        ],
        "From": "Florian Westphal <fw@strlen.de>",
        "To": "<netfilter-devel@vger.kernel.org>",
        "Cc": "Florian Westphal <fw@strlen.de>",
        "Subject": "[PATCH nf-next 1/4] netfilter: conntrack: don't cache\n\tnlattr_tuple_size result in nla_size",
        "Date": "Thu,  2 Nov 2017 19:41:09 +0100",
        "Message-Id": "<20171102184112.32584-2-fw@strlen.de>",
        "X-Mailer": "git-send-email 2.13.6",
        "In-Reply-To": "<20171102184112.32584-1-fw@strlen.de>",
        "References": "<20171102184112.32584-1-fw@strlen.de>",
        "Sender": "netfilter-devel-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netfilter-devel.vger.kernel.org>",
        "X-Mailing-List": "netfilter-devel@vger.kernel.org"
    },
    "content": "We currently call ->nlattr_tuple_size() once at register time and\ncache result in l4proto->nla_size.\n\nnla_size is the only member that is written to, avoiding this would\nallow to make l4proto trackers const.\n\nWe can use ->nlattr_tuple_size() at run time, and cache result in\nthe individual trackers instead.\n\nThis is an intermediate step, next patch removes nlattr_size()\ncallback and computes size at compile time, then removes nla_size.\n\nSigned-off-by: Florian Westphal <fw@strlen.de>\n---\n include/net/netfilter/nf_conntrack_l4proto.h   |  4 ++--\n net/ipv4/netfilter/nf_conntrack_proto_icmp.c   |  9 +++++++--\n net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c |  9 +++++++--\n net/netfilter/nf_conntrack_core.c              |  9 +++++++--\n net/netfilter/nf_conntrack_netlink.c           | 10 +++++++---\n net/netfilter/nf_conntrack_proto.c             |  2 --\n net/netfilter/nf_conntrack_proto_tcp.c         |  9 +++++++--\n 7 files changed, 37 insertions(+), 15 deletions(-)",
    "diff": "diff --git a/include/net/netfilter/nf_conntrack_l4proto.h b/include/net/netfilter/nf_conntrack_l4proto.h\nindex e06518874144..46e786ffcf2f 100644\n--- a/include/net/netfilter/nf_conntrack_l4proto.h\n+++ b/include/net/netfilter/nf_conntrack_l4proto.h\n@@ -74,7 +74,7 @@ struct nf_conntrack_l4proto {\n \tint (*tuple_to_nlattr)(struct sk_buff *skb,\n \t\t\t       const struct nf_conntrack_tuple *t);\n \t/* Calculate tuple nlattr size */\n-\tint (*nlattr_tuple_size)(void);\n+\tunsigned int (*nlattr_tuple_size)(void);\n \tint (*nlattr_to_tuple)(struct nlattr *tb[],\n \t\t\t       struct nf_conntrack_tuple *t);\n \tconst struct nla_policy *nla_policy;\n@@ -144,7 +144,7 @@ int nf_ct_port_tuple_to_nlattr(struct sk_buff *skb,\n \t\t\t       const struct nf_conntrack_tuple *tuple);\n int nf_ct_port_nlattr_to_tuple(struct nlattr *tb[],\n \t\t\t       struct nf_conntrack_tuple *t);\n-int nf_ct_port_nlattr_tuple_size(void);\n+unsigned int nf_ct_port_nlattr_tuple_size(void);\n extern const struct nla_policy nf_ct_port_nla_policy[];\n \n #ifdef CONFIG_SYSCTL\ndiff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c\nindex 8969420cecc3..1849fedd9b81 100644\n--- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c\n+++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c\n@@ -258,9 +258,14 @@ static int icmp_nlattr_to_tuple(struct nlattr *tb[],\n \treturn 0;\n }\n \n-static int icmp_nlattr_tuple_size(void)\n+static unsigned int icmp_nlattr_tuple_size(void)\n {\n-\treturn nla_policy_len(icmp_nla_policy, CTA_PROTO_MAX + 1);\n+\tstatic unsigned int size __read_mostly;\n+\n+\tif (!size)\n+\t\tsize = nla_policy_len(icmp_nla_policy, CTA_PROTO_MAX + 1);\n+\n+\treturn size;\n }\n #endif\n \ndiff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c\nindex dca921df28e1..3ac0d826afc4 100644\n--- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c\n+++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c\n@@ -259,9 +259,14 @@ static int icmpv6_nlattr_to_tuple(struct nlattr *tb[],\n \treturn 0;\n }\n \n-static int icmpv6_nlattr_tuple_size(void)\n+static unsigned int icmpv6_nlattr_tuple_size(void)\n {\n-\treturn nla_policy_len(icmpv6_nla_policy, CTA_PROTO_MAX + 1);\n+\tstatic unsigned int size __read_mostly;\n+\n+\tif (!size)\n+\t\tsize = nla_policy_len(icmpv6_nla_policy, CTA_PROTO_MAX + 1);\n+\n+\treturn size;\n }\n #endif\n \ndiff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c\nindex 28e675150853..0e516947c16f 100644\n--- a/net/netfilter/nf_conntrack_core.c\n+++ b/net/netfilter/nf_conntrack_core.c\n@@ -1563,9 +1563,14 @@ int nf_ct_port_nlattr_to_tuple(struct nlattr *tb[],\n }\n EXPORT_SYMBOL_GPL(nf_ct_port_nlattr_to_tuple);\n \n-int nf_ct_port_nlattr_tuple_size(void)\n+unsigned int nf_ct_port_nlattr_tuple_size(void)\n {\n-\treturn nla_policy_len(nf_ct_port_nla_policy, CTA_PROTO_MAX + 1);\n+\tstatic unsigned int size __read_mostly;\n+\n+\tif (!size)\n+\t\tsize = nla_policy_len(nf_ct_port_nla_policy, CTA_PROTO_MAX + 1);\n+\n+\treturn size;\n }\n EXPORT_SYMBOL_GPL(nf_ct_port_nlattr_tuple_size);\n #endif\ndiff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c\nindex de4053d84364..6e0adfefb9ed 100644\n--- a/net/netfilter/nf_conntrack_netlink.c\n+++ b/net/netfilter/nf_conntrack_netlink.c\n@@ -533,11 +533,11 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 portid, u32 seq, u32 type,\n \treturn -1;\n }\n \n-static inline size_t ctnetlink_proto_size(const struct nf_conn *ct)\n+static size_t ctnetlink_proto_size(const struct nf_conn *ct)\n {\n \tconst struct nf_conntrack_l3proto *l3proto;\n \tconst struct nf_conntrack_l4proto *l4proto;\n-\tsize_t len;\n+\tsize_t len, len4 = 0;\n \n \tl3proto = __nf_ct_l3proto_find(nf_ct_l3num(ct));\n \tlen = l3proto->nla_size;\n@@ -545,8 +545,12 @@ static inline size_t ctnetlink_proto_size(const struct nf_conn *ct)\n \n \tl4proto = __nf_ct_l4proto_find(nf_ct_l3num(ct), nf_ct_protonum(ct));\n \tlen += l4proto->nla_size;\n+\tif (l4proto->nlattr_tuple_size) {\n+\t\tlen4 = l4proto->nlattr_tuple_size();\n+\t\tlen4 *= 3u; /* ORIG, REPLY, MASTER */\n+\t}\n \n-\treturn len;\n+\treturn len + len4;\n }\n \n static inline size_t ctnetlink_acct_size(const struct nf_conn *ct)\ndiff --git a/net/netfilter/nf_conntrack_proto.c b/net/netfilter/nf_conntrack_proto.c\nindex 83f739e9dc08..3b06ff3f2dee 100644\n--- a/net/netfilter/nf_conntrack_proto.c\n+++ b/net/netfilter/nf_conntrack_proto.c\n@@ -398,8 +398,6 @@ int nf_ct_l4proto_register_one(struct nf_conntrack_l4proto *l4proto)\n \tl4proto->nla_size = 0;\n \tif (l4proto->nlattr_size)\n \t\tl4proto->nla_size += l4proto->nlattr_size();\n-\tif (l4proto->nlattr_tuple_size)\n-\t\tl4proto->nla_size += 3 * l4proto->nlattr_tuple_size();\n \n \trcu_assign_pointer(nf_ct_protos[l4proto->l3proto][l4proto->l4proto],\n \t\t\t   l4proto);\ndiff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c\nindex 8f283294d70f..b12fc07111d0 100644\n--- a/net/netfilter/nf_conntrack_proto_tcp.c\n+++ b/net/netfilter/nf_conntrack_proto_tcp.c\n@@ -1277,9 +1277,14 @@ static int tcp_nlattr_size(void)\n \t\t+ nla_policy_len(tcp_nla_policy, CTA_PROTOINFO_TCP_MAX + 1);\n }\n \n-static int tcp_nlattr_tuple_size(void)\n+static unsigned int tcp_nlattr_tuple_size(void)\n {\n-\treturn nla_policy_len(nf_ct_port_nla_policy, CTA_PROTO_MAX + 1);\n+\tstatic unsigned int size __read_mostly;\n+\n+\tif (!size)\n+\t\tsize = nla_policy_len(nf_ct_port_nla_policy, CTA_PROTO_MAX + 1);\n+\n+\treturn size;\n }\n #endif\n \n",
    "prefixes": [
        "nf-next",
        "1/4"
    ]
}