diff options
author | Eric Dumazet <edumazet@google.com> | 2016-03-21 12:55:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-03-21 13:35:56 -0400 |
commit | ae74f10068387bb0e64d8f1c8beac5e35c1458b1 (patch) | |
tree | facc1236f8b9a67a7f8d107cadeefa04020c07a9 /net | |
parent | c70ce028e834f8e51306217dbdbd441d851c64d3 (diff) |
bridge: update max_gso_segs and max_gso_size
It can be useful to lower max_gso_segs on NIC with very low
number of TX descriptors like bcmgenet.
However, this is defeated by bridge since it does not propagate
the lower value of max_gso_segs and max_gso_size.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Petri Gynther <pgynther@google.com>
Cc: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/bridge/br_if.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index a73df3315df9..8217aecf025b 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
@@ -437,6 +437,20 @@ int br_min_mtu(const struct net_bridge *br) | |||
437 | return mtu; | 437 | return mtu; |
438 | } | 438 | } |
439 | 439 | ||
440 | static void br_set_gso_limits(struct net_bridge *br) | ||
441 | { | ||
442 | unsigned int gso_max_size = GSO_MAX_SIZE; | ||
443 | u16 gso_max_segs = GSO_MAX_SEGS; | ||
444 | const struct net_bridge_port *p; | ||
445 | |||
446 | list_for_each_entry(p, &br->port_list, list) { | ||
447 | gso_max_size = min(gso_max_size, p->dev->gso_max_size); | ||
448 | gso_max_segs = min(gso_max_segs, p->dev->gso_max_segs); | ||
449 | } | ||
450 | br->dev->gso_max_size = gso_max_size; | ||
451 | br->dev->gso_max_segs = gso_max_segs; | ||
452 | } | ||
453 | |||
440 | /* | 454 | /* |
441 | * Recomputes features using slave's features | 455 | * Recomputes features using slave's features |
442 | */ | 456 | */ |
@@ -564,6 +578,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev) | |||
564 | call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); | 578 | call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); |
565 | 579 | ||
566 | dev_set_mtu(br->dev, br_min_mtu(br)); | 580 | dev_set_mtu(br->dev, br_min_mtu(br)); |
581 | br_set_gso_limits(br); | ||
567 | 582 | ||
568 | kobject_uevent(&p->kobj, KOBJ_ADD); | 583 | kobject_uevent(&p->kobj, KOBJ_ADD); |
569 | 584 | ||
@@ -610,6 +625,7 @@ int br_del_if(struct net_bridge *br, struct net_device *dev) | |||
610 | del_nbp(p); | 625 | del_nbp(p); |
611 | 626 | ||
612 | dev_set_mtu(br->dev, br_min_mtu(br)); | 627 | dev_set_mtu(br->dev, br_min_mtu(br)); |
628 | br_set_gso_limits(br); | ||
613 | 629 | ||
614 | spin_lock_bh(&br->lock); | 630 | spin_lock_bh(&br->lock); |
615 | changed_addr = br_stp_recalculate_bridge_id(br); | 631 | changed_addr = br_stp_recalculate_bridge_id(br); |