| From foo@baz Wed May 31 09:13:34 JST 2017 |
| From: Jarod Wilson <jarod@redhat.com> |
| Date: Fri, 19 May 2017 19:43:45 -0400 |
| Subject: bonding: fix accounting of active ports in 3ad |
| |
| From: Jarod Wilson <jarod@redhat.com> |
| |
| |
| [ Upstream commit 751da2a69b7cc82d83dc310ed7606225f2d6e014 ] |
| |
| As of 7bb11dc9f59d and 0622cab0341c, bond slaves in a 3ad bond are not |
| removed from the aggregator when they are down, and the active slave count |
| is NOT equal to number of ports in the aggregator, but rather the number |
| of ports in the aggregator that are still enabled. The sysfs spew for |
| bonding_show_ad_num_ports() has a comment that says "Show number of active |
| 802.3ad ports.", but it's currently showing total number of ports, both |
| active and inactive. Remedy it by using the same logic introduced in |
| 0622cab0341c in __bond_3ad_get_active_agg_info(), so sysfs, procfs and |
| netlink all report the number of active ports. Note that this means that |
| IFLA_BOND_AD_INFO_NUM_PORTS really means NUM_ACTIVE_PORTS instead of |
| NUM_PORTS, and thus perhaps should be renamed for clarity. |
| |
| Lightly tested on a dual i40e lacp bond, simulating link downs with an ip |
| link set dev <slave2> down, was able to produce the state where I could |
| see both in the same aggregator, but a number of ports count of 1. |
| |
| MII Status: up |
| Active Aggregator Info: |
| Aggregator ID: 1 |
| Number of ports: 2 <--- |
| Slave Interface: ens10 |
| MII Status: up <--- |
| Aggregator ID: 1 |
| Slave Interface: ens11 |
| MII Status: up |
| Aggregator ID: 1 |
| |
| MII Status: up |
| Active Aggregator Info: |
| Aggregator ID: 1 |
| Number of ports: 1 <--- |
| Slave Interface: ens10 |
| MII Status: down <--- |
| Aggregator ID: 1 |
| Slave Interface: ens11 |
| MII Status: up |
| Aggregator ID: 1 |
| |
| CC: Jay Vosburgh <j.vosburgh@gmail.com> |
| CC: Veaceslav Falico <vfalico@gmail.com> |
| CC: Andy Gospodarek <andy@greyhouse.net> |
| CC: netdev@vger.kernel.org |
| Signed-off-by: Jarod Wilson <jarod@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/bonding/bond_3ad.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/net/bonding/bond_3ad.c |
| +++ b/drivers/net/bonding/bond_3ad.c |
| @@ -2573,7 +2573,7 @@ int __bond_3ad_get_active_agg_info(struc |
| return -1; |
| |
| ad_info->aggregator_id = aggregator->aggregator_identifier; |
| - ad_info->ports = aggregator->num_of_ports; |
| + ad_info->ports = __agg_active_ports(aggregator); |
| ad_info->actor_key = aggregator->actor_oper_aggregator_key; |
| ad_info->partner_key = aggregator->partner_oper_aggregator_key; |
| ether_addr_copy(ad_info->partner_system, |