• Roland Dreier's avatar
    IPoIB: Call skb_dst_drop() once skb is enqueued for sending · b13912bb
    Roland Dreier authored
    Currently, IPoIB delays collecting send completions for TX packets in
    order to batch work more efficiently.  It does skb_orphan() right after
    queuing the packets so that destructors run early, to avoid problems
    like holding socket send buffers for too long (since we might not
    collect a send completion until a long time after the packet is
    actually sent).
    
    However, IPoIB clears IFF_XMIT_DST_RELEASE because it actually looks
    at skb_dst() to update the PMTU when it gets a too-long packet.  This
    means that the packets sitting in the TX ring with uncollected send
    completions are holding a reference on the dst.  We've seen this lead
    to pathological behavior with respect to route and neighbour GC.  The
    easy fix for this is to call skb_dst_drop() when we call skb_orphan().
    
    Also, give packets sent via connected mode (CM) the same skb_orphan()
    / skb_dst_drop() treatment that packets sent via datagram mode get.
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    b13912bb
ipoib_ib.c 27.4 KB