{"id":833477,"url":"http://patchwork.ozlabs.org/api/1.2/patches/833477/?format=json","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=json","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=json","name":"Florian Westphal","email":"fw@strlen.de"},"delegate":{"id":6139,"url":"http://patchwork.ozlabs.org/api/1.2/users/6139/?format=json","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=json","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"]}