• Or Gerlitz's avatar
    IPoIB: Don't drop multicast sends when they can be queued · b3e2749b
    Or Gerlitz authored
    When set_multicast_list() is called the multicast task is restarted
    and the IPOIB_MCAST_STARTED bit is cleared.  As a result for some
    window of time, multicast packets are not transmitted nor queued but
    rather dropped by ipoib_mcast_send().  These dropped packets are
    painful in two cases:
    
     - bonding fail-over which both calls set_multicast_list() on the new
       active slave and sends Gratuitous ARP through that slave.
    
     - IP_DROP_MEMBERSHIP code which both calls set_multicast_list() on the
       device and issues IGMP leave.
    
    In both these cases, depending on the scheduling of the IPoIB
    multicast task, the packets would be dropped.  As a result, in the
    bonding case, the failover would not be detected by the peers until
    their neighbour is renewed the neighbour (which takes a few tens of
    seconds).  In the IGMP case, the IP router doesn't get an IGMP leave
    and would only learn on that from further probes on the group (also a
    delay of at least a few tens of seconds).
    
    Fix this by allowing transmission (or queuing) depending on the
    IPOIB_FLAG_OPER_UP flag instead of the IPOIB_MCAST_STARTED flag.
    Signed-off-by: default avatarOlga Shern <olgas@voltaire.com>
    Signed-off-by: default avatarOr Gerlitz <ogerlitz@voltaire.com>
    Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
    b3e2749b
ipoib_multicast.c 24.6 KB