• Mike Marciniszyn's avatar
    IB/hfi1: Fix defered ack race with qp destroy · 72f53af2
    Mike Marciniszyn authored
    There is a a bug in defered ack stuff that causes a race with the
    destroy of a QP.
    
    A packet causes a defered ack to be pended by putting the QP
    into an rcd queue.
    
    A return from the driver interrupt processing will process that rcd
    queue of QPs and attempt to do a direct send of the ack.   At this
    point no locks are held and the above QP could now be put in the reset
    state in the qp destroy logic.   A refcount protects the QP while it
    is in the rcd queue so it isn't going anywhere yet.
    
    If the direct send fails to allocate a pio buffer,
    hfi1_schedule_send() is called to trigger sending an ack from the
    send engine. There is no state test in that code path.
    
    The refcount is then dropped from the driver.c caller
    potentially allowing the qp destroy to continue from its
    refcount wait in parallel with the workqueue scheduling of the qp.
    
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
    72f53af2
rc.c 68.8 KB