Skip to content

Commit 48dec8d

Browse files
Thomas Bogendoerferkuba-moo
authored andcommitted
bonding: only set speed/duplex to unknown, if getting speed failed
bond_update_speed_duplex() first set speed/duplex to unknown and then asks slave driver for current speed/duplex. Since getting speed/duplex might take longer there is a race, where this false state is visible by /proc/net/bonding. With commit 691b2bf ("bonding: update port speed when getting bond speed") this race gets more visible, if user space is calling ethtool on a regular base. Fix this by only setting speed/duplex to unknown, if link speed is really unknown/unusable. Fixes: 98f41f6 ("bonding:update speed/duplex for NETDEV_CHANGE") Signed-off-by: Thomas Bogendoerfer <[email protected]> Acked-by: Jay Vosburgh <[email protected]> Reviewed-by: Nikolay Aleksandrov <[email protected]> Reviewed-by: Hangbin Liu <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 2d2d574 commit 48dec8d

1 file changed

Lines changed: 9 additions & 6 deletions

File tree

drivers/net/bonding/bond_main.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -791,26 +791,29 @@ static int bond_update_speed_duplex(struct slave *slave)
791791
struct ethtool_link_ksettings ecmd;
792792
int res;
793793

794-
slave->speed = SPEED_UNKNOWN;
795-
slave->duplex = DUPLEX_UNKNOWN;
796-
797794
res = __ethtool_get_link_ksettings(slave_dev, &ecmd);
798795
if (res < 0)
799-
return 1;
796+
goto speed_duplex_unknown;
800797
if (ecmd.base.speed == 0 || ecmd.base.speed == ((__u32)-1))
801-
return 1;
798+
goto speed_duplex_unknown;
802799
switch (ecmd.base.duplex) {
803800
case DUPLEX_FULL:
804801
case DUPLEX_HALF:
805802
break;
806803
default:
807-
return 1;
804+
goto speed_duplex_unknown;
808805
}
809806

810807
slave->speed = ecmd.base.speed;
811808
slave->duplex = ecmd.base.duplex;
812809

813810
return 0;
811+
812+
speed_duplex_unknown:
813+
slave->speed = SPEED_UNKNOWN;
814+
slave->duplex = DUPLEX_UNKNOWN;
815+
816+
return 1;
814817
}
815818

816819
const char *bond_slave_link_status(s8 link)

0 commit comments

Comments
 (0)