• James Smart's avatar
    nvmet_fc: prevent new io rqsts in possible isr completions · 9d625f77
    James Smart authored
    When a bio completion calls back into the transport for a
    back-end io device, the request completion path can free
    the transport io job structure allowing it to be reused for
    other operations. The transport has a defer_rcv queue which
    holds temporary cmd rcv ops while waitng for io job structures.
    when the job frees, if there's a cmd waiting, it is picked up
    and submitted for processing, which can call back out to the
    bio path if it's a read.  Unfortunately, what is unknown is the
    context of the original bio done call, and it may be in a state
    (softirq) that is not compatible with submitting the new bio in
    the same calling sequence. This is especially true when using
    scsi back-end devices as scsi is in softirq when it makes the
    done call.
    
    Correct by scheduling the io to be started via workq rather
    than calling the start new io path inline to the original bio
    done path.
    Signed-off-by: default avatarJames Smart <james.smart@broadcom.com>
    Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    9d625f77
fc.c 67 KB