On Fri, 2018-04-20 at 14:57 +0800, Ming Lei wrote: > +struct scsi_host_mq_in_flight { > + int cnt; > +}; > + > +static void scsi_host_check_in_flight(struct request *rq, void *data, > + bool reserved) > +{ > + struct scsi_host_mq_in_flight *in_flight = data; > + > + if (blk_mq_request_started(rq)) > + in_flight->cnt++; > +} > + > /** > * scsi_host_busy - Return the host busy counter > * @shost: Pointer to Scsi_Host to inc. > **/ > int scsi_host_busy(struct Scsi_Host *shost) > { > - return atomic_read(&shost->host_busy); > + struct scsi_host_mq_in_flight in_flight = { > + .cnt = 0, > + }; > + > + if (!shost->use_blk_mq) > + return atomic_read(&shost->host_busy); > + > + blk_mq_tagset_busy_iter(&shost->tag_set, scsi_host_check_in_flight, > + &in_flight); > + return in_flight.cnt; > } > EXPORT_SYMBOL(scsi_host_busy); This patch introduces a subtle behavior change that has not been explained in the commit message. If a SCSI request gets requeued that results in a decrease of the .host_busy counter by scsi_device_unbusy() before the request is requeued and an increase of the host_busy counter when scsi_queue_rq() is called again. During that time such requests have the state MQ_RQ_COMPLETE and hence blk_mq_request_started() will return true and scsi_host_check_in_flight() will include these requests. In other words, this patch introduces a subtle behavior change that has not been explained in the commit message. Hence I'm doubt that this change is correct. Bart.