• Roland Dreier's avatar
    cxgb3: Keep LRO off if disabled when interface is down · 47fd23fe
    Roland Dreier authored
    I have a system with a Chelsio adapter (driven by cxgb3) whose ports are
    part of a Linux bridge.  Recently I updated the kernel and discovered
    that things stopped working because cxgb3 was doing LRO on packets that
    were passed into the bridge code for forwarding.  (Incidentally, this
    problem manifested itself in a strange way that made debugging a bit
    interesting -- for some reason, the skb_warn_if_lro() check in bridge
    didn't trigger and these LROed packets were forwarded out a forcedeth
    interface, and caused the forcedeth transmit path to get stuck)
    
    This is because cxgb3 has no way of keeping state for the LRO flag until
    the interface is brought up, so if the bridging code disables LRO while
    the interface is down, then cxgb3_up() will just reenable LRO, and on my
    Debian system at least, the init scripts add interfaces to a bridge
    before bringing the interfaces up.
    
    Fix this by keeping track of each interface's LRO state in cxgb3 so that
    when bridge disables LRO, it stays disabled in cxgb3_up() when the
    interface is brought up.  I did this by changing the rx_csum_offload
    flag into a pair of bit flags; the effect of this on the rx_eth() fast
    path is miniscule enough that it should be fine (eg on x86, a cmpb
    instruction becomes a testb instruction).
    Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    47fd23fe
sge.c 90.7 KB