mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 02:12:00 -04:00
Merge branch 'veth-and-GSO-maximums'
Stephen Hemminger says: ==================== veth and GSO maximums This is the more general way to solving the issue of GSO limits not being set correctly for containers on Azure. If a GSO packet is sent to host that exceeds the limit (reported by NDIS), then the host is forced to do segmentation in software which has noticeable performance impact. The core rtnetlink infrastructure already has the messages and infrastructure to allow changing gso limits. With an updated iproute2 the following already works: # ip li set dev dummy0 gso_max_size 30000 These patches are about making it easier with veth. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -410,6 +410,9 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
||||
if (ifmp && (dev->ifindex != 0))
|
||||
peer->ifindex = ifmp->ifi_index;
|
||||
|
||||
peer->gso_max_size = dev->gso_max_size;
|
||||
peer->gso_max_segs = dev->gso_max_segs;
|
||||
|
||||
err = register_netdevice(peer);
|
||||
put_net(net);
|
||||
net = NULL;
|
||||
|
||||
@@ -1637,6 +1637,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = {
|
||||
[IFLA_PROMISCUITY] = { .type = NLA_U32 },
|
||||
[IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 },
|
||||
[IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 },
|
||||
[IFLA_GSO_MAX_SEGS] = { .type = NLA_U32 },
|
||||
[IFLA_GSO_MAX_SIZE] = { .type = NLA_U32 },
|
||||
[IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
|
||||
[IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */
|
||||
[IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
|
||||
@@ -2287,6 +2289,34 @@ static int do_setlink(const struct sk_buff *skb,
|
||||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_GSO_MAX_SIZE]) {
|
||||
u32 max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]);
|
||||
|
||||
if (max_size > GSO_MAX_SIZE) {
|
||||
err = -EINVAL;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
if (dev->gso_max_size ^ max_size) {
|
||||
netif_set_gso_max_size(dev, max_size);
|
||||
status |= DO_SETLINK_MODIFIED;
|
||||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_GSO_MAX_SEGS]) {
|
||||
u32 max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]);
|
||||
|
||||
if (max_segs > GSO_MAX_SEGS) {
|
||||
err = -EINVAL;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
if (dev->gso_max_segs ^ max_segs) {
|
||||
dev->gso_max_segs = max_segs;
|
||||
status |= DO_SETLINK_MODIFIED;
|
||||
}
|
||||
}
|
||||
|
||||
if (tb[IFLA_OPERSTATE])
|
||||
set_operstate(dev, nla_get_u8(tb[IFLA_OPERSTATE]));
|
||||
|
||||
@@ -2651,6 +2681,10 @@ struct net_device *rtnl_create_link(struct net *net,
|
||||
dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
|
||||
if (tb[IFLA_GROUP])
|
||||
dev_set_group(dev, nla_get_u32(tb[IFLA_GROUP]));
|
||||
if (tb[IFLA_GSO_MAX_SIZE])
|
||||
netif_set_gso_max_size(dev, nla_get_u32(tb[IFLA_GSO_MAX_SIZE]));
|
||||
if (tb[IFLA_GSO_MAX_SEGS])
|
||||
dev->gso_max_size = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user