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.