On 5/30/19 8:41 AM, Ming Lei wrote:
On Wed, May 29, 2019 at 03:28:39PM +0200, Hannes Reinecke wrote:
Add helper functions to retrieve SCSI commands from the reserved
tag pool.
Signed-off-by: Hannes Reinecke <hare@xxxxxxxx>
---
include/scsi/scsi_tcq.h | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h
index 6053d46e794e..227f3bd4e974 100644
--- a/include/scsi/scsi_tcq.h
+++ b/include/scsi/scsi_tcq.h
@@ -39,5 +39,27 @@ static inline struct scsi_cmnd *scsi_host_find_tag(struct Scsi_Host *shost,
return blk_mq_rq_to_pdu(req);
}
+static inline struct scsi_cmnd *scsi_get_reserved_cmd(struct scsi_device *sdev)
+{
+ struct request *rq;
+ struct scsi_cmnd *scmd;
+
+ rq = blk_mq_alloc_request(sdev->request_queue,
+ REQ_OP_SCSI_OUT | REQ_NOWAIT,
+ BLK_MQ_REQ_RESERVED);
+ if (IS_ERR(rq))
+ return NULL;
+ scmd = blk_mq_rq_to_pdu(rq);
+ scmd->request = rq;
+ return scmd;
+}
Now all these internal commands won't share tags with IO requests,
however, your patch switches to reserve slots for internal
commands.
Yes.
This way may have performance effect on IO workloads given the
reserved tags can't be used by IO at all.
Not really. Basically all drivers which have to use tags to send
internal commands already set some tags aside to handle internal
commands. So all this patchset does is to formalize this behaviour by
using private tags.
Some drivers (like fnic or snic) does _not_ do this currently; for those
I've set one command aside to handle command abort etc.
Just wondering why not use an new tagset for internal commands?
Because it doesn't help.
All of these drivers have a common tag pool internally, which every
single command is required to use. So using a new tagset doesn't help
here; you just would need to split the (hardware) tag pool with no real
gain.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare@xxxxxxx +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)