• Zach Brown's avatar
    RDS/IB: always process recv completions · d455ab64
    Zach Brown authored
    The recv refill path was leaking fragments because the recv event handler had
    marked a ring element as free without freeing its frag.  This was happening
    because it wasn't processing receives when the conn wasn't marked up or
    connecting, as can be the case if it races with rmmod.
    
    Two observations support always processing receives in the callback.
    
    First, buildup should only post receives, thus triggering recv event handler
    calls, once it has built up all the state to handle them.  Teardown should
    destroy the CQ and drain the ring before tearing down the state needed to
    process recvs.  Both appear to be true today.
    
    Second, this test was fundamentally racy.  There is nothing to stop rmmod and
    connection destruction from swooping in the moment after the conn state was
    sampled but before real receive procesing starts.
    Signed-off-by: default avatarZach Brown <zach.brown@oracle.com>
    d455ab64
ib_recv.c 29.7 KB