Re: [PATCH] scsi: core: run queue in case of IO queueing failure

Bart Van Assche
2020-07-18T20:22:32Z

On 2020-07-08 06:14, Ming Lei wrote:
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 534b85e87c80..4d7fab9e8af9 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -1694,6 +1694,16 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
> */
> if (req->rq_flags & RQF_DONTPREP)
> scsi_mq_uninit_cmd(cmd);
> +
> + /*
> + * Requests may be held in block layer queue because of
> + * resource contention. We usually run queue in normal
> + * completion for queuing these requests again. Block layer
> + * will finish this failed request simply, run queue in case
> + * of IO queueing failure so that requests can get chance to
> + * be finished.
> + */
> + scsi_run_queue(q);
> break;
> }
> return ret;

So this patch causes blk_mq_run_hw_queues() to be called synchronously
from inside blk_mq_run_hw_queues()? Wouldn't it be better to avoid such
recursion and to run the queue asynchronously instead of synchronously
from inside scsi_queue_rq()? The following code already exists in
scsi_end_request():

blk_mq_run_hw_queues(q, true);

Thanks,

Bart.