* [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
* [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
* 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 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 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
* 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 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
* [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 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
* 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
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.