• James Smart's avatar
    scsi: lpfc: Correct upcalling nvmet_fc transport during io done downcall · 472e146d
    James Smart authored
    When the transport calls into the lpfc target to release an IO job
    structure, which corresponds to an exchange, and if the driver was waiting
    for an exchange in order to post a previously received command to the
    transport, the driver immediately takes the IO job and reuses the context
    for the prior command and calls nvmet_fc_rcv_fcp_req() to tell the
    transport about a newly received command.
    
    Problem is, the execution of the IO job release may be in the context of
    the back end driver and its bio completion handlers, thus it may be in a
    irq context and protection code kicks in in the bio and request layers that
    are subsequently called.
    
    Rework lpfc so that instead of immediately upcalling, queue it to a
    deferred work thread and have the thread make the upcall.
    
    Took advantage of this change to remove duplicated code with the normal
    command receive path that preps the IO job and upcalls nvmet_fc. Created a
    common routine both paths use.
    
    Also corrected some errors that were found during review of the context
    freeing and reuse - basically unlocked operations and a somewhat disjoint
    set of calls to release associated job elements. Cleaned up this path and
    added locks for coherency.
    Signed-off-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    472e146d
lpfc.h 42.6 KB