* [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation @ 2015-10-14 5:58 Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops Ronen Arad ` (5 more replies) 0 siblings, 6 replies; 17+ messages in thread From: Ronen Arad @ 2015-10-14 5:58 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad if_nlmsg_size() overestimates the minimum allocation size of netlink dump request (when called from rtnl_calcit()) or the size of the message (when called from rtnl_getlink()). This is because ext_filter_mask is not supported by rtnl_link_get_af_size() and rtnl_link_get_size(). The over-estimation is significant when at least one netdev has many VLANs configured (8 bytes for each configured VLAN). This patch-set "rightsizes" the protocol specific attribute size calculation by propagating ext_filter_mask to rtnl_link_get_af_size() and adding optional filtering aware get_af_size_filtered op in struct rtnl_af_ops. Bridge module, which already used filtering aware sizing for notification, is enhanced to do the same for netlink dump requests. Ronen Arad (4): rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops bridge: br_af_ops add br_get_link_af_size_filtered rtnetlink: Prefer filtering-aware af sizing bridge: Remove br_get_link_af_size include/net/rtnetlink.h | 2 ++ net/bridge/br_netlink.c | 23 ++--------------------- net/core/rtnetlink.c | 12 +++++++++--- 3 files changed, 13 insertions(+), 24 deletions(-) -- 2.1.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops 2015-10-14 5:58 [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation Ronen Arad @ 2015-10-14 5:58 ` Ronen Arad 2015-10-14 9:55 ` Jiri Benc 2015-10-14 5:58 ` [PATCH net-next 2/4] bridge: br_af_ops add br_get_link_af_size_filtered Ronen Arad ` (4 subsequent siblings) 5 siblings, 1 reply; 17+ messages in thread From: Ronen Arad @ 2015-10-14 5:58 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad get_link_af_size_filtered() - a filtering-mask aware alternative function is added to struct rtnl_af_ops in order to allow for "rightsizing" the IFLA_AF_SPEC calculation in if_nlmsg_size(). This significantly reduces the message size when at least one netdev has large number of VLANs. Signed-off-by: Ronen Arad <ronen.arad@intel.com> --- include/net/rtnetlink.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index aff6ceb..96df9bb 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h @@ -130,6 +130,8 @@ struct rtnl_af_ops { const struct nlattr *attr); int (*set_link_af)(struct net_device *dev, const struct nlattr *attr); + size_t (*get_link_af_size_filtered)(const struct net_device *dev, + u32 ext_filter_mask); }; void __rtnl_af_unregister(struct rtnl_af_ops *ops); -- 2.1.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops 2015-10-14 5:58 ` [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops Ronen Arad @ 2015-10-14 9:55 ` Jiri Benc 2015-10-14 14:46 ` Arad, Ronen 0 siblings, 1 reply; 17+ messages in thread From: Jiri Benc @ 2015-10-14 9:55 UTC (permalink / raw) To: Ronen Arad; +Cc: netdev On Tue, 13 Oct 2015 22:58:31 -0700, Ronen Arad wrote: > --- a/include/net/rtnetlink.h > +++ b/include/net/rtnetlink.h > @@ -130,6 +130,8 @@ struct rtnl_af_ops { > const struct nlattr *attr); > int (*set_link_af)(struct net_device *dev, > const struct nlattr *attr); > + size_t (*get_link_af_size_filtered)(const struct net_device *dev, > + u32 ext_filter_mask); > }; There's not much point in having two callbacks doing essentially the same. Why you just don't add the new parameter to the existing get_link_af_size? Looking at what the patch 3 does, the current implementations of the callback can just ignore the new parameter and bridge can remove the current br_get_link_af and rename br_get_link_af_size_filtered to br_get_link_af. Jiri -- Jiri Benc ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops 2015-10-14 9:55 ` Jiri Benc @ 2015-10-14 14:46 ` Arad, Ronen 0 siblings, 0 replies; 17+ messages in thread From: Arad, Ronen @ 2015-10-14 14:46 UTC (permalink / raw) To: Jiri Benc, netdev >-----Original Message----- >From: Jiri Benc [mailto:jbenc@redhat.com] >Sent: Wednesday, October 14, 2015 2:55 AM >To: Arad, Ronen >Cc: netdev@vger.kernel.org >Subject: Re: [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to >rtnl_af_ops > >On Tue, 13 Oct 2015 22:58:31 -0700, Ronen Arad wrote: >> --- a/include/net/rtnetlink.h >> +++ b/include/net/rtnetlink.h >> @@ -130,6 +130,8 @@ struct rtnl_af_ops { >> const struct nlattr *attr); >> int (*set_link_af)(struct net_device *dev, >> const struct nlattr *attr); >> + size_t (*get_link_af_size_filtered)(const struct >net_device *dev, >> + u32 ext_filter_mask); >> }; > >There's not much point in having two callbacks doing essentially the >same. Why you just don't add the new parameter to the existing >get_link_af_size? Looking at what the patch 3 does, the current >implementations of the callback can just ignore the new parameter and >bridge can remove the current br_get_link_af and rename >br_get_link_af_size_filtered to br_get_link_af. [@Ronen] I agree with you about br_netlink. There was no need for both so I removed br_get_link_af. Changing get_link_af_size signature, however, will require change in other unrelated locations. I wanted to avoid that. The affected location are: net/ipv4/devinet.c:2374: .get_link_af_size = inet_get_link_af_size, net/ipv6/addrconf.c:5868: .get_link_af_size = inet6_get_link_af_size, If there is a consensus that adding ext_filter_mask argument to get_link_af is preferred, I'll submit a v2. > > Jiri > >-- >Jiri Benc ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH net-next 2/4] bridge: br_af_ops add br_get_link_af_size_filtered 2015-10-14 5:58 [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops Ronen Arad @ 2015-10-14 5:58 ` Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 3/4] rtnetlink: Prefer filtering-aware af sizing Ronen Arad ` (3 subsequent siblings) 5 siblings, 0 replies; 17+ messages in thread From: Ronen Arad @ 2015-10-14 5:58 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad Provide get_af_size_filtered (set to br_get_link_af_size_filtered) in br_af_ops for proper filtering mask aware sizing of AF_BRIDGE attributes. This is an optimization of netlink message size when -c[compressvlans] option is entered for iproute2's bridge command. Optimization will get into effect with rtnetlink change in the next patch of this set. Signed-off-by: Ronen Arad <ronen.arad@intel.com> --- net/bridge/br_netlink.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 94b4de8..d900881 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -1235,8 +1235,9 @@ static size_t br_get_link_af_size(const struct net_device *dev) } static struct rtnl_af_ops br_af_ops __read_mostly = { - .family = AF_BRIDGE, - .get_link_af_size = br_get_link_af_size, + .family = AF_BRIDGE, + .get_link_af_size = br_get_link_af_size, + .get_link_af_size_filtered = br_get_link_af_size_filtered, }; struct rtnl_link_ops br_link_ops __read_mostly = { -- 2.1.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH net-next 3/4] rtnetlink: Prefer filtering-aware af sizing 2015-10-14 5:58 [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 2/4] bridge: br_af_ops add br_get_link_af_size_filtered Ronen Arad @ 2015-10-14 5:58 ` Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 4/4] bridge: Remove br_get_link_af_size Ronen Arad ` (2 subsequent siblings) 5 siblings, 0 replies; 17+ messages in thread From: Ronen Arad @ 2015-10-14 5:58 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad Add ext_filter_mask arg to rtnl_link_get_af_size(). rtnl_link_get_af_size() will prefer filtering-aware af sizing when provided by an address family. It falls back to get_link_af_size for other families. Signed-off-by: Ronen Arad <ronen.arad@intel.com> --- net/core/rtnetlink.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 2477595..dd7cda7 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -497,7 +497,8 @@ void rtnl_af_unregister(struct rtnl_af_ops *ops) } EXPORT_SYMBOL_GPL(rtnl_af_unregister); -static size_t rtnl_link_get_af_size(const struct net_device *dev) +static size_t rtnl_link_get_af_size(const struct net_device *dev, + u32 ext_filter_mask) { struct rtnl_af_ops *af_ops; size_t size; @@ -506,7 +507,12 @@ static size_t rtnl_link_get_af_size(const struct net_device *dev) size = nla_total_size(sizeof(struct nlattr)); list_for_each_entry(af_ops, &rtnl_af_ops, list) { - if (af_ops->get_link_af_size) { + /* Prefer filtering-aware af sizing when available */ + if (af_ops->get_link_af_size_filtered) { + /* AF_* + nested data */ + size += nla_total_size(sizeof(struct nlattr)) + + af_ops->get_link_af_size_filtered(dev, ext_filter_mask); + } else if (af_ops->get_link_af_size) { /* AF_* + nested data */ size += nla_total_size(sizeof(struct nlattr)) + af_ops->get_link_af_size(dev); @@ -900,7 +906,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ - + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ + + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ + nla_total_size(1); /* IFLA_PROTO_DOWN */ -- 2.1.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH net-next 4/4] bridge: Remove br_get_link_af_size 2015-10-14 5:58 [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation Ronen Arad ` (2 preceding siblings ...) 2015-10-14 5:58 ` [PATCH net-next 3/4] rtnetlink: Prefer filtering-aware af sizing Ronen Arad @ 2015-10-14 5:58 ` Ronen Arad 2015-10-14 15:51 ` [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation Ronen Arad 2015-10-15 1:44 ` [PATCH net-next 0/4] " David Miller 5 siblings, 0 replies; 17+ messages in thread From: Ronen Arad @ 2015-10-14 5:58 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad Unset get_link_af_size in br_af_ops. br_get_link_af_size() becomes unused and thus removed. Signed-off-by: Ronen Arad <ronen.arad@intel.com> --- net/bridge/br_netlink.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index d900881..204222d 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -1214,29 +1214,9 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) return 0; } -static size_t br_get_link_af_size(const struct net_device *dev) -{ - struct net_bridge_port *p; - struct net_bridge *br; - int num_vlans = 0; - - if (br_port_exists(dev)) { - p = br_port_get_rtnl(dev); - num_vlans = br_get_num_vlan_infos(nbp_vlan_group(p), - RTEXT_FILTER_BRVLAN); - } else if (dev->priv_flags & IFF_EBRIDGE) { - br = netdev_priv(dev); - num_vlans = br_get_num_vlan_infos(br_vlan_group(br), - RTEXT_FILTER_BRVLAN); - } - - /* Each VLAN is returned in bridge_vlan_info along with flags */ - return num_vlans * nla_total_size(sizeof(struct bridge_vlan_info)); -} static struct rtnl_af_ops br_af_ops __read_mostly = { .family = AF_BRIDGE, - .get_link_af_size = br_get_link_af_size, .get_link_af_size_filtered = br_get_link_af_size_filtered, }; -- 2.1.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-14 5:58 [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation Ronen Arad ` (3 preceding siblings ...) 2015-10-14 5:58 ` [PATCH net-next 4/4] bridge: Remove br_get_link_af_size Ronen Arad @ 2015-10-14 15:51 ` Ronen Arad 2015-10-15 2:24 ` David Miller 2015-10-15 5:50 ` [PATCH net-next v3] " Ronen Arad 2015-10-15 1:44 ` [PATCH net-next 0/4] " David Miller 5 siblings, 2 replies; 17+ messages in thread From: Ronen Arad @ 2015-10-14 15:51 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad This is a v2 of a 4-parts patch with same subject. Giving up on backward compatibility allows for much simplified single patch. if_nlmsg_size() overestimates the minimum allocation size of netlink dump request (when called from rtnl_calcit()) or the size of the message (when called from rtnl_getlink()). This is because ext_filter_mask is not supported by rtnl_link_get_af_size() and rtnl_link_get_size(). The over-estimation is significant when at least one netdev has many VLANs configured (8 bytes for each configured VLAN). This patch-set "rightsizes" the protocol specific attribute size calculation by propagating ext_filter_mask to rtnl_link_get_af_size() and adding this a argument to get_link_af_size op in rtnl_af_ops. Bridge module already used filtering aware sizing for notifications. br_get_link_af_size_filtered() is consistent with the modified get_link_af_size op so it replaces br_get_link_af_size() in br_af_ops. br_get_link_af_size() becomes unused and thus removed. --- include/net/rtnetlink.h | 3 ++- net/bridge/br_netlink.c | 21 +-------------------- net/core/rtnetlink.c | 8 ++++---- net/ipv4/devinet.c | 4 ++-- net/ipv6/addrconf.c | 3 ++- 5 files changed, 11 insertions(+), 28 deletions(-) diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index aff6ceb..2f87c1b 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h @@ -124,7 +124,8 @@ struct rtnl_af_ops { int (*fill_link_af)(struct sk_buff *skb, const struct net_device *dev, u32 ext_filter_mask); - size_t (*get_link_af_size)(const struct net_device *dev); + size_t (*get_link_af_size)(const struct net_device *dev, + u32 ext_filter_mask); int (*validate_link_af)(const struct net_device *dev, const struct nlattr *attr); diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 94b4de8..40197ff 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -1214,29 +1214,10 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) return 0; } -static size_t br_get_link_af_size(const struct net_device *dev) -{ - struct net_bridge_port *p; - struct net_bridge *br; - int num_vlans = 0; - - if (br_port_exists(dev)) { - p = br_port_get_rtnl(dev); - num_vlans = br_get_num_vlan_infos(nbp_vlan_group(p), - RTEXT_FILTER_BRVLAN); - } else if (dev->priv_flags & IFF_EBRIDGE) { - br = netdev_priv(dev); - num_vlans = br_get_num_vlan_infos(br_vlan_group(br), - RTEXT_FILTER_BRVLAN); - } - - /* Each VLAN is returned in bridge_vlan_info along with flags */ - return num_vlans * nla_total_size(sizeof(struct bridge_vlan_info)); -} static struct rtnl_af_ops br_af_ops __read_mostly = { .family = AF_BRIDGE, - .get_link_af_size = br_get_link_af_size, + .get_link_af_size = br_get_link_af_size_filtered, }; struct rtnl_link_ops br_link_ops __read_mostly = { diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 2477595..581aec4 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -497,7 +497,8 @@ void rtnl_af_unregister(struct rtnl_af_ops *ops) } EXPORT_SYMBOL_GPL(rtnl_af_unregister); -static size_t rtnl_link_get_af_size(const struct net_device *dev) +static size_t rtnl_link_get_af_size(const struct net_device *dev, + u32 ext_filter_mask) { struct rtnl_af_ops *af_ops; size_t size; @@ -509,7 +510,7 @@ static size_t rtnl_link_get_af_size(const struct net_device *dev) if (af_ops->get_link_af_size) { /* AF_* + nested data */ size += nla_total_size(sizeof(struct nlattr)) + - af_ops->get_link_af_size(dev); + af_ops->get_link_af_size(dev, ext_filter_mask); } } @@ -900,7 +901,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ - + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ + + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ + nla_total_size(1); /* IFLA_PROTO_DOWN */ @@ -3443,4 +3444,3 @@ void __init rtnetlink_init(void) rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, NULL); rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, NULL); } - diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 7350084..cebd9d3 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1644,7 +1644,8 @@ errout: rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err); } -static size_t inet_get_link_af_size(const struct net_device *dev) +static size_t inet_get_link_af_size(const struct net_device *dev, + u32 ext_filter_mask) { struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr); @@ -2398,4 +2399,3 @@ void __init devinet_init(void) rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, inet_netconf_dump_devconf, NULL); } - diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f0326aa..0645fd1 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -4786,7 +4786,8 @@ nla_put_failure: return -EMSGSIZE; } -static size_t inet6_get_link_af_size(const struct net_device *dev) +static size_t inet6_get_link_af_size(const struct net_device *dev, + u32 ext_filter_mask) { if (!__in6_dev_get(dev)) return 0; -- 2.1.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-14 15:51 ` [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation Ronen Arad @ 2015-10-15 2:24 ` David Miller 2015-10-15 5:52 ` Arad, Ronen 2015-10-15 5:50 ` [PATCH net-next v3] " Ronen Arad 1 sibling, 1 reply; 17+ messages in thread From: David Miller @ 2015-10-15 2:24 UTC (permalink / raw) To: ronen.arad; +Cc: netdev From: Ronen Arad <ronen.arad@intel.com> Date: Wed, 14 Oct 2015 08:51:28 -0700 > @@ -900,7 +901,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, > + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ > + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ > + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ > - + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ > + + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ > + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ Please don't change the indentation on this line, keep it matching the indentation of all of the surrounding lines of this expression. Thanks. ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-15 2:24 ` David Miller @ 2015-10-15 5:52 ` Arad, Ronen 0 siblings, 0 replies; 17+ messages in thread From: Arad, Ronen @ 2015-10-15 5:52 UTC (permalink / raw) To: David Miller; +Cc: netdev >-----Original Message----- >From: David Miller [mailto:davem@davemloft.net] >Sent: Wednesday, October 14, 2015 7:24 PM >To: Arad, Ronen >Cc: netdev@vger.kernel.org >Subject: Re: [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size >calculation > >From: Ronen Arad <ronen.arad@intel.com> >Date: Wed, 14 Oct 2015 08:51:28 -0700 > >> @@ -900,7 +901,7 @@ static noinline size_t if_nlmsg_size(const struct >net_device *dev, >> + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ >> + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + >IFLA_PORT_SELF */ >> + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ >> - + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ >> + + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ >> + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ > >Please don't change the indentation on this line, keep it matching >the indentation of all of the surrounding lines of this expression. [@Ronen] Sure. V3 submitted. My editor didn't like the indentation of the surrounding lines which are one less than two TAB spaces but consistency is important. > >Thanks. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH net-next v3] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-14 15:51 ` [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation Ronen Arad 2015-10-15 2:24 ` David Miller @ 2015-10-15 5:50 ` Ronen Arad 2015-10-15 13:02 ` David Miller 2015-10-19 16:23 ` Ronen Arad 1 sibling, 2 replies; 17+ messages in thread From: Ronen Arad @ 2015-10-15 5:50 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad if_nlmsg_size() overestimates the minimum allocation size of netlink dump request (when called from rtnl_calcit()) or the size of the message (when called from rtnl_getlink()). This is because ext_filter_mask is not supported by rtnl_link_get_af_size() and rtnl_link_get_size(). The over-estimation is significant when at least one netdev has many VLANs configured (8 bytes for each configured VLAN). This patch-set "rightsizes" the protocol specific attribute size calculation by propagating ext_filter_mask to rtnl_link_get_af_size() and adding this a argument to get_link_af_size op in rtnl_af_ops. Bridge module already used filtering aware sizing for notifications. br_get_link_af_size_filtered() is consistent with the modified get_link_af_size op so it replaces br_get_link_af_size() in br_af_ops. br_get_link_af_size() becomes unused and thus removed. --- include/net/rtnetlink.h | 3 ++- net/bridge/br_netlink.c | 21 +-------------------- net/core/rtnetlink.c | 8 ++++---- net/ipv4/devinet.c | 4 ++-- net/ipv6/addrconf.c | 3 ++- 5 files changed, 11 insertions(+), 28 deletions(-) diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index aff6ceb..2f87c1b 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h @@ -124,7 +124,8 @@ struct rtnl_af_ops { int (*fill_link_af)(struct sk_buff *skb, const struct net_device *dev, u32 ext_filter_mask); - size_t (*get_link_af_size)(const struct net_device *dev); + size_t (*get_link_af_size)(const struct net_device *dev, + u32 ext_filter_mask); int (*validate_link_af)(const struct net_device *dev, const struct nlattr *attr); diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 94b4de8..40197ff 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -1214,29 +1214,10 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) return 0; } -static size_t br_get_link_af_size(const struct net_device *dev) -{ - struct net_bridge_port *p; - struct net_bridge *br; - int num_vlans = 0; - - if (br_port_exists(dev)) { - p = br_port_get_rtnl(dev); - num_vlans = br_get_num_vlan_infos(nbp_vlan_group(p), - RTEXT_FILTER_BRVLAN); - } else if (dev->priv_flags & IFF_EBRIDGE) { - br = netdev_priv(dev); - num_vlans = br_get_num_vlan_infos(br_vlan_group(br), - RTEXT_FILTER_BRVLAN); - } - - /* Each VLAN is returned in bridge_vlan_info along with flags */ - return num_vlans * nla_total_size(sizeof(struct bridge_vlan_info)); -} static struct rtnl_af_ops br_af_ops __read_mostly = { .family = AF_BRIDGE, - .get_link_af_size = br_get_link_af_size, + .get_link_af_size = br_get_link_af_size_filtered, }; struct rtnl_link_ops br_link_ops __read_mostly = { diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 2477595..7c78b5a 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -497,7 +497,8 @@ void rtnl_af_unregister(struct rtnl_af_ops *ops) } EXPORT_SYMBOL_GPL(rtnl_af_unregister); -static size_t rtnl_link_get_af_size(const struct net_device *dev) +static size_t rtnl_link_get_af_size(const struct net_device *dev, + u32 ext_filter_mask) { struct rtnl_af_ops *af_ops; size_t size; @@ -509,7 +510,7 @@ static size_t rtnl_link_get_af_size(const struct net_device *dev) if (af_ops->get_link_af_size) { /* AF_* + nested data */ size += nla_total_size(sizeof(struct nlattr)) + - af_ops->get_link_af_size(dev); + af_ops->get_link_af_size(dev, ext_filter_mask); } } @@ -900,7 +901,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ - + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ + + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ + nla_total_size(1); /* IFLA_PROTO_DOWN */ @@ -3443,4 +3444,3 @@ void __init rtnetlink_init(void) rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, NULL); rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, NULL); } - diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 7350084..cebd9d3 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1644,7 +1644,8 @@ errout: rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err); } -static size_t inet_get_link_af_size(const struct net_device *dev) +static size_t inet_get_link_af_size(const struct net_device *dev, + u32 ext_filter_mask) { struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr); @@ -2398,4 +2399,3 @@ void __init devinet_init(void) rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, inet_netconf_dump_devconf, NULL); } - diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f0326aa..0645fd1 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -4786,7 +4786,8 @@ nla_put_failure: return -EMSGSIZE; } -static size_t inet6_get_link_af_size(const struct net_device *dev) +static size_t inet6_get_link_af_size(const struct net_device *dev, + u32 ext_filter_mask) { if (!__in6_dev_get(dev)) return 0; -- 2.1.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH net-next v3] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-15 5:50 ` [PATCH net-next v3] " Ronen Arad @ 2015-10-15 13:02 ` David Miller 2015-10-19 16:23 ` Ronen Arad 1 sibling, 0 replies; 17+ messages in thread From: David Miller @ 2015-10-15 13:02 UTC (permalink / raw) To: ronen.arad; +Cc: netdev From: Ronen Arad <ronen.arad@intel.com> Date: Wed, 14 Oct 2015 22:50:04 -0700 > if_nlmsg_size() overestimates the minimum allocation size of netlink > dump request (when called from rtnl_calcit()) or the size of the > message (when called from rtnl_getlink()). This is because > ext_filter_mask is not supported by rtnl_link_get_af_size() and > rtnl_link_get_size(). > > The over-estimation is significant when at least one netdev has many > VLANs configured (8 bytes for each configured VLAN). > > This patch-set "rightsizes" the protocol specific attribute size > calculation by propagating ext_filter_mask to rtnl_link_get_af_size() > and adding this a argument to get_link_af_size op in rtnl_af_ops. > > Bridge module already used filtering aware sizing for notifications. > br_get_link_af_size_filtered() is consistent with the modified > get_link_af_size op so it replaces br_get_link_af_size() in br_af_ops. > br_get_link_af_size() becomes unused and thus removed. This is missing a proper Signoff ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH net-next v3] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-15 5:50 ` [PATCH net-next v3] " Ronen Arad 2015-10-15 13:02 ` David Miller @ 2015-10-19 16:23 ` Ronen Arad 2015-10-21 6:31 ` Samudrala, Sridhar 2015-10-22 2:15 ` David Miller 1 sibling, 2 replies; 17+ messages in thread From: Ronen Arad @ 2015-10-19 16:23 UTC (permalink / raw) To: netdev; +Cc: Ronen Arad if_nlmsg_size() overestimates the minimum allocation size of netlink dump request (when called from rtnl_calcit()) or the size of the message (when called from rtnl_getlink()). This is because ext_filter_mask is not supported by rtnl_link_get_af_size() and rtnl_link_get_size(). The over-estimation is significant when at least one netdev has many VLANs configured (8 bytes for each configured VLAN). This patch-set "rightsizes" the protocol specific attribute size calculation by propagating ext_filter_mask to rtnl_link_get_af_size() and adding this a argument to get_link_af_size op in rtnl_af_ops. Bridge module already used filtering aware sizing for notifications. br_get_link_af_size_filtered() is consistent with the modified get_link_af_size op so it replaces br_get_link_af_size() in br_af_ops. br_get_link_af_size() becomes unused and thus removed. Signed-off-by: Ronen Arad <ronen.arad@intel.com> --- include/net/rtnetlink.h | 3 ++- net/bridge/br_netlink.c | 21 +-------------------- net/core/rtnetlink.c | 8 ++++---- net/ipv4/devinet.c | 4 ++-- net/ipv6/addrconf.c | 3 ++- 5 files changed, 11 insertions(+), 28 deletions(-) diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index aff6ceb..2f87c1b 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h @@ -124,7 +124,8 @@ struct rtnl_af_ops { int (*fill_link_af)(struct sk_buff *skb, const struct net_device *dev, u32 ext_filter_mask); - size_t (*get_link_af_size)(const struct net_device *dev); + size_t (*get_link_af_size)(const struct net_device *dev, + u32 ext_filter_mask); int (*validate_link_af)(const struct net_device *dev, const struct nlattr *attr); diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 94b4de8..40197ff 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -1214,29 +1214,10 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) return 0; } -static size_t br_get_link_af_size(const struct net_device *dev) -{ - struct net_bridge_port *p; - struct net_bridge *br; - int num_vlans = 0; - - if (br_port_exists(dev)) { - p = br_port_get_rtnl(dev); - num_vlans = br_get_num_vlan_infos(nbp_vlan_group(p), - RTEXT_FILTER_BRVLAN); - } else if (dev->priv_flags & IFF_EBRIDGE) { - br = netdev_priv(dev); - num_vlans = br_get_num_vlan_infos(br_vlan_group(br), - RTEXT_FILTER_BRVLAN); - } - - /* Each VLAN is returned in bridge_vlan_info along with flags */ - return num_vlans * nla_total_size(sizeof(struct bridge_vlan_info)); -} static struct rtnl_af_ops br_af_ops __read_mostly = { .family = AF_BRIDGE, - .get_link_af_size = br_get_link_af_size, + .get_link_af_size = br_get_link_af_size_filtered, }; struct rtnl_link_ops br_link_ops __read_mostly = { diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 2477595..7c78b5a 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -497,7 +497,8 @@ void rtnl_af_unregister(struct rtnl_af_ops *ops) } EXPORT_SYMBOL_GPL(rtnl_af_unregister); -static size_t rtnl_link_get_af_size(const struct net_device *dev) +static size_t rtnl_link_get_af_size(const struct net_device *dev, + u32 ext_filter_mask) { struct rtnl_af_ops *af_ops; size_t size; @@ -509,7 +510,7 @@ static size_t rtnl_link_get_af_size(const struct net_device *dev) if (af_ops->get_link_af_size) { /* AF_* + nested data */ size += nla_total_size(sizeof(struct nlattr)) + - af_ops->get_link_af_size(dev); + af_ops->get_link_af_size(dev, ext_filter_mask); } } @@ -900,7 +901,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ - + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ + + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ + nla_total_size(1); /* IFLA_PROTO_DOWN */ @@ -3443,4 +3444,3 @@ void __init rtnetlink_init(void) rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, NULL); rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, NULL); } - diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 7350084..cebd9d3 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1644,7 +1644,8 @@ errout: rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err); } -static size_t inet_get_link_af_size(const struct net_device *dev) +static size_t inet_get_link_af_size(const struct net_device *dev, + u32 ext_filter_mask) { struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr); @@ -2398,4 +2399,3 @@ void __init devinet_init(void) rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, inet_netconf_dump_devconf, NULL); } - diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f0326aa..0645fd1 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -4786,7 +4786,8 @@ nla_put_failure: return -EMSGSIZE; } -static size_t inet6_get_link_af_size(const struct net_device *dev) +static size_t inet6_get_link_af_size(const struct net_device *dev, + u32 ext_filter_mask) { if (!__in6_dev_get(dev)) return 0; -- 2.1.0 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH net-next v3] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-19 16:23 ` Ronen Arad @ 2015-10-21 6:31 ` Samudrala, Sridhar 2015-10-22 2:15 ` David Miller 1 sibling, 0 replies; 17+ messages in thread From: Samudrala, Sridhar @ 2015-10-21 6:31 UTC (permalink / raw) To: Ronen Arad, netdev On 10/19/2015 9:23 AM, Ronen Arad wrote: > if_nlmsg_size() overestimates the minimum allocation size of netlink > dump request (when called from rtnl_calcit()) or the size of the > message (when called from rtnl_getlink()). This is because > ext_filter_mask is not supported by rtnl_link_get_af_size() and > rtnl_link_get_size(). > > The over-estimation is significant when at least one netdev has many > VLANs configured (8 bytes for each configured VLAN). > > This patch-set "rightsizes" the protocol specific attribute size > calculation by propagating ext_filter_mask to rtnl_link_get_af_size() > and adding this a argument to get_link_af_size op in rtnl_af_ops. > > Bridge module already used filtering aware sizing for notifications. > br_get_link_af_size_filtered() is consistent with the modified > get_link_af_size op so it replaces br_get_link_af_size() in br_af_ops. > br_get_link_af_size() becomes unused and thus removed. > > Signed-off-by: Ronen Arad <ronen.arad@intel.com> Acked-by: Sridhar Samudrala <sridhar.samudrala@intel.com> > --- > include/net/rtnetlink.h | 3 ++- > net/bridge/br_netlink.c | 21 +-------------------- > net/core/rtnetlink.c | 8 ++++---- > net/ipv4/devinet.c | 4 ++-- > net/ipv6/addrconf.c | 3 ++- > 5 files changed, 11 insertions(+), 28 deletions(-) > > diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h > index aff6ceb..2f87c1b 100644 > --- a/include/net/rtnetlink.h > +++ b/include/net/rtnetlink.h > @@ -124,7 +124,8 @@ struct rtnl_af_ops { > int (*fill_link_af)(struct sk_buff *skb, > const struct net_device *dev, > u32 ext_filter_mask); > - size_t (*get_link_af_size)(const struct net_device *dev); > + size_t (*get_link_af_size)(const struct net_device *dev, > + u32 ext_filter_mask); > > int (*validate_link_af)(const struct net_device *dev, > const struct nlattr *attr); > diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c > index 94b4de8..40197ff 100644 > --- a/net/bridge/br_netlink.c > +++ b/net/bridge/br_netlink.c > @@ -1214,29 +1214,10 @@ static int br_fill_info(struct sk_buff *skb, const struct net_device *brdev) > return 0; > } > > -static size_t br_get_link_af_size(const struct net_device *dev) > -{ > - struct net_bridge_port *p; > - struct net_bridge *br; > - int num_vlans = 0; > - > - if (br_port_exists(dev)) { > - p = br_port_get_rtnl(dev); > - num_vlans = br_get_num_vlan_infos(nbp_vlan_group(p), > - RTEXT_FILTER_BRVLAN); > - } else if (dev->priv_flags & IFF_EBRIDGE) { > - br = netdev_priv(dev); > - num_vlans = br_get_num_vlan_infos(br_vlan_group(br), > - RTEXT_FILTER_BRVLAN); > - } > - > - /* Each VLAN is returned in bridge_vlan_info along with flags */ > - return num_vlans * nla_total_size(sizeof(struct bridge_vlan_info)); > -} > > static struct rtnl_af_ops br_af_ops __read_mostly = { > .family = AF_BRIDGE, > - .get_link_af_size = br_get_link_af_size, > + .get_link_af_size = br_get_link_af_size_filtered, > }; > > struct rtnl_link_ops br_link_ops __read_mostly = { > diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c > index 2477595..7c78b5a 100644 > --- a/net/core/rtnetlink.c > +++ b/net/core/rtnetlink.c > @@ -497,7 +497,8 @@ void rtnl_af_unregister(struct rtnl_af_ops *ops) > } > EXPORT_SYMBOL_GPL(rtnl_af_unregister); > > -static size_t rtnl_link_get_af_size(const struct net_device *dev) > +static size_t rtnl_link_get_af_size(const struct net_device *dev, > + u32 ext_filter_mask) > { > struct rtnl_af_ops *af_ops; > size_t size; > @@ -509,7 +510,7 @@ static size_t rtnl_link_get_af_size(const struct net_device *dev) > if (af_ops->get_link_af_size) { > /* AF_* + nested data */ > size += nla_total_size(sizeof(struct nlattr)) + > - af_ops->get_link_af_size(dev); > + af_ops->get_link_af_size(dev, ext_filter_mask); > } > } > > @@ -900,7 +901,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, > + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ > + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ > + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ > - + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ > + + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ > + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ > + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ > + nla_total_size(1); /* IFLA_PROTO_DOWN */ > @@ -3443,4 +3444,3 @@ void __init rtnetlink_init(void) > rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, NULL); > rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, NULL); > } > - > diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c > index 7350084..cebd9d3 100644 > --- a/net/ipv4/devinet.c > +++ b/net/ipv4/devinet.c > @@ -1644,7 +1644,8 @@ errout: > rtnl_set_sk_err(net, RTNLGRP_IPV4_IFADDR, err); > } > > -static size_t inet_get_link_af_size(const struct net_device *dev) > +static size_t inet_get_link_af_size(const struct net_device *dev, > + u32 ext_filter_mask) > { > struct in_device *in_dev = rcu_dereference_rtnl(dev->ip_ptr); > > @@ -2398,4 +2399,3 @@ void __init devinet_init(void) > rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, > inet_netconf_dump_devconf, NULL); > } > - > diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c > index f0326aa..0645fd1 100644 > --- a/net/ipv6/addrconf.c > +++ b/net/ipv6/addrconf.c > @@ -4786,7 +4786,8 @@ nla_put_failure: > return -EMSGSIZE; > } > > -static size_t inet6_get_link_af_size(const struct net_device *dev) > +static size_t inet6_get_link_af_size(const struct net_device *dev, > + u32 ext_filter_mask) > { > if (!__in6_dev_get(dev)) > return 0; ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next v3] netlink: Rightsize IFLA_AF_SPEC size calculation 2015-10-19 16:23 ` Ronen Arad 2015-10-21 6:31 ` Samudrala, Sridhar @ 2015-10-22 2:15 ` David Miller 1 sibling, 0 replies; 17+ messages in thread From: David Miller @ 2015-10-22 2:15 UTC (permalink / raw) To: ronen.arad; +Cc: netdev From: Ronen Arad <ronen.arad@intel.com> Date: Mon, 19 Oct 2015 09:23:28 -0700 > if_nlmsg_size() overestimates the minimum allocation size of netlink > dump request (when called from rtnl_calcit()) or the size of the > message (when called from rtnl_getlink()). This is because > ext_filter_mask is not supported by rtnl_link_get_af_size() and > rtnl_link_get_size(). > > The over-estimation is significant when at least one netdev has many > VLANs configured (8 bytes for each configured VLAN). > > This patch-set "rightsizes" the protocol specific attribute size > calculation by propagating ext_filter_mask to rtnl_link_get_af_size() > and adding this a argument to get_link_af_size op in rtnl_af_ops. > > Bridge module already used filtering aware sizing for notifications. > br_get_link_af_size_filtered() is consistent with the modified > get_link_af_size op so it replaces br_get_link_af_size() in br_af_ops. > br_get_link_af_size() becomes unused and thus removed. > > Signed-off-by: Ronen Arad <ronen.arad@intel.com> Applied, thanks. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation 2015-10-14 5:58 [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation Ronen Arad ` (4 preceding siblings ...) 2015-10-14 15:51 ` [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation Ronen Arad @ 2015-10-15 1:44 ` David Miller 2015-10-15 1:32 ` Arad, Ronen 5 siblings, 1 reply; 17+ messages in thread From: David Miller @ 2015-10-15 1:44 UTC (permalink / raw) To: ronen.arad; +Cc: netdev From: Ronen Arad <ronen.arad@intel.com> Date: Tue, 13 Oct 2015 22:58:30 -0700 > if_nlmsg_size() overestimates the minimum allocation size of netlink dump > request (when called from rtnl_calcit()) or the size of the message (when called > from rtnl_getlink()). This is because ext_filter_mask is not supported by > rtnl_link_get_af_size() and rtnl_link_get_size(). > > The over-estimation is significant when at least one netdev has many VLANs > configured (8 bytes for each configured VLAN). > > This patch-set "rightsizes" the protocol specific attribute size calculation by > propagating ext_filter_mask to rtnl_link_get_af_size() and adding optional > filtering aware get_af_size_filtered op in struct rtnl_af_ops. Bridge module, > which already used filtering aware sizing for notification, is enhanced to do > the same for netlink dump requests. There are only three implementations of get_link_af_size, so please just simply change it's signature by adding the ext_filter_mask parameter instead of creating a completely new operation. ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation 2015-10-15 1:44 ` [PATCH net-next 0/4] " David Miller @ 2015-10-15 1:32 ` Arad, Ronen 0 siblings, 0 replies; 17+ messages in thread From: Arad, Ronen @ 2015-10-15 1:32 UTC (permalink / raw) To: David Miller; +Cc: netdev >-----Original Message----- >From: David Miller [mailto:davem@davemloft.net] >Sent: Wednesday, October 14, 2015 6:44 PM >To: Arad, Ronen >Cc: netdev@vger.kernel.org >Subject: Re: [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation > >From: Ronen Arad <ronen.arad@intel.com> >Date: Tue, 13 Oct 2015 22:58:30 -0700 > >> if_nlmsg_size() overestimates the minimum allocation size of netlink dump >> request (when called from rtnl_calcit()) or the size of the message (when >called >> from rtnl_getlink()). This is because ext_filter_mask is not supported by >> rtnl_link_get_af_size() and rtnl_link_get_size(). >> >> The over-estimation is significant when at least one netdev has many VLANs >> configured (8 bytes for each configured VLAN). >> >> This patch-set "rightsizes" the protocol specific attribute size calculation >by >> propagating ext_filter_mask to rtnl_link_get_af_size() and adding optional >> filtering aware get_af_size_filtered op in struct rtnl_af_ops. Bridge >module, >> which already used filtering aware sizing for notification, is enhanced to >do >> the same for netlink dump requests. > >There are only three implementations of get_link_af_size, so please just >simply >change it's signature by adding the ext_filter_mask parameter instead of >creating >a completely new operation. [@Ronen] I've already submitted a V2 that does that in a simplified single part patch. ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2015-10-22 1:59 UTC | newest] Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-10-14 5:58 [PATCH net-next 0/4] Rightsize IFLA_AF_SPEC size calculation Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 1/4] rtnetlink: Add get_link_af_size_filtered to rtnl_af_ops Ronen Arad 2015-10-14 9:55 ` Jiri Benc 2015-10-14 14:46 ` Arad, Ronen 2015-10-14 5:58 ` [PATCH net-next 2/4] bridge: br_af_ops add br_get_link_af_size_filtered Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 3/4] rtnetlink: Prefer filtering-aware af sizing Ronen Arad 2015-10-14 5:58 ` [PATCH net-next 4/4] bridge: Remove br_get_link_af_size Ronen Arad 2015-10-14 15:51 ` [PATCH net-next v2] netlink: Rightsize IFLA_AF_SPEC size calculation Ronen Arad 2015-10-15 2:24 ` David Miller 2015-10-15 5:52 ` Arad, Ronen 2015-10-15 5:50 ` [PATCH net-next v3] " Ronen Arad 2015-10-15 13:02 ` David Miller 2015-10-19 16:23 ` Ronen Arad 2015-10-21 6:31 ` Samudrala, Sridhar 2015-10-22 2:15 ` David Miller 2015-10-15 1:44 ` [PATCH net-next 0/4] " David Miller 2015-10-15 1:32 ` Arad, Ronen
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.