• Mike Marciniszyn's avatar
    IB/qib: Fix QP locate/remove race · bcc9b67a
    Mike Marciniszyn authored
    remove_qp() can execute concurrently with a qib_lookup_qpn() on
    another CPU, which in of itself, is ok, given the RCU locking.
    
    The issue is that remove_qp() NULLs out the qp->next field so that a
    qib_lookup_qpn() might fail to find a qp if it occurs after the one
    that is being deleted.  This is a momentary issue and subsequent
    qib_lookup_qpn() calls would find the qp's since the search restarts
    from the bucket head.  At scale, the issue might causes dropped
    packets and unnecessary retransmissions.
    
    The fix just deletes the qp->next NULL assignment to prevent the
    remove_qp() from hiding qp's from qib_lookup_qpn().
    Reviewed-by: default avatarDean Luick <dean.luick@intel.com>
    Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    bcc9b67a
qib_qp.c 31.9 KB