• Jens Axboe's avatar
    scsi: remove performance regression due to async queue run · 9937a5e2
    Jens Axboe authored
    Commit c21e6beb removed our queue request_fn re-enter
    protection, and defaulted to always running the queues from
    kblockd to be safe. This was a known potential slow down,
    but should be safe.
    
    Unfortunately this is causing big performance regressions for
    some, so we need to improve this logic. Looking into the details
    of the re-enter, the real issue is on requeue of requests.
    
    Requeue of requests upon seeing a BUSY condition from the device
    ends up re-running the queue, causing traces like this:
    
    scsi_request_fn()
            scsi_dispatch_cmd()
                    scsi_queue_insert()
                            __scsi_queue_insert()
                                    scsi_run_queue()
    					scsi_request_fn()
    						...
    
    potentially causing the issue we want to avoid. So special
    case the requeue re-run of the queue, but improve it to offload
    the entire run of local queue and starved queue from a single
    workqueue callback. This is a lot better than potentially
    kicking off a workqueue run for each device seen.
    
    This also fixes the issue of the local device going into recursion,
    since the above mentioned commit never moved that queue run out
    of line.
    Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
    9937a5e2
scsi_lib.c 64.6 KB