• M
    IPoIB: Report operstate consistently when brought up without a link · 437708c4
    Michal Schmidt 提交于
    After booting without a working link, "ip link" shows:
    
     5: mlx4_ib1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 2044 qdisc pfifo_fast
     state DOWN qlen 256
        ...
     7: mlx4_ib1.8003@mlx4_ib1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 2044 qdisc
     pfifo_fast state DOWN qlen 256
        ...
    
    Then after connecting and disconnecting the link, which should result
    in exactly the same state as before, it shows:
    
     5: mlx4_ib1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 2044 qdisc pfifo_fast
     state DOWN qlen 256
        ...
     7: mlx4_ib1.8003@mlx4_ib1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 2044 qdisc
     pfifo_fast state LOWERLAYERDOWN qlen 256
        ...
    
    Notice the (now correct) LOWERLAYERDOWN operstate shown for the
    mlx4_ib1.8003 interface. Ideally the identical state would be shown
    right after boot.
    
    The problem is related to the calling of netif_carrier_off() in
    network drivers.  For a long time it was known that doing
    netif_carrier_off() before registering the netdevice would result in
    the interface's operstate being shown as UNKNOWN if the device was
    brought up without a working link. This problem was fixed in commit
    8f4cccbb ('net: Set device operstate at registration time'), but
    still there remains the minor inconsistency demonstrated above.
    
    This patch fixes it by moving ipoib's call to netif_carrier_off() into
    the .ndo_open method, which is where network drivers ordinarily do it.
    With the patch when doing the same test as above, the operstate of
    mlx4_ib1.8003 is shown as LOWERLAYERDOWN right after boot.
    Signed-off-by: NMichal Schmidt <mschmidt@redhat.com>
    Acked-by: NErez Shitrit <erezsh@mellanox.com>
    Signed-off-by: NRoland Dreier <roland@purestorage.com>
    437708c4
ipoib_main.c 43.8 KB