tag handling refactor
Subsystems (47)
The current SCSI handling suffers from large amounts of duplicate code, and a general confusion of multiple concepts of tagging.
This series tries to reduce the amount of code, and introduce two separate clear concepts of tagging:
a) a driver can request block-level tagging to always have a valid index assigned to cmd->request->tag by the block layer. This is already automatically done for the blk-mq case, but this gives the optional legacy request taggign similar semantics.
b) the concept of a SCSI "tagged command" is now entirely separate from providing an actual tag, and always provided in a flag in the SCSI command. The driver does not need to opt-in this information, but it doesn't have to use it.
While this series removes 750 lines of code and provides a much cleaner driver API it also opens up new questions:
- how is the change_queue_type API supposed to be used for most drivers? It only changes the tag type from none to simple or back, but except for the special implementation in the 53c700 driver doesn't change the queue depth, which might cause it to issue multiple non-tagged command. Fortunately most drivers never look at this information, but then again changing the queue type is useless to start with.
- for those drivers looking at the command tagged information we'd need to quiesce the LUN. No driver but the 53c700 driver does that, and the 53c700 does it at a target-level, which despite a comment claiming it's needed doesn't seem to make sense given the code. If we can make sure to quience all LUNs we could avoid the per-command flag for tagged commands and always look at the scsi_device flag.
- similarly, do we need any synchronization when answering a tag message reject?
- queue ramp down may drop to untagged mode, but queue ramp up never reverseѕ that.
- the ->tagged_supported and ->simple_tags flags are bit-fields without clear locking protection. We probably want to move these and similar fields to a proper atomic bit flags member.
- should the MSG_*_TAG fields move to the SPI transport class? That's where they are defined, and besides SPI drivers they are only (ab)used by the target code now.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 1/11 scsi: provide a generic change_queue_type method
Most drivers use exactly the same implementation, so provide it as a library function.
--- drivers/infiniband/ulp/srp/ib_srp.c | 24 +----------------------- drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 2 +- drivers/scsi/esas2r/esas2r.h | 1 - drivers/scsi/esas2r/esas2r_main.c | 20 +------------------- drivers/scsi/fcoe/fcoe.c | 2 +- drivers/scsi/fnic/fnic_main.c | 2 +- drivers/scsi/ibmvscsi/ibmvfc.c | 25 +------------------------ drivers/scsi/ipr.c | 20 +++----------------- drivers/scsi/libfc/fc_fcp.c | 20 -------------------- drivers/scsi/lpfc/lpfc_scsi.c | 24 ++---------------------- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 24 +----------------------- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 25 +------------------------ drivers/scsi/pmcraid.c | 14 ++++---------- drivers/scsi/qla2xxx/qla_os.c | 18 +----------------- drivers/scsi/scsi.c | 20 ++++++++++++++++++++ drivers/scsi/scsi_debug.c | 9 +-------- drivers/target/loopback/tcm_loop.c | 17 +---------------- include/scsi/libfc.h | 1 - include/scsi/scsi_tcq.h | 2 ++ 19 files changed, 42 insertions(+), 228 deletions(-)
drivers/infiniband/ulp/srp/ib_srp.c +1 -23
@@ -2259,28 +2259,6 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) }/** -* srp_change_queue_type - changing device queue tag type -* @sdev: scsi device struct -* @tag_type: requested tag type -* -* Returns queue tag type. -*/ -static int -srp_change_queue_type (struct scsi_device *sdev,int tag_type) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - -return tag_type; -} - -/** * srp_change_queue_depth - setting device queue depth * @sdev: scsi device struct * @qdepth: requested queue depth
@@ -2600,7 +2578,7 @@ static struct scsi_host_template srp_template = { .info = srp_target_info, .queuecommand = srp_queuecommand, .change_queue_depth = srp_change_queue_depth, - .change_queue_type = srp_change_queue_type, + .change_queue_type = scsi_change_queue_type, .eh_abort_handler = srp_abort, .eh_device_reset_handler = srp_reset_device, .eh_host_reset_handler = srp_reset_host,
drivers/scsi/bnx2fc/bnx2fc_fcoe.c +1 -1
@@ -2784,7 +2784,7 @@ static struct scsi_host_template bnx2fc_shost_template = { .eh_host_reset_handler = fc_eh_host_reset, .slave_alloc = fc_slave_alloc, .change_queue_depth = fc_change_queue_depth, - .change_queue_type = fc_change_queue_type, + .change_queue_type = scsi_change_queue_type, .this_id = -1, .cmd_per_lun = 3, .use_clustering = ENABLE_CLUSTERING,
drivers/scsi/esas2r/esas2r.h +0 -1
@@ -976,7 +976,6 @@ int esas2r_slave_alloc(struct scsi_device *dev);int esas2r_slave_configure (struct scsi_device *dev);void esas2r_slave_destroy (struct scsi_device *dev);int esas2r_change_queue_depth (struct scsi_device *dev,int depth,int reason); -int esas2r_change_queue_type (struct scsi_device *dev,int type);long esas2r_proc_ioctl (struct file *fp,unsigned int cmd,unsigned long arg);/* SCSI error handler (eh) functions */
drivers/scsi/esas2r/esas2r_main.c +1 -19
@@ -258,7 +258,7 @@ static struct scsi_host_template driver_template = { .slave_alloc = esas2r_slave_alloc, .slave_destroy = esas2r_slave_destroy, .change_queue_depth = esas2r_change_queue_depth, - .change_queue_type = esas2r_change_queue_type, + .change_queue_type = scsi_change_queue_type, .max_sectors = 0xFFFF, };
@@ -1268,24 +1268,6 @@ int esas2r_change_queue_depth(struct scsi_device *dev, int depth, int reason)return dev->queue_depth; } -int esas2r_change_queue_type (struct scsi_device *dev,int type) -{ -esas2r_log (ESAS2R_LOG_INFO ,"change_queue_type %p, %d" , dev, type); - -if (dev->tagged_supported) { -scsi_set_tag_type (dev, type); - -if (type) -scsi_activate_tcq (dev, dev->queue_depth); -else -scsi_deactivate_tcq (dev, dev->queue_depth); - }else { - type =0 ; - } - -return type; -} -int esas2r_slave_alloc (struct scsi_device *dev) {return 0 ;
drivers/scsi/fcoe/fcoe.c +1 -1
@@ -281,7 +281,7 @@ static struct scsi_host_template fcoe_shost_template = { .eh_host_reset_handler = fc_eh_host_reset, .slave_alloc = fc_slave_alloc, .change_queue_depth = fc_change_queue_depth, - .change_queue_type = fc_change_queue_type, + .change_queue_type = scsi_change_queue_type, .this_id = -1, .cmd_per_lun = 3, .can_queue = FCOE_MAX_OUTSTANDING_COMMANDS,
drivers/scsi/fnic/fnic_main.c +1 -1
@@ -113,7 +113,7 @@ static struct scsi_host_template fnic_host_template = { .eh_host_reset_handler = fnic_host_reset, .slave_alloc = fnic_slave_alloc, .change_queue_depth = fc_change_queue_depth, - .change_queue_type = fc_change_queue_type, + .change_queue_type = scsi_change_queue_type, .this_id = -1, .cmd_per_lun = 3, .can_queue = FNIC_DFLT_IO_REQ,
drivers/scsi/ibmvscsi/ibmvfc.c +1 -24
@@ -2929,29 +2929,6 @@ static int ibmvfc_change_queue_depth(struct scsi_device *sdev, int qdepth,return sdev->queue_depth; } -/** -* ibmvfc_change_queue_type - Change the device's queue type -* @sdev: scsi device struct -* @tag_type: type of tags to use -* -* Return value: -* actual queue type set -**/ -static int ibmvfc_change_queue_type (struct scsi_device *sdev,int tag_type) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); - -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - -return tag_type; -} -static ssize_t ibmvfc_show_host_partition_name (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -3133,7 +3110,7 @@ static struct scsi_host_template driver_template = { .target_alloc = ibmvfc_target_alloc, .scan_finished = ibmvfc_scan_finished, .change_queue_depth = ibmvfc_change_queue_depth, - .change_queue_type = ibmvfc_change_queue_type, + .change_queue_type = scsi_change_queue_type, .cmd_per_lun = 16, .can_queue = IBMVFC_MAX_REQUESTS_DEFAULT, .this_id = -1,
drivers/scsi/ipr.c +3 -17
@@ -4368,24 +4368,10 @@ static int ipr_change_queue_type(struct scsi_device *sdev, int tag_type)spin_lock_irqsave (ioa_cfg->host->host_lock, lock_flags); res = (struct ipr_resource_entry *)sdev->hostdata; - -if (res) { -if (ipr_is_gscsi (res) && sdev->tagged_supported) { -/* -* We don't bother quiescing the device here since the -* adapter firmware does it for us. -*/ -scsi_set_tag_type (sdev, tag_type); - -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - }else +if (res &&ipr_is_gscsi (res)) + tag_type =scsi_change_queue_type (sdev, tag_type); +else tag_type =0 ; -spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags);return tag_type; }
drivers/scsi/libfc/fc_fcp.c +0 -20
@@ -2196,26 +2196,6 @@ int fc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)EXPORT_SYMBOL (fc_change_queue_depth);/** -* fc_change_queue_type() - Change a device's queue type -* @sdev: The SCSI device whose queue depth is to change -* @tag_type: Identifier for queue type -*/ -int fc_change_queue_type (struct scsi_device *sdev,int tag_type) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - -return tag_type; -} -EXPORT_SYMBOL (fc_change_queue_type); - -/** * fc_fcp_destory() - Tear down the FCP layer for a given local port * @lport: The local port that no longer needs the FCP layer */
drivers/scsi/lpfc/lpfc_scsi.c +2 -22
@@ -345,26 +345,6 @@ lpfc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) }/** -* lpfc_change_queue_type() - Change a device's scsi tag queuing type -* @sdev: Pointer the scsi device whose queue depth is to change -* @tag_type: Identifier for queue tag type -*/ -static int -lpfc_change_queue_type (struct scsi_device *sdev,int tag_type) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - -return tag_type; -} - -/** * lpfc_rampdown_queue_depth - Post RAMP_DOWN_QUEUE event to worker thread * @phba: The Hba for which this call is being executed. *
@@ -6019,7 +5999,7 @@ struct scsi_host_template lpfc_template = { .max_sectors = 0xFFFF, .vendor_id = LPFC_NL_VENDOR_ID, .change_queue_depth = lpfc_change_queue_depth, - .change_queue_type = lpfc_change_queue_type, + .change_queue_type = scsi_change_queue_type, };struct scsi_host_template lpfc_vport_template = {
@@ -6042,5 +6022,5 @@ struct scsi_host_template lpfc_vport_template = { .shost_attrs = lpfc_vport_attrs, .max_sectors = 0xFFFF, .change_queue_depth = lpfc_change_queue_depth, - .change_queue_type = lpfc_change_queue_type, + .change_queue_type = scsi_change_queue_type, };
drivers/scsi/mpt2sas/mpt2sas_scsih.c +1 -23
@@ -1255,28 +1255,6 @@ _scsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) }/** -* _scsih_change_queue_type - changing device queue tag type -* @sdev: scsi device struct -* @tag_type: requested tag type -* -* Returns queue tag type. -*/ -static int -_scsih_change_queue_type (struct scsi_device *sdev,int tag_type) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - -return tag_type; -} - -/** * _scsih_target_alloc - target add routine * @starget: scsi target struct *
@@ -7653,7 +7631,7 @@ static struct scsi_host_template scsih_driver_template = { .scan_finished = _scsih_scan_finished, .scan_start = _scsih_scan_start, .change_queue_depth = _scsih_change_queue_depth, - .change_queue_type = _scsih_change_queue_type, + .change_queue_type = scsi_change_queue_type, .eh_abort_handler = _scsih_abort, .eh_device_reset_handler = _scsih_dev_reset, .eh_target_reset_handler = _scsih_target_reset,
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -24
@@ -1123,29 +1123,6 @@ _scsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) }/** -* _scsih_change_queue_type - changing device queue tag type -* @sdev: scsi device struct -* @tag_type: requested tag type -* -* Returns queue tag type. -*/ -static int -_scsih_change_queue_type (struct scsi_device *sdev,int tag_type) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - -return tag_type; -} - - -/** * _scsih_target_alloc - target add routine * @starget: scsi target struct *
@@ -7284,7 +7261,7 @@ static struct scsi_host_template scsih_driver_template = { .scan_finished = _scsih_scan_finished, .scan_start = _scsih_scan_start, .change_queue_depth = _scsih_change_queue_depth, - .change_queue_type = _scsih_change_queue_type, + .change_queue_type = scsi_change_queue_type, .eh_abort_handler = _scsih_abort, .eh_device_reset_handler = _scsih_dev_reset, .eh_target_reset_handler = _scsih_target_reset,
drivers/scsi/pmcraid.c +4 -10
@@ -321,16 +321,10 @@ static int pmcraid_change_queue_type(struct scsi_device *scsi_dev, int tag)struct pmcraid_resource_entry *res; res = (struct pmcraid_resource_entry *)scsi_dev->hostdata; - -if ((res) && scsi_dev->tagged_supported && - (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) { -scsi_set_tag_type (scsi_dev, tag); - -if (tag) -scsi_activate_tcq (scsi_dev, scsi_dev->queue_depth); -else -scsi_deactivate_tcq (scsi_dev, scsi_dev->queue_depth); - }else +if (res && scsi_dev->tagged_supported && + (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) + tag =scsi_change_queue_type (scsi_dev, tag); +else tag =0 ;return tag;
drivers/scsi/qla2xxx/qla_os.c +1 -17
@@ -237,7 +237,6 @@ static int qla2xxx_eh_bus_reset(struct scsi_cmnd *);static int qla2xxx_eh_host_reset (struct scsi_cmnd *);static int qla2x00_change_queue_depth (struct scsi_device *,int ,int ); -static int qla2x00_change_queue_type (struct scsi_device *,int );static void qla2x00_clear_drv_active (struct qla_hw_data *);static void qla2x00_free_device (scsi_qla_host_t *);static void qla83xx_disable_laser (scsi_qla_host_t *vha);
@@ -260,7 +259,7 @@ struct scsi_host_template qla2xxx_driver_template = { .scan_finished = qla2xxx_scan_finished, .scan_start = qla2xxx_scan_start, .change_queue_depth = qla2x00_change_queue_depth, - .change_queue_type = qla2x00_change_queue_type, + .change_queue_type = scsi_change_queue_type, .this_id = -1, .cmd_per_lun = 3, .use_clustering = ENABLE_CLUSTERING,
@@ -1473,21 +1472,6 @@ qla2x00_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)return sdev->queue_depth; } -static int -qla2x00_change_queue_type (struct scsi_device *sdev,int tag_type) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; - -return tag_type; -} -/** * qla2x00_config_dma_addressing() - Configure OS DMA addressing method. * @ha: HA context
drivers/scsi/scsi.c +20 -0
@@ -867,6 +867,26 @@ int scsi_track_queue_full(struct scsi_device *sdev, int depth)EXPORT_SYMBOL (scsi_track_queue_full);/** +* scsi_change_queue_type() - Change a device's queue type +* @sdev: The SCSI device whose queue depth is to change +* @tag_type: Identifier for queue type +*/ +int scsi_change_queue_type (struct scsi_device *sdev,int tag_type) +{ +if (sdev->tagged_supported) { +scsi_set_tag_type (sdev, tag_type); +if (tag_type) +scsi_activate_tcq (sdev, sdev->queue_depth); +else +scsi_deactivate_tcq (sdev, sdev->queue_depth); + }else + tag_type =0 ; + +return tag_type; +} +EXPORT_SYMBOL (scsi_change_queue_type); + +/** * scsi_vpd_inquiry - Request a device provide us with a VPD page * @sdev: The device to ask * @buffer: Where to put the result
drivers/scsi/scsi_debug.c +1 -8
@@ -4532,14 +4532,7 @@ sdebug_change_qdepth(struct scsi_device *sdev, int qdepth, int reason)static int sdebug_change_qtype (struct scsi_device *sdev,int qtype) { -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, qtype); -if (qtype) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - qtype =0 ; + qtype =scsi_change_queue_type (sdev, qtype);if (SCSI_DEBUG_OPT_Q_NOISE & scsi_debug_opts) {const char *cp;
drivers/target/loopback/tcm_loop.c +1 -16
@@ -135,21 +135,6 @@ static int tcm_loop_change_queue_depth(return sdev->queue_depth; } -static int tcm_loop_change_queue_type (struct scsi_device *sdev,int tag) -{ -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag); - -if (tag) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag =0 ; - -return tag; -} -/* * Locate the SAM Task Attr from struct scsi_cmnd * */
@@ -451,7 +436,7 @@ static struct scsi_host_template tcm_loop_driver_template = { .name = "TCM_Loopback", .queuecommand = tcm_loop_queuecommand, .change_queue_depth = tcm_loop_change_queue_depth, - .change_queue_type = tcm_loop_change_queue_type, + .change_queue_type = scsi_change_queue_type, .eh_abort_handler = tcm_loop_abort_task, .eh_device_reset_handler = tcm_loop_device_reset, .eh_target_reset_handler = tcm_loop_target_reset,
include/scsi/libfc.h +0 -1
@@ -1106,7 +1106,6 @@ int fc_eh_device_reset(struct scsi_cmnd *);int fc_eh_host_reset (struct scsi_cmnd *);int fc_slave_alloc (struct scsi_device *);int fc_change_queue_depth (struct scsi_device *,int qdepth,int reason); -int fc_change_queue_type (struct scsi_device *,int tag_type);/* * ELS/CT interface
include/scsi/scsi_tcq.h +2 -0
@@ -16,6 +16,8 @@#ifdef CONFIG_BLOCK +int scsi_change_queue_type (struct scsi_device *sdev,int tag_type); +/** * scsi_get_tag_type - get the type of tag the device supports * @sdev: the scsi device
Signature · 1 line
1.9.1
Re: [PATCH 01/11] scsi: provide a generic change_queue_type method
Quoted 4 lines · Christoph Hellwig
Most drivers use exactly the same implementation, so provide it as a library function.
Signed-off-by Christoph Hellwig <[email protected]>
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/11] scsi: provide a generic change_queue_type method
In reply to Christoph HellwigQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Christoph> Most drivers use exactly the same implementation, so provide Christoph> it as a library function.
Nice cleanup.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
Re: [PATCH 01/11] scsi: provide a generic change_queue_type method
In reply to Christoph HellwigQuoted 15 lines · Christoph Hellwig
drivers/scsi/pmcraid.c +0
-7@@ -321,16 +321,10 @@ static int pmcraid_change_queue_type(struct scsi_device *scsi_dev, int tag)struct pmcraid_resource_entry *res; res = (struct pmcraid_resource_entry *)scsi_dev->hostdata; - -if ((res) && scsi_dev->tagged_supported && - (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) { -scsi_set_tag_type (scsi_dev, tag); - -if (tag) -scsi_activate_tcq (scsi_dev, scsi_dev->queue_depth);
drivers/scsi/pmcraid.c static int pmcraid_change_queue_type(struct scsi_device *scsi_dev, int tag) · line 330
Quoted 10 lines
drivers/scsi/pmcraid.c +4
-3-else -scsi_deactivate_tcq (scsi_dev, scsi_dev->queue_depth); - }else +if (res && scsi_dev->tagged_supported && + (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) + tag =scsi_change_queue_type (scsi_dev, tag); +else tag =0 ;return tag;
A minor nit: do we really need to keep the scsi_dev->tagged_supported test in the above code ? Anyway,
Re: [PATCH 01/11] scsi: provide a generic change_queue_type method
Quoted 2 lines · Bart Van Assche
A minor nit: do we really need to keep the
scsi_dev->tagged_supportedtest in the above code ? Anyway,
It's not needed, but the whole function will go away later in the series.
PATCH 2/11 scsi: add new scsi-command flag for tagged commands
In reply to Christoph HellwigCurrently scsi piggy backs on the block layer to define the concept of a tagged command. But we want to be able to have block-level host-wide tags assigned even for untagged commands like the initial INQUIRY, so add a new SCSI-level flag for commands that are tagged at the scsi level, so that even commands without that set can have tags assigned to them. Note that this alredy is the case for the blk-mq code path, and this just lets the old path catch up with it.
We also set this flag based upon sdev->simple_tags instead of the block queue flag, so that it is entirely independent of the block layer tagging, and thus always correct even if a driver doesn't use block level tagging yet.
Also remove the old blk_rq_tagged; it was only used by SCSI drivers, and removing it forces them to look for the proper replacement.
--- Documentation/block/biodoc.txt | 4 ---- block/blk-core.c | 4 ++-- drivers/scsi/53c700.c | 6 +++--- drivers/scsi/aic7xxx/aic7xxx_osm.c | 2 +- drivers/scsi/scsi_lib.c | 13 +++++++++---- drivers/usb/storage/uas.c | 2 +- include/linux/blkdev.h | 1 - include/scsi/scsi_cmnd.h | 4 ++++ include/scsi/scsi_tcq.h | 6 ++---- 9 files changed, 22 insertions(+), 20 deletions(-)
Documentation/block/biodoc.txt +0 -4
@@ -827,10 +827,6 @@ but in the event of any barrier requests in the tag queue we need to ensure that requests are restarted in the order they were queue. This may happen if the driver needs to use blk_queue_invalidate_tags(). -Tagging also defines a new request flag, REQ_QUEUED. This is set whenever -a request is currently tagged. You should not use this flag directly, -blk_rq_tagged(rq) is the portable way to do so. - 3.3 I/O Submission The routine submit_bio() is used to submit a single io. Higher level i/o
block/blk-core.c +2 -2
@@ -1266,7 +1266,7 @@ void blk_requeue_request(struct request_queue *q, struct request *rq)blk_clear_rq_complete (rq);trace_block_rq_requeue (q, rq); -if (blk_rq_tagged (rq)) +if (rq->cmd_flags &REQ_QUEUED )blk_queue_end_tag (q, rq);BUG_ON (blk_queued_rq (rq));
@@ -2554,7 +2554,7 @@ EXPORT_SYMBOL_GPL(blk_unprep_request);*/ void blk_finish_request (struct request *req,int error) { -if (blk_rq_tagged (req)) +if (req->cmd_flags &REQ_QUEUED )blk_queue_end_tag (req->q, req);BUG_ON (blk_queued_rq (req));
drivers/scsi/53c700.c +3 -3
@@ -1767,7 +1767,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)*/ if (NCR_700_get_depth (SCp->device) !=0 && (!(hostdata->tag_negotiated & (1 <<scmd_id (SCp))) - || !blk_rq_tagged (SCp->request))) { + || !(SCp->flags &SCMD_TAGGED ))) {CDEBUG (KERN_ERR , SCp,"has non zero depth %d\n" ,NCR_700_get_depth (SCp->device));return SCSI_MLQUEUE_DEVICE_BUSY ;
@@ -1795,7 +1795,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)printk ("53c700: scsi%d, command " , SCp->device->host->host_no);scsi_print_command (SCp);#endif -if (blk_rq_tagged (SCp->request) +if ((SCp->flags &SCMD_TAGGED ) && (hostdata->tag_negotiated &(1 <<scmd_id (SCp))) ==0 &&NCR_700_get_tag_neg_state (SCp->device) ==NCR_700_START_TAG_NEGOTIATION ) {scmd_printk (KERN_ERR , SCp,"Enabling Tag Command Queuing\n" );
@@ -1809,7 +1809,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)* * FIXME: This will royally screw up on multiple LUN devices * */ -if (!blk_rq_tagged (SCp->request) +if (!(SCp->flags &SCMD_TAGGED ) && (hostdata->tag_negotiated &(1 <<scmd_id (SCp)))) {scmd_printk (KERN_INFO , SCp,"Disabling Tag Command Queuing\n" ); hostdata->tag_negotiated &= ~(1 <<scmd_id (SCp));
drivers/scsi/aic7xxx/aic7xxx_osm.c +1 -1
@@ -1447,7 +1447,7 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,* we are storing a full busy target *lun* * table in SCB space. */ -if (!blk_rq_tagged (cmd->request) +if (!(cmd->flags &SCMD_TAGGED ) && (ahc->features &AHC_SCB_BTT ) ==0 ) {int target_offset;
drivers/scsi/scsi_lib.c +9 -4
@@ -1740,7 +1740,7 @@ static void scsi_request_fn(struct request_queue *q)* we add the dev to the starved list so it eventually gets * a run when a tag is freed. */ -if (blk_queue_tagged (q) && !blk_rq_tagged (req)) { +if (blk_queue_tagged (q) && !(req->cmd_flags &REQ_QUEUED )) {spin_lock_irq (shost->host_lock);if (list_empty (&sdev->starved_entry)) list_add_tail(&sdev->starved_entry,
@@ -1754,6 +1754,11 @@ static void scsi_request_fn(struct request_queue *q)if (!scsi_host_queue_ready (q, shost, sdev)) goto host_not_ready; + +if (sdev->simple_tags) + cmd->flags |=SCMD_TAGGED ; +else + cmd->flags &= ~SCMD_TAGGED ;/* * Finally, initialize any error handling parameters, and set up
@@ -1908,10 +1913,10 @@ static int scsi_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req,blk_mq_start_request (req); } -if (blk_queue_tagged (q)) - req->cmd_flags |=REQ_QUEUED ; +if (sdev->simple_tags) + cmd->flags |=SCMD_TAGGED ;else - req->cmd_flags &= ~REQ_QUEUED ; + cmd->flags &= ~SCMD_TAGGED ;scsi_init_cmd_errh (cmd); cmd->scsi_done = scsi_mq_done;
drivers/usb/storage/uas.c +1 -1
@@ -181,7 +181,7 @@ static int uas_get_tag(struct scsi_cmnd *cmnd) {int tag; -if (blk_rq_tagged (cmnd->request)) +if (cmnd->flags &SCMD_TAGGED ) tag = cmnd->request->tag +2 ;else tag =1 ;
include/linux/blkdev.h +0 -1
@@ -1136,7 +1136,6 @@ static inline bool blk_needs_flush_plug(struct task_struct *tsk)/* * tag stuff */ -#define blk_rq_tagged (rq) ((rq)->cmd_flags & REQ_QUEUED)extern int blk_queue_start_tag (struct request_queue *,struct request *);extern struct request *blk_queue_find_tag (struct request_queue *,int );extern void blk_queue_end_tag (struct request_queue *,struct request *);
include/scsi/scsi_cmnd.h +4 -0
@@ -53,6 +53,9 @@ struct scsi_pointer {volatile int phase; }; +/* for scmd->flags */ +#define SCMD_TAGGED (1 << 0) +struct scsi_cmnd {struct scsi_device *device;struct list_head list;/* scsi_cmnd participates in queue lists */
@@ -132,6 +135,7 @@ struct scsi_cmnd {* to be at an address < 16Mb). */ int result;/* Status code from lower level driver */ +int flags;/* Command flags */ unsigned char tag;/* SCSI-II queued command tag */ };
include/scsi/scsi_tcq.h +2 -4
@@ -101,11 +101,9 @@ static inline void scsi_deactivate_tcq(struct scsi_device *sdev, int depth)**/ static inline int scsi_populate_tag_msg (struct scsi_cmnd *cmd,char *msg) { -struct request *req = cmd->request; - -if (blk_rq_tagged (req)) { +if (cmd->flags &SCMD_TAGGED ) { *msg++ =MSG_SIMPLE_TAG ; - *msg++ = req->tag; + *msg++ = cmd->request->tag;return 2 ; }
Signature · 1 line
1.9.1
Re: [PATCH 02/11] scsi: add new scsi-command flag for tagged commands
Quoted 189 lines · Christoph Hellwig
Currently scsi piggy backs on the block layer to define the concept of a tagged command. But we want to be able to have block-level host-wide tags assigned even for untagged commands like the initial INQUIRY, so add a new SCSI-level flag for commands that are tagged at the scsi level, so that even commands without that set can have tags assigned to them. Note that this alredy is the case for the blk-mq code path, and this just lets the old path catch up with it.
We also set this flag based upon
sdev->simple_tagsinstead of the block queue flag, so that it is entirely independent of the block layer tagging, and thus always correct even if a driver doesn't use block level tagging yet.Also remove the old
blk_rq_tagged; it was only used by SCSI drivers, and removing it forces them to look for the proper replacement.Signed-off-by Christoph Hellwig <[email protected]>--- Documentation/block/biodoc.txt | 4 ---- block/blk-core.c | 4 ++-- drivers/scsi/53c700.c | 6 +++--- drivers/scsi/aic7xxx/aic7xxx_osm.c | 2 +- drivers/scsi/scsi_lib.c | 13 +++++++++---- drivers/usb/storage/uas.c | 2 +- include/linux/blkdev.h | 1 - include/scsi/scsi_cmnd.h | 4 ++++ include/scsi/scsi_tcq.h | 6 ++---- 9 files changed, 22 insertions(+), 20 deletions(-)Documentation/block/biodoc.txt +0
-4@@ -827,10 +827,6 @@ but in the event of any barrier requests in the tag queue we need to ensure that requests are restarted in the order they were queue. This may happen if the driver needs to use blk_queue_invalidate_tags(). -Tagging also defines a new request flag, REQ_QUEUED. This is set whenever -a request is currently tagged. You should not use this flag directly, -blk_rq_tagged(rq) is the portable way to do so. - 3.3 I/O Submission The routine submit_bio() is used to submit a single io. Higher level i/oblock/blk-core.c +2
-2@@ -1266,7 +1266,7 @@ void blk_requeue_request(struct request_queue *q, struct request *rq)blk_clear_rq_complete (rq);trace_block_rq_requeue (q, rq); -if (blk_rq_tagged (rq)) +if (rq->cmd_flags &REQ_QUEUED )blk_queue_end_tag (q, rq);BUG_ON (blk_queued_rq (rq));@@ -2554,7 +2554,7 @@ EXPORT_SYMBOL_GPL(blk_unprep_request);*/ void blk_finish_request (struct request *req,int error) { -if (blk_rq_tagged (req)) +if (req->cmd_flags &REQ_QUEUED )blk_queue_end_tag (req->q, req);BUG_ON (blk_queued_rq (req));drivers/scsi/53c700.c +3
-3@@ -1767,7 +1767,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)*/ if (NCR_700_get_depth (SCp->device) !=0 && (!(hostdata->tag_negotiated & (1 <<scmd_id (SCp))) - || !blk_rq_tagged (SCp->request))) { + || !(SCp->flags &SCMD_TAGGED ))) {CDEBUG (KERN_ERR , SCp,"has non zero depth %d\n" ,NCR_700_get_depth (SCp->device));return SCSI_MLQUEUE_DEVICE_BUSY ;@@ -1795,7 +1795,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)printk ("53c700: scsi%d, command " , SCp->device->host->host_no);scsi_print_command (SCp);#endif -if (blk_rq_tagged (SCp->request) +if ((SCp->flags &SCMD_TAGGED ) && (hostdata->tag_negotiated &(1 <<scmd_id (SCp))) ==0 &&NCR_700_get_tag_neg_state (SCp->device) ==NCR_700_START_TAG_NEGOTIATION ) {scmd_printk (KERN_ERR , SCp,"Enabling Tag Command Queuing\n" );@@ -1809,7 +1809,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)* * FIXME: This will royally screw up on multiple LUN devices * */ -if (!blk_rq_tagged (SCp->request) +if (!(SCp->flags &SCMD_TAGGED ) && (hostdata->tag_negotiated &(1 <<scmd_id (SCp)))) {scmd_printk (KERN_INFO , SCp,"Disabling Tag Command Queuing\n" ); hostdata->tag_negotiated &= ~(1 <<scmd_id (SCp));drivers/scsi/aic7xxx/aic7xxx_osm.c +1
-1@@ -1447,7 +1447,7 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,* we are storing a full busy target *lun* * table in SCB space. */ -if (!blk_rq_tagged (cmd->request) +if (!(cmd->flags &SCMD_TAGGED ) && (ahc->features &AHC_SCB_BTT ) ==0 ) {int target_offset;drivers/scsi/scsi_lib.c +9
-4@@ -1740,7 +1740,7 @@ static void scsi_request_fn(struct request_queue *q)* we add the dev to the starved list so it eventually gets * a run when a tag is freed. */ -if (blk_queue_tagged (q) && !blk_rq_tagged (req)) { +if (blk_queue_tagged (q) && !(req->cmd_flags &REQ_QUEUED )) {spin_lock_irq (shost->host_lock);if (list_empty (&sdev->starved_entry)) list_add_tail(&sdev->starved_entry,@@ -1754,6 +1754,11 @@ static void scsi_request_fn(struct request_queue *q)if (!scsi_host_queue_ready (q, shost, sdev)) goto host_not_ready; + +if (sdev->simple_tags) + cmd->flags |=SCMD_TAGGED ; +else + cmd->flags &= ~SCMD_TAGGED ;/* * Finally, initialize any error handling parameters, and set up @@ -1908,10 +1913,10 @@ static int scsi_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req,blk_mq_start_request (req); } -if (blk_queue_tagged (q)) - req->cmd_flags |=REQ_QUEUED ; +if (sdev->simple_tags) + cmd->flags |=SCMD_TAGGED ;else - req->cmd_flags &= ~REQ_QUEUED ; + cmd->flags &= ~SCMD_TAGGED ;scsi_init_cmd_errh (cmd); cmd->scsi_done = scsi_mq_done;drivers/usb/storage/uas.c +1
-1@@ -181,7 +181,7 @@ static int uas_get_tag(struct scsi_cmnd *cmnd) {int tag; -if (blk_rq_tagged (cmnd->request)) +if (cmnd->flags &SCMD_TAGGED ) tag = cmnd->request->tag +2 ;else tag =1 ;include/linux/blkdev.h +0
-1@@ -1136,7 +1136,6 @@ static inline bool blk_needs_flush_plug(struct task_struct *tsk)/* * tag stuff */ -#define blk_rq_tagged (rq) ((rq)->cmd_flags & REQ_QUEUED)extern int blk_queue_start_tag (struct request_queue *,struct request *);extern struct request *blk_queue_find_tag (struct request_queue *,int );extern void blk_queue_end_tag (struct request_queue *,struct request *);include/scsi/scsi_cmnd.h +3
-0@@ -53,6 +53,9 @@ struct scsi_pointer {volatile int phase; }; +/* for scmd->flags */ +#define SCMD_TAGGED (1 << 0) +struct scsi_cmnd {struct scsi_device *device;struct list_head list;/* scsi_cmnd participates in queue lists */
include/scsi/scsi_cmnd.h struct scsi_cmnd { · line 141
Quoted 7 lines
include/scsi/scsi_cmnd.h +1
-0@@ -132,6 +135,7 @@ struct scsi_cmnd {* to be at an address < 16Mb). */ int result;/* Status code from lower level driver */ +int flags;/* Command flags */ unsigned char tag;/* SCSI-II queued command tag */ };
Hmm. Flags with just one value in it ...
bitfield, maybe?
Quoted 9 lines
include/scsi/scsi_tcq.h +0
-0@@ -101,11 +101,9 @@ static inline void scsi_deactivate_tcq(struct scsi_device *sdev, int depth)**/ static inline int scsi_populate_tag_msg (struct scsi_cmnd *cmd,char *msg) {
include/scsi/scsi_tcq.h static inline void scsi_deactivate_tcq(struct scsi_device *sdev, int depth) · line 109
Quoted 10 lines
include/scsi/scsi_tcq.h +2
-4-struct request *req = cmd->request; - -if (blk_rq_tagged (req)) { +if (cmd->flags &SCMD_TAGGED ) { *msg++ =MSG_SIMPLE_TAG ; - *msg++ = req->tag; + *msg++ = cmd->request->tag;return 2 ; }
Other than that:
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 02/11] scsi: add new scsi-command flag for tagged commands
Quoted 2 lines · Hannes Reinecke
Hmm. Flags with just one value in it ...
bitfield, maybe?
Bitfields are nasty. And I see more use for flags, e.g. whatever is left of eh_ehflags after the no_async_abort removal could be merged into it.
Hannes Reinecke
maintainerRe: [PATCH 02/11] scsi: add new scsi-command flag for tagged commands
Quoted 8 lines · Christoph Hellwig
Quoted 2 lines · Hannes Reinecke
Hmm. Flags with just one value in it ...
bitfield, maybe?Bitfields are nasty. And I see more use for flags, e.g. whatever is left of
eh_ehflagsafter theno_async_abortremoval could be merged into it.
Ack. Fair enough.
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 02/11] scsi: add new scsi-command flag for tagged commands
In reply to Christoph HellwigQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Christoph> Currently scsi piggy backs on the block layer to define the Christoph> concept of a tagged command. But we want to be able to have Christoph> block-level host-wide tags assigned even for untagged Christoph> commands like the initial INQUIRY, so add a new SCSI-level Christoph> flag for commands that are tagged at the scsi level, so that Christoph> even commands without that set can have tags assigned to Christoph> them. Note that this alredy is the case for the blk-mq code Christoph> path, and this just lets the old path catch up with it.
Christoph> We also set this flag based upon sdev->simple_tags instead of Christoph> the block queue flag, so that it is entirely independent of Christoph> the block layer tagging, and thus always correct even if a Christoph> driver doesn't use block level tagging yet.
Christoph> Also remove the old blk_rq_tagged; it was only used by SCSI Christoph> drivers, and removing it forces them to look for the proper Christoph> replacement.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
PATCH 3/11 scsi: remove ordered_tags scsi_device field
In reply to Christoph HellwigRemove the ordered_tags field, we haven't been issuing ordered tags based on it since the big barrier rework in 2010.
--- drivers/message/fusion/mptscsih.c | 5 ++--- drivers/scsi/bfa/bfad_im.c | 11 +++-------- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 16 ++++------------ drivers/scsi/mpt3sas/mpt3sas_scsih.c | 15 +++------------ drivers/scsi/qla2xxx/qla_os.c | 5 +---- drivers/scsi/scsi.c | 13 ++----------- drivers/scsi/scsi_sysfs.c | 13 +++++++------ drivers/scsi/vmw_pvscsi.c | 4 ++-- drivers/target/loopback/tcm_loop.c | 14 +------------- include/scsi/scsi_device.h | 1 - include/scsi/scsi_tcq.h | 9 --------- 11 files changed, 25 insertions(+), 81 deletions(-)
drivers/message/fusion/mptscsih.c +2 -3
@@ -2400,9 +2400,8 @@ mptscsih_slave_configure(struct scsi_device *sdev)mptscsih_change_queue_depth (sdev,MPT_SCSI_CMD_PER_DEV_HIGH ,SCSI_QDEPTH_DEFAULT );dsprintk (ioc,printk (MYIOC_s_DEBUG_FMT -"tagged %d, simple %d, ordered %d\n" , - ioc->name,sdev->tagged_supported, sdev->simple_tags, - sdev->ordered_tags)); +"tagged %d, simple %d\n" , + ioc->name,sdev->tagged_supported, sdev->simple_tags));blk_queue_dma_alignment (sdev->request_queue,512 -1 );
drivers/scsi/bfa/bfad_im.c +3 -8
@@ -868,14 +868,9 @@ bfad_ramp_up_qdepth(struct bfad_itnim_s *itnim, struct scsi_device *sdev)if (bfa_lun_queue_depth > tmp_sdev->queue_depth) {if (tmp_sdev->id != sdev->id)continue ; -if (tmp_sdev->ordered_tags) -scsi_adjust_queue_depth (tmp_sdev, -MSG_ORDERED_TAG , - tmp_sdev->queue_depth +1 ); -else -scsi_adjust_queue_depth (tmp_sdev, -MSG_SIMPLE_TAG , - tmp_sdev->queue_depth +1 ); +scsi_adjust_queue_depth (tmp_sdev, +MSG_SIMPLE_TAG , + tmp_sdev->queue_depth +1 ); itnim->last_ramp_up_time = jiffies; }
drivers/scsi/mpt2sas/mpt2sas_scsih.c +4 -12
@@ -1246,9 +1246,9 @@ _scsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)if (sdev->inquiry_len >7 )sdev_printk (KERN_INFO , sdev,"qdepth(%d), tagged(%d), " -"simple(%d), ordered(%d), scsi_level(%d), cmd_que(%d)\n" , +"simple(%d), scsi_level(%d), cmd_que(%d)\n" , sdev->queue_depth, sdev->tagged_supported, sdev->simple_tags, - sdev->ordered_tags, sdev->scsi_level, + sdev->scsi_level, (sdev->inquiry[7 ] &2 ) >>1 );return sdev->queue_depth;
@@ -3944,16 +3944,8 @@ _scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) mpi_control =MPI2_SCSIIO_CONTROL_NODATATRANSFER ;/* set tags */ -if (!(sas_device_priv_data->flags &MPT_DEVICE_FLAGS_INIT )) { -if (scmd->device->tagged_supported) { -if (scmd->device->ordered_tags) - mpi_control |=MPI2_SCSIIO_CONTROL_ORDEREDQ ; -else - mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ; - }else - mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ; - }else - mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ; + mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ; +/* Make sure Device is not raid volume. * We do not expose raid functionality to upper layer for warpdrive. */
drivers/scsi/mpt3sas/mpt3sas_scsih.c +3 -12
@@ -1114,9 +1114,9 @@ _scsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)if (sdev->inquiry_len >7 )sdev_printk (KERN_INFO , sdev,"qdepth(%d), tagged(%d), " \ -"simple(%d), ordered(%d), scsi_level(%d), cmd_que(%d)\n" , +"simple(%d), scsi_level(%d), cmd_que(%d)\n" , sdev->queue_depth, sdev->tagged_supported, sdev->simple_tags, - sdev->ordered_tags, sdev->scsi_level, + sdev->scsi_level, (sdev->inquiry[7 ] &2 ) >>1 );return sdev->queue_depth;
@@ -3563,16 +3563,7 @@ _scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) mpi_control =MPI2_SCSIIO_CONTROL_NODATATRANSFER ;/* set tags */ -if (!(sas_device_priv_data->flags &MPT_DEVICE_FLAGS_INIT )) { -if (scmd->device->tagged_supported) { -if (scmd->device->ordered_tags) - mpi_control |=MPI2_SCSIIO_CONTROL_ORDEREDQ ; -else - mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ; - }else - mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ; - }else - mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ; + mpi_control |=MPI2_SCSIIO_CONTROL_SIMPLEQ ;if ((sas_device_priv_data->flags &MPT_DEVICE_TLR_ON ) && scmd->cmd_len !=32 )
drivers/scsi/qla2xxx/qla_os.c +1 -4
@@ -1442,10 +1442,7 @@ static void qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, int qdepth)if (req->max_q_depth <= sdev->queue_depth || req->max_q_depth < qdepth)return ; -if (sdev->ordered_tags) -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , qdepth); -else -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , qdepth); +scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , qdepth); ql_dbg(ql_dbg_io, vha, 0x302a, "Queue depth adjusted-up to %d for nexus=%ld:%d:%llu.\n",
drivers/scsi/scsi.c +2 -11
@@ -789,19 +789,13 @@ void scsi_adjust_queue_depth(struct scsi_device *sdev, int tagged, int tags) sdev->queue_depth = tags;switch (tagged) {case 0 : - sdev->ordered_tags =0 ; sdev->simple_tags =0 ;break ;case MSG_ORDERED_TAG : - sdev->ordered_tags =1 ; - sdev->simple_tags =1 ; -break ;case MSG_SIMPLE_TAG : - sdev->ordered_tags =0 ; sdev->simple_tags =1 ;break ;default : - sdev->ordered_tags =0 ; sdev->simple_tags =0 ;sdev_printk (KERN_WARNING , sdev, "scsi_adjust_queue_depth, bad queue type, "
@@ -857,11 +851,8 @@ int scsi_track_queue_full(struct scsi_device *sdev, int depth)scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun);return -1 ; } - -if (sdev->ordered_tags) -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , depth); -else -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , depth); + +scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , depth);return depth; }EXPORT_SYMBOL (scsi_track_queue_full);
drivers/scsi/scsi_sysfs.c +7 -6
@@ -727,9 +727,7 @@ show_queue_type_field(struct device *dev, struct device_attribute *attr,struct scsi_device *sdev =to_scsi_device (dev);const char *name ="none" ; -if (sdev->ordered_tags) - name ="ordered" ; -else if (sdev->simple_tags) +if (sdev->simple_tags) name ="simple" ;return snprintf (buf,20 ,"%s\n" , name);
@@ -747,9 +745,12 @@ store_queue_type_field(struct device *dev, struct device_attribute *attr,if (!sdev->tagged_supported || !sht->change_queue_type)return -EINVAL ; -if (strncmp (buf,"ordered" ,7 ) ==0 ) - tag_type =MSG_ORDERED_TAG ; -else if (strncmp (buf,"simple" ,6 ) ==0 ) +/* +* We're never issueing order tags these days, but allow the value +* for backwards compatibility. +*/ +if (strncmp (buf,"ordered" ,7 ) ==0 || +strncmp (buf,"simple" ,6 ) ==0 ) tag_type =MSG_SIMPLE_TAG ;else if (strncmp (buf,"none" ,4 ) !=0 )return -EINVAL ;
drivers/scsi/vmw_pvscsi.c +2 -2
@@ -526,9 +526,9 @@ static int pvscsi_change_queue_depth(struct scsi_device *sdev,if (sdev->inquiry_len >7 )sdev_printk (KERN_INFO , sdev, -"qdepth(%d), tagged(%d), simple(%d), ordered(%d), scsi_level(%d), cmd_que(%d)\n" , +"qdepth(%d), tagged(%d), simple(%d), scsi_level(%d), cmd_que(%d)\n" , sdev->queue_depth, sdev->tagged_supported, - sdev->simple_tags, sdev->ordered_tags, + sdev->simple_tags, sdev->scsi_level, (sdev->inquiry[7 ] &2 ) >>1 );return sdev->queue_depth; }
drivers/target/loopback/tcm_loop.c +1 -13
@@ -135,18 +135,6 @@ static int tcm_loop_change_queue_depth(return sdev->queue_depth; } -/* -* Locate the SAM Task Attr from struct scsi_cmnd * -*/ -static int tcm_loop_sam_attr (struct scsi_cmnd *sc,int tag) -{ -if (sc->device->tagged_supported && - sc->device->ordered_tags && tag >=0 ) -return MSG_ORDERED_TAG ; - -return MSG_SIMPLE_TAG ; -} -static void tcm_loop_submission_work (struct work_struct *work) { struct tcm_loop_cmd *tl_cmd =
@@ -205,7 +193,7 @@ static void tcm_loop_submission_work(struct work_struct *work) rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, - transfer_length, tcm_loop_sam_attr(sc, tl_cmd->sc_cmd_tag), + transfer_length, MSG_SIMPLE_TAG, sc->sc_data_direction, 0, scsi_sglist(sc), scsi_sg_count(sc), sgl_bidi, sgl_bidi_count,
include/scsi/scsi_device.h +0 -1
@@ -141,7 +141,6 @@ struct scsi_device { unsigned ppr:1; /* Device supports PPR messages */ unsigned tagged_supported:1; /* Supports SCSI-II tagged queuing */ unsigned simple_tags:1; /* simple queue tag messages are enabled */ - unsigned ordered_tags:1;/* ordered queue tag messages are enabled */ unsigned was_reset:1; /* There was a bus reset on the bus for* this device */ unsigned expecting_cc_ua:1; /* Expecting a CHECK_CONDITION/UNIT_ATTN
include/scsi/scsi_tcq.h +0 -9
@@ -21,17 +21,11 @@ int scsi_change_queue_type(struct scsi_device *sdev, int tag_type);/** * scsi_get_tag_type - get the type of tag the device supports * @sdev: the scsi device -* -* Notes: -* If the drive only supports simple tags, returns MSG_SIMPLE_TAG -* if it supports all tag types, returns MSG_ORDERED_TAG. */ static inline int scsi_get_tag_type (struct scsi_device *sdev) {if (!sdev->tagged_supported)return 0 ; -if (sdev->ordered_tags) -return MSG_ORDERED_TAG ;if (sdev->simple_tags)return MSG_SIMPLE_TAG ;return 0 ;
@@ -41,15 +35,12 @@ static inline void scsi_set_tag_type(struct scsi_device *sdev, int tag) {switch (tag) {case MSG_ORDERED_TAG : - sdev->ordered_tags =1 ; -/* fall through */ case MSG_SIMPLE_TAG : sdev->simple_tags =1 ;break ;case 0 :/* fall through */ default : - sdev->ordered_tags =0 ; sdev->simple_tags =0 ;break ; }
Signature · 1 line
1.9.1
Re: [PATCH 03/11] scsi: remove ordered_tags scsi_device field
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Christoph> Remove the ordered_tags field, we haven't been issuing Christoph> ordered tags based on it since the big barrier rework in Christoph> 2010.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
Re: [PATCH 03/11] scsi: remove ordered_tags scsi_device field
In reply to Christoph HellwigQuoted 2 lines · Christoph Hellwig
Remove the
ordered_tagsfield, we haven't been issuing ordered tags based on it since the big barrier rework in 2010.
PATCH 4/11 scsi: remove ordered_tag host template field
In reply to Christoph Hellwig--- drivers/scsi/hosts.c | 1 - drivers/usb/storage/uas.c | 1 - include/scsi/scsi_host.h | 10 ---------- 3 files changed, 12 deletions(-)
drivers/scsi/hosts.c +0 -1
@@ -418,7 +418,6 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) shost->cmd_per_lun = sht->cmd_per_lun; shost->unchecked_isa_dma = sht->unchecked_isa_dma; shost->use_clustering = sht->use_clustering; - shost->ordered_tag = sht->ordered_tag; shost->no_write_same = sht->no_write_same;if (shost_eh_deadline ==-1 || !sht->eh_host_reset_handler)
drivers/usb/storage/uas.c +0 -1
@@ -817,7 +817,6 @@ static struct scsi_host_template uas_host_template = { .sg_tablesize = SG_NONE, .cmd_per_lun = 1, /* until we override it */ .skip_settle_delay = 1, - .ordered_tag = 1,/* * The uas drivers expects tags not to be bigger than the maximum
include/scsi/scsi_host.h +0 -10
@@ -451,11 +451,6 @@ struct scsi_host_template {*/ unsigned skip_settle_delay:1; -/* -* True if we are using ordered write support. -*/ - unsigned ordered_tag:1; -/* True if the controller does not support WRITE SAME */ unsigned no_write_same:1;
@@ -662,11 +657,6 @@ struct Scsi_Host {*/ unsigned reverse_ordering:1; -/* -* Ordered write support -*/ - unsigned ordered_tag:1; -/* Task mgmt function in progress */ unsigned tmf_in_progress:1;
Signature · 1 line
1.9.1
Re: [PATCH 04/11] scsi: remove ordered_tag host template field
Quoted 50 lines · Christoph Hellwig
Signed-off-by Christoph Hellwig <[email protected]>--- drivers/scsi/hosts.c | 1 - drivers/usb/storage/uas.c | 1 - include/scsi/scsi_host.h | 10 ---------- 3 files changed, 12 deletions(-)drivers/scsi/hosts.c +0
-1@@ -418,7 +418,6 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) shost->cmd_per_lun = sht->cmd_per_lun; shost->unchecked_isa_dma = sht->unchecked_isa_dma; shost->use_clustering = sht->use_clustering; - shost->ordered_tag = sht->ordered_tag; shost->no_write_same = sht->no_write_same;if (shost_eh_deadline ==-1 || !sht->eh_host_reset_handler)drivers/usb/storage/uas.c +0
-1@@ -817,7 +817,6 @@ static struct scsi_host_template uas_host_template = { .sg_tablesize = SG_NONE, .cmd_per_lun = 1, /* until we override it */ .skip_settle_delay = 1, - .ordered_tag = 1,/* * The uas drivers expects tags not to be bigger than the maximum include/scsi/scsi_host.h +0
-5@@ -451,11 +451,6 @@ struct scsi_host_template {*/ unsigned skip_settle_delay:1; -/* -* True if we are using ordered write support. -*/ - unsigned ordered_tag:1; -/* True if the controller does not support WRITE SAME */ unsigned no_write_same:1;@@ -662,11 +657,6 @@ struct Scsi_Host {*/
include/scsi/scsi_host.h struct Scsi_Host { · line 662
Quoted 10 lines
include/scsi/scsi_host.h +0
-5unsigned reverse_ordering:1; -/* -* Ordered write support -*/ - unsigned ordered_tag:1; -/* Task mgmt function in progress */ unsigned tmf_in_progress:1;
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 04/11] scsi: remove ordered_tag host template field
In reply to Christoph HellwigQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Description a bit lacking but subject says it all, I guess :)
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
Re: [PATCH 04/11] scsi: remove ordered_tag host template field
In reply to Christoph HellwigQuoted 1 line · Christoph Hellwig
Signed-off-by Christoph Hellwig <[email protected]>
PATCH 5/11 scsi: remove abuses of scsi_populate_tag
In reply to Christoph HellwigUnless we want to build a SPI tag message we should just check SCMD_TAGGED instead of reverse engineering a tag type through the use of scsi_populate_tag_msg.
Also rename the function to spi_populate_tag_msg, make it behave like the other spi message helpers, and move it to the spi transport class.
--- drivers/s390/scsi/zfcp_fc.h | 14 +----- drivers/scsi/53c700.c | 2 +- drivers/scsi/aic7xxx/aic79xx_osm.c | 9 ---- drivers/scsi/aic7xxx/aic7xxx_osm.c | 10 +---- drivers/scsi/bnx2fc/bnx2fc_io.c | 18 ++------ drivers/scsi/csiostor/csio_scsi.c | 29 ++---------- drivers/scsi/esp_scsi.c | 2 +- drivers/scsi/fnic/fnic_scsi.c | 11 +---- drivers/scsi/ibmvscsi/ibmvfc.c | 16 ++----- drivers/scsi/ipr.c | 34 ++------------ drivers/scsi/lpfc/lpfc_scsi.c | 16 +------ drivers/scsi/pmcraid.c | 34 ++------------ drivers/scsi/qla2xxx/qla_iocb.c | 92 ++------------------------------------ drivers/scsi/qla2xxx/qla_mr.c | 13 ------ drivers/scsi/qla4xxx/ql4_iocb.c | 10 ----- drivers/scsi/scsi_transport_spi.c | 23 ++++++++++ drivers/scsi/tmscsim.c | 12 +++-- include/scsi/scsi_tcq.h | 21 --------- include/scsi/scsi_transport_spi.h | 1 + 19 files changed, 56 insertions(+), 311 deletions(-)
drivers/s390/scsi/zfcp_fc.h +1 -13
@@ -212,8 +212,6 @@ static inlinevoid zfcp_fc_scsi_to_fcp (struct fcp_cmnd *fcp,struct scsi_cmnd *scsi,u8 tm_flags) { -char tag[2 ]; -int_to_scsilun (scsi->device->lun, (struct scsi_lun *) &fcp->fc_lun);if (unlikely (tm_flags)) {
@@ -221,17 +219,7 @@ void zfcp_fc_scsi_to_fcp(struct fcp_cmnd *fcp, struct scsi_cmnd *scsi,return ; } -if (scsi_populate_tag_msg (scsi, tag)) { -switch (tag[0 ]) { -case MSG_ORDERED_TAG : - fcp->fc_pri_ta |=FCP_PTA_ORDERED ; -break ; -case MSG_SIMPLE_TAG : - fcp->fc_pri_ta |=FCP_PTA_SIMPLE ; -break ; - }; - }else - fcp->fc_pri_ta =FCP_PTA_SIMPLE ; + fcp->fc_pri_ta =FCP_PTA_SIMPLE ;if (scsi->sc_data_direction ==DMA_FROM_DEVICE ) fcp->fc_flags |=FCP_CFL_RDDATA ;
drivers/scsi/53c700.c +1 -1
@@ -1427,7 +1427,7 @@ NCR_700_start_command(struct scsi_cmnd *SCp)if ((hostdata->tag_negotiated & (1 <<scmd_id (SCp))) && (slot->tag !=SCSI_NO_TAG && SCp->cmnd[0 ] !=REQUEST_SENSE && slot->flags !=NCR_700_FLAG_AUTOSENSE )) { - count +=scsi_populate_tag_msg (SCp, &hostdata->msgout[count]); + count +=spi_populate_tag_msg (&hostdata->msgout[count], SCp); } if(hostdata->fast &&
drivers/scsi/aic7xxx/aic79xx_osm.c +0 -9
@@ -1619,15 +1619,6 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev, }if ((dev->flags & (AHD_DEV_Q_TAGGED |AHD_DEV_Q_BASIC )) !=0 ) { -int msg_bytes; -uint8_t tag_msgs[2 ]; - - msg_bytes =scsi_populate_tag_msg (cmd, tag_msgs); -if (msg_bytes && tag_msgs[0 ] !=MSG_SIMPLE_TASK ) { - hscb->control |= tag_msgs[0 ]; -if (tag_msgs[0 ] ==MSG_ORDERED_TASK ) - dev->commands_since_idle_or_otag =0 ; - }else if (dev->commands_since_idle_or_otag ==AHD_OTAG_THRESH && (dev->flags &AHD_DEV_Q_TAGGED ) !=0 ) { hscb->control |=MSG_ORDERED_TASK ;
drivers/scsi/aic7xxx/aic7xxx_osm.c +1 -9
@@ -1501,15 +1501,7 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev, }if ((dev->flags & (AHC_DEV_Q_TAGGED |AHC_DEV_Q_BASIC )) !=0 ) { -int msg_bytes; -uint8_t tag_msgs[2 ]; - - msg_bytes =scsi_populate_tag_msg (cmd, tag_msgs); -if (msg_bytes && tag_msgs[0 ] !=MSG_SIMPLE_TASK ) { - hscb->control |= tag_msgs[0 ]; -if (tag_msgs[0 ] ==MSG_ORDERED_TASK ) - dev->commands_since_idle_or_otag =0 ; - }else if (dev->commands_since_idle_or_otag ==AHC_OTAG_THRESH +if (dev->commands_since_idle_or_otag ==AHC_OTAG_THRESH && (dev->flags &AHC_DEV_Q_TAGGED ) !=0 ) { hscb->control |=MSG_ORDERED_TASK ; dev->commands_since_idle_or_otag =0 ;
drivers/scsi/bnx2fc/bnx2fc_io.c +3 -15
@@ -1725,7 +1725,6 @@ void bnx2fc_build_fcp_cmnd(struct bnx2fc_cmd *io_req, struct fcp_cmnd *fcp_cmnd) {struct scsi_cmnd *sc_cmd = io_req->sc_cmd; -char tag[2 ];memset (fcp_cmnd,0 ,sizeof (struct fcp_cmnd ));
@@ -1739,21 +1738,10 @@ void bnx2fc_build_fcp_cmnd(struct bnx2fc_cmd *io_req, fcp_cmnd->fc_tm_flags = io_req->mp_req.tm_flags; fcp_cmnd->fc_flags = io_req->io_req_flags; -if (scsi_populate_tag_msg (sc_cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - fcp_cmnd->fc_pri_ta =FCP_PTA_HEADQ ; -break ; -case ORDERED_QUEUE_TAG : - fcp_cmnd->fc_pri_ta =FCP_PTA_ORDERED ; -break ; -default : - fcp_cmnd->fc_pri_ta =FCP_PTA_SIMPLE ; -break ; - } - }else { +if (sc_cmd->flags &SCMD_TAGGED ) + fcp_cmnd->fc_pri_ta =FCP_PTA_SIMPLE ; +else fcp_cmnd->fc_pri_ta =0 ; - } } static void bnx2fc_parse_fcp_rsp(struct bnx2fc_cmd *io_req,
drivers/scsi/csiostor/csio_scsi.c +4 -25
@@ -152,28 +152,6 @@ csio_scsi_itnexus_loss_error(uint16_t error)return 0 ; } -static inline void -csio_scsi_tag (struct scsi_cmnd *scmnd,uint8_t *tag,uint8_t hq, -uint8_t oq,uint8_t sq) -{ -char stag[2 ]; - -if (scsi_populate_tag_msg (scmnd, stag)) { -switch (stag[0 ]) { -case HEAD_OF_QUEUE_TAG : - *tag = hq; -break ; -case ORDERED_QUEUE_TAG : - *tag = oq; -break ; -default : - *tag = sq; -break ; - } - }else - *tag =0 ; -} -/* * csio_scsi_fcp_cmnd - Frame the SCSI FCP command paylod. * @req: IO req structure.
@@ -192,11 +170,12 @@ csio_scsi_fcp_cmnd(struct csio_ioreq *req, void *addr)int_to_scsilun (scmnd->device->lun, &fcp_cmnd->fc_lun); fcp_cmnd->fc_tm_flags =0 ; fcp_cmnd->fc_cmdref =0 ; - fcp_cmnd->fc_pri_ta =0 ;memcpy (fcp_cmnd->fc_cdb, scmnd->cmnd,16 ); -csio_scsi_tag (scmnd, &fcp_cmnd->fc_pri_ta, -FCP_PTA_HEADQ ,FCP_PTA_ORDERED ,FCP_PTA_SIMPLE ); +if (scmnd->flags &SCMD_TAGGED ) + fcp_cmnd->fc_pri_ta =FCP_PTA_SIMPLE ; +else + fcp_cmnd->fc_pri_ta =0 ; fcp_cmnd->fc_dl =cpu_to_be32 (scsi_bufflen (scmnd));if (req->nsge)
drivers/scsi/esp_scsi.c +1 -1
@@ -663,7 +663,7 @@ static struct esp_cmd_entry *find_and_prep_issuable_command(struct esp *esp)return ent; } -if (!scsi_populate_tag_msg (cmd, &ent->tag[0 ])) { +if (!spi_populate_tag_msg (&ent->tag[0 ], cmd)) { ent->tag[0 ] =0 ; ent->tag[1 ] =0 ; }
drivers/scsi/fnic/fnic_scsi.c +2 -9
@@ -325,13 +325,11 @@ static inline int fnic_queue_wq_copy_desc(struct fnic *fnic,struct fc_rport_libfc_priv *rp = rport->dd_data;struct host_sg_desc *desc;struct misc_stats *misc_stats = &fnic->fnic_stats.misc_stats; -u8 pri_tag =0 ;unsigned int i;unsigned long intr_flags;int flags;u8 exch_flags;struct scsi_lun fc_lun; -char msg[2 ];if (sg_count) {/* For each SGE, create a device desc entry */
@@ -357,12 +355,6 @@ static inline int fnic_queue_wq_copy_desc(struct fnic *fnic,int_to_scsilun (sc->device->lun, &fc_lun); - pri_tag =FCPIO_ICMND_PTA_SIMPLE ; - msg[0 ] =MSG_SIMPLE_TAG ; -scsi_populate_tag_msg (sc, msg); -if (msg[0 ] ==MSG_ORDERED_TAG ) - pri_tag =FCPIO_ICMND_PTA_ORDERED ; -/* Enqueue the descriptor in the Copy WQ */ spin_lock_irqsave (&fnic->wq_copy_lock[0 ], intr_flags);
@@ -394,7 +386,8 @@ static inline int fnic_queue_wq_copy_desc(struct fnic *fnic, io_req->sgl_list_pa, io_req->sense_buf_pa,0 ,/* scsi cmd ref, always 0 */ - pri_tag,/* scsi pri and tag */ +FCPIO_ICMND_PTA_SIMPLE , +/* scsi pri and tag */ flags,/* command flags */ sc->cmnd, sc->cmd_len, scsi_bufflen(sc),
drivers/scsi/ibmvscsi/ibmvfc.c +3 -13
@@ -1643,19 +1643,9 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,int_to_scsilun (cmnd->device->lun, &vfc_cmd->iu.lun);memcpy (vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len); -if (scsi_populate_tag_msg (cmnd, tag)) { - vfc_cmd->task_tag =cpu_to_be64 (tag[1 ]); -switch (tag[0 ]) { -case MSG_SIMPLE_TAG : - vfc_cmd->iu.pri_task_attr =IBMVFC_SIMPLE_TASK ; -break ; -case MSG_HEAD_TAG : - vfc_cmd->iu.pri_task_attr =IBMVFC_HEAD_OF_QUEUE ; -break ; -case MSG_ORDERED_TAG : - vfc_cmd->iu.pri_task_attr =IBMVFC_ORDERED_TASK ; -break ; - }; +if (cmnd->flags &SCMD_TAGGED ) { + vfc_cmd->task_tag =cpu_to_be64 (cmnd->tag); + vfc_cmd->iu.pri_task_attr =IBMVFC_SIMPLE_TASK ; }if (likely (!(rc =ibmvfc_map_sg_data (cmnd, evt, vfc_cmd, vhost->dev))))
drivers/scsi/ipr.c +4 -30
@@ -5752,35 +5752,6 @@ static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg, }/** -* ipr_get_task_attributes - Translate SPI Q-Tag to task attributes -* @scsi_cmd: scsi command struct -* -* Return value: -* task attributes -**/ -static u8 ipr_get_task_attributes (struct scsi_cmnd *scsi_cmd) -{ -u8 tag[2 ]; -u8 rc =IPR_FLAGS_LO_UNTAGGED_TASK ; - -if (scsi_populate_tag_msg (scsi_cmd, tag)) { -switch (tag[0 ]) { -case MSG_SIMPLE_TAG : - rc =IPR_FLAGS_LO_SIMPLE_TASK ; -break ; -case MSG_HEAD_TAG : - rc =IPR_FLAGS_LO_HEAD_OF_Q_TASK ; -break ; -case MSG_ORDERED_TAG : - rc =IPR_FLAGS_LO_ORDERED_TASK ; -break ; - }; - } - -return rc; -} - -/** * ipr_erp_done - Process completion of ERP for a device * @ipr_cmd: ipr command struct *
@@ -6315,7 +6286,10 @@ static int ipr_queuecommand(struct Scsi_Host *shost, ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_DELAY_AFTER_RST ; } ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_ALIGNED_BFR ; - ioarcb->cmd_pkt.flags_lo |=ipr_get_task_attributes (scsi_cmd); +if (scsi_cmd->flags &SCMD_TAGGED ) + ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_SIMPLE_TASK ; +else + ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_UNTAGGED_TASK ; } if (scsi_cmd->cmnd[0] >= 0xC0 &&
drivers/scsi/lpfc/lpfc_scsi.c +1 -15
@@ -4266,7 +4266,6 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq);int datadir = scsi_cmnd->sc_data_direction; -char tag[2 ];uint8_t *ptr;bool sli4;uint32_t fcpdl;
@@ -4288,20 +4287,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,memset (ptr,0 , (LPFC_FCP_CDB_LEN - scsi_cmnd->cmd_len)); } -if (scsi_populate_tag_msg (scsi_cmnd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - fcp_cmnd->fcpCntl1 =HEAD_OF_Q ; -break ; -case ORDERED_QUEUE_TAG : - fcp_cmnd->fcpCntl1 =ORDERED_Q ; -break ; -default : - fcp_cmnd->fcpCntl1 =SIMPLE_Q ; -break ; - } - }else - fcp_cmnd->fcpCntl1 =SIMPLE_Q ; + fcp_cmnd->fcpCntl1 =SIMPLE_Q ; sli4 = (phba->sli_rev ==LPFC_SLI_REV4 ); piocbq->iocb.un.fcpi.fcpi_XRdy =0 ;
drivers/scsi/pmcraid.c +3 -31
@@ -3169,36 +3169,6 @@ static int pmcraid_eh_host_reset_handler(struct scsi_cmnd *scmd) }/** -* pmcraid_task_attributes - Translate SPI Q-Tags to task attributes -* @scsi_cmd: scsi command struct -* -* Return value -* number of tags or 0 if the task is not tagged -*/ -static u8 pmcraid_task_attributes (struct scsi_cmnd *scsi_cmd) -{ -char tag[2 ]; -u8 rc =0 ; - -if (scsi_populate_tag_msg (scsi_cmd, tag)) { -switch (tag[0 ]) { -case MSG_SIMPLE_TAG : - rc =TASK_TAG_SIMPLE ; -break ; -case MSG_HEAD_TAG : - rc =TASK_TAG_QUEUE_HEAD ; -break ; -case MSG_ORDERED_TAG : - rc =TASK_TAG_ORDERED ; -break ; - }; - } - -return rc; -} - - -/** * pmcraid_init_ioadls - initializes IOADL related fields in IOARCB * @cmd: pmcraid command struct * @sgcount: count of scatter-gather elements
@@ -3553,7 +3523,9 @@ static int pmcraid_queuecommand_lck( } ioarcb->request_flags0 |=NO_LINK_DESCS ; - ioarcb->request_flags1 |=pmcraid_task_attributes (scsi_cmd); + +if (scsi_cmd->flags &SCMD_TAGGED ) + ioarcb->request_flags1 |=TASK_TAG_SIMPLE ;if (RES_IS_GSCSI (res->cfg_entry)) ioarcb->request_flags1 |=DELAY_AFTER_RESET ;
drivers/scsi/qla2xxx/qla_iocb.c +3 -89
146 lines not on this page · raw message
drivers/scsi/qla2xxx/qla_mr.c +0 -13
@@ -3086,7 +3086,6 @@ qlafx00_start_scsi(srb_t *sp)struct cmd_type_7_fx00 *cmd_pkt;struct cmd_type_7_fx00 lcmd_pkt;struct scsi_lun llun; -char tag[2 ];/* Setup device pointers. */ ret =0 ;
@@ -3157,18 +3156,6 @@ qlafx00_start_scsi(srb_t *sp)host_to_adap ((uint8_t *)&llun, (uint8_t *)&lcmd_pkt.lun,sizeof (lcmd_pkt.lun)); -/* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */ -if (scsi_populate_tag_msg (cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - lcmd_pkt.task =TSK_HEAD_OF_QUEUE ; -break ; -case ORDERED_QUEUE_TAG : - lcmd_pkt.task =TSK_ORDERED ; -break ; - } - } -/* Load SCSI command packet. */ host_to_adap (cmd->cmnd, lcmd_pkt.fcp_cdb,sizeof (lcmd_pkt.fcp_cdb)); lcmd_pkt.byte_count =cpu_to_le32 ((uint32_t )scsi_bufflen (cmd));
drivers/scsi/qla4xxx/ql4_iocb.c +0 -10
@@ -280,7 +280,6 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)uint16_t req_cnt;unsigned long flags;uint32_t index; -char tag[2 ];/* Get real lun and adapter */ ddb_entry = srb->ddb;
@@ -352,15 +351,6 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)/* Set tagged queueing control flags */ cmd_entry->control_flags |=CF_SIMPLE_TAG ; -if (scsi_populate_tag_msg (cmd, tag)) -switch (tag[0 ]) { -case MSG_HEAD_TAG : - cmd_entry->control_flags |=CF_HEAD_TAG ; -break ; -case MSG_ORDERED_TAG : - cmd_entry->control_flags |=CF_ORDERED_TAG ; -break ; - }qla4xxx_advance_req_ring_ptr (ha);qla4xxx_build_scsi_iocbs (srb, cmd_entry, tot_dsds);
drivers/scsi/scsi_transport_spi.c +23 -0
@@ -32,6 +32,7 @@#include <scsi/scsi_host.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_eh.h> +#include <scsi/scsi_tcq.h> #include <scsi/scsi_transport.h> #include <scsi/scsi_transport_spi.h>
@@ -1207,6 +1208,28 @@ int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, }EXPORT_SYMBOL_GPL (spi_populate_ppr_msg); +/** +* scsi_populate_tag_msg - place a tag message in a buffer +* @msg: pointer to the area to place the tag +* @cmd: pointer to the scsi command for the tag +* +* Notes: +* designed to create the correct type of tag message for the +* particular request. Returns the size of the tag message. +* May return 0 if TCQ is disabled for this device. +**/ +int spi_populate_tag_msg (unsigned char *msg,struct scsi_cmnd *cmd) +{ +if (cmd->flags &SCMD_TAGGED ) { + *msg++ =MSG_SIMPLE_TAG ; + *msg++ = cmd->request->tag; +return 2 ; + } + +return 0 ; +} +EXPORT_SYMBOL_GPL (spi_populate_tag_msg); +#ifdef CONFIG_SCSI_CONSTANTS static const char *const one_byte_msgs[] = { /* 0x00 */ "Task Complete", NULL /* Extended Message */, "Save Pointers",
drivers/scsi/tmscsim.c +5 -7
@@ -243,7 +243,6 @@#include <scsi/scsicam.h> #include <scsi/scsi_tcq.h> -#define DC390_BANNER "Tekram DC390/AM53C974"#define DC390_VERSION "2.1d 2004-05-27"
@@ -508,7 +507,6 @@ dc390_StartSCSI( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srstruct scsi_cmnd *scmd = pSRB->pcmd;struct scsi_device *sdev = scmd->device;u8 cmd, disc_allowed, try_sync_nego; -char tag[2 ]; pSRB->ScsiPhase =SCSI_NOP0 ;
@@ -560,11 +558,11 @@ dc390_StartSCSI( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_sr cmd =SEL_W_ATN ;DC390_write8 (ScsiFifo,IDENTIFY (disc_allowed, pDCB->TargetLUN));/* Change 99/05/31: Don't use tags when not disconnecting (BUSY) */ -if ((pDCB->SyncMode &EN_TAG_QUEUEING ) && disc_allowed &&scsi_populate_tag_msg (scmd, tag)) { -DC390_write8 (ScsiFifo, tag[0 ]); - pDCB->TagMask |=1 << tag[1 ]; - pSRB->TagNumber = tag[1 ]; -DC390_write8 (ScsiFifo, tag[1 ]); +if ((pDCB->SyncMode &EN_TAG_QUEUEING ) && disc_allowed && (scmd->flags &SCMD_TAGGED )) { +DC390_write8 (ScsiFifo,MSG_SIMPLE_TAG ); + pDCB->TagMask |=1 << scmd->request->tag; + pSRB->TagNumber = scmd->request->tag; +DC390_write8 (ScsiFifo, scmd->request->tag);DEBUG1 (printk (KERN_INFO "DC390: Select w/DisCn for SRB %p, block tag %02x\n" , pSRB, tag[1 ])); cmd =SEL_W_ATN3 ; }else {
include/scsi/scsi_tcq.h +0 -21
@@ -80,27 +80,6 @@ static inline void scsi_deactivate_tcq(struct scsi_device *sdev, int depth)scsi_adjust_queue_depth (sdev,0 , depth); } -/** -* scsi_populate_tag_msg - place a tag message in a buffer -* @SCpnt: pointer to the Scsi_Cmnd for the tag -* @msg: pointer to the area to place the tag -* -* Notes: -* designed to create the correct type of tag message for the -* particular request. Returns the size of the tag message. -* May return 0 if TCQ is disabled for this device. -**/ -static inline int scsi_populate_tag_msg (struct scsi_cmnd *cmd,char *msg) -{ -if (cmd->flags &SCMD_TAGGED ) { - *msg++ =MSG_SIMPLE_TAG ; - *msg++ = cmd->request->tag; -return 2 ; - } - -return 0 ; -} -static inline struct scsi_cmnd *scsi_mq_find_tag (struct Scsi_Host *shost,unsigned int hw_ctx,int tag) {
include/scsi/scsi_transport_spi.h +1 -0
@@ -157,5 +157,6 @@ int spi_populate_width_msg(unsigned char *msg, int width);int spi_populate_sync_msg (unsigned char *msg,int period,int offset);int spi_populate_ppr_msg (unsigned char *msg,int period,int offset,int width,int options); +int spi_populate_tag_msg (unsigned char *msg,struct scsi_cmnd *cmd);#endif /* SCSI_TRANSPORT_SPI_H */
Signature · 1 line
1.9.1
Hannes Reinecke
maintainerRe: [PATCH 05/11] scsi: remove abuses of scsi_populate_tag
Quoted 518 lines · Christoph Hellwig
Unless we want to build a SPI tag message we should just check
SCMD_TAGGEDinstead of reverse engineering a tag type through the use ofscsi_populate_tag_msg.Also rename the function to
spi_populate_tag_msg, make it behave like the other spi message helpers, and move it to the spi transport class.Signed-off-by Christoph Hellwig <[email protected]>--- drivers/s390/scsi/zfcp_fc.h | 14 +----- drivers/scsi/53c700.c | 2 +- drivers/scsi/aic7xxx/aic79xx_osm.c | 9 ---- drivers/scsi/aic7xxx/aic7xxx_osm.c | 10 +---- drivers/scsi/bnx2fc/bnx2fc_io.c | 18 ++------ drivers/scsi/csiostor/csio_scsi.c | 29 ++---------- drivers/scsi/esp_scsi.c | 2 +- drivers/scsi/fnic/fnic_scsi.c | 11 +---- drivers/scsi/ibmvscsi/ibmvfc.c | 16 ++----- drivers/scsi/ipr.c | 34 ++------------ drivers/scsi/lpfc/lpfc_scsi.c | 16 +------ drivers/scsi/pmcraid.c | 34 ++------------ drivers/scsi/qla2xxx/qla_iocb.c | 92 ++------------------------------------ drivers/scsi/qla2xxx/qla_mr.c | 13 ------ drivers/scsi/qla4xxx/ql4_iocb.c | 10 ----- drivers/scsi/scsi_transport_spi.c | 23 ++++++++++ drivers/scsi/tmscsim.c | 12 +++-- include/scsi/scsi_tcq.h | 21 --------- include/scsi/scsi_transport_spi.h | 1 + 19 files changed, 56 insertions(+), 311 deletions(-)drivers/s390/scsi/zfcp_fc.h +1
-13@@ -212,8 +212,6 @@ static inlinevoid zfcp_fc_scsi_to_fcp (struct fcp_cmnd *fcp,struct scsi_cmnd *scsi,u8 tm_flags) { -char tag[2 ]; -int_to_scsilun (scsi->device->lun, (struct scsi_lun *) &fcp->fc_lun);if (unlikely (tm_flags)) {@@ -221,17 +219,7 @@ void zfcp_fc_scsi_to_fcp(struct fcp_cmnd *fcp, struct scsi_cmnd *scsi,return ; } -if (scsi_populate_tag_msg (scsi, tag)) { -switch (tag[0 ]) { -case MSG_ORDERED_TAG : - fcp->fc_pri_ta |=FCP_PTA_ORDERED ; -break ; -case MSG_SIMPLE_TAG : - fcp->fc_pri_ta |=FCP_PTA_SIMPLE ; -break ; - }; - }else - fcp->fc_pri_ta =FCP_PTA_SIMPLE ; + fcp->fc_pri_ta =FCP_PTA_SIMPLE ;if (scsi->sc_data_direction ==DMA_FROM_DEVICE ) fcp->fc_flags |=FCP_CFL_RDDATA ;drivers/scsi/53c700.c +1
-1@@ -1427,7 +1427,7 @@ NCR_700_start_command(struct scsi_cmnd *SCp)if ((hostdata->tag_negotiated & (1 <<scmd_id (SCp))) && (slot->tag !=SCSI_NO_TAG && SCp->cmnd[0 ] !=REQUEST_SENSE && slot->flags !=NCR_700_FLAG_AUTOSENSE )) { - count +=scsi_populate_tag_msg (SCp, &hostdata->msgout[count]); + count +=spi_populate_tag_msg (&hostdata->msgout[count], SCp); } if(hostdata->fast &&drivers/scsi/aic7xxx/aic79xx_osm.c +0
-9@@ -1619,15 +1619,6 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev, }if ((dev->flags & (AHD_DEV_Q_TAGGED |AHD_DEV_Q_BASIC )) !=0 ) { -int msg_bytes; -uint8_t tag_msgs[2 ]; - - msg_bytes =scsi_populate_tag_msg (cmd, tag_msgs); -if (msg_bytes && tag_msgs[0 ] !=MSG_SIMPLE_TASK ) { - hscb->control |= tag_msgs[0 ]; -if (tag_msgs[0 ] ==MSG_ORDERED_TASK ) - dev->commands_since_idle_or_otag =0 ; - }else if (dev->commands_since_idle_or_otag ==AHD_OTAG_THRESH && (dev->flags &AHD_DEV_Q_TAGGED ) !=0 ) { hscb->control |=MSG_ORDERED_TASK ;drivers/scsi/aic7xxx/aic7xxx_osm.c +1
-9@@ -1501,15 +1501,7 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev, }if ((dev->flags & (AHC_DEV_Q_TAGGED |AHC_DEV_Q_BASIC )) !=0 ) { -int msg_bytes; -uint8_t tag_msgs[2 ]; - - msg_bytes =scsi_populate_tag_msg (cmd, tag_msgs); -if (msg_bytes && tag_msgs[0 ] !=MSG_SIMPLE_TASK ) { - hscb->control |= tag_msgs[0 ]; -if (tag_msgs[0 ] ==MSG_ORDERED_TASK ) - dev->commands_since_idle_or_otag =0 ; - }else if (dev->commands_since_idle_or_otag ==AHC_OTAG_THRESH +if (dev->commands_since_idle_or_otag ==AHC_OTAG_THRESH && (dev->flags &AHC_DEV_Q_TAGGED ) !=0 ) { hscb->control |=MSG_ORDERED_TASK ; dev->commands_since_idle_or_otag =0 ;drivers/scsi/bnx2fc/bnx2fc_io.c +3
-15@@ -1725,7 +1725,6 @@ void bnx2fc_build_fcp_cmnd(struct bnx2fc_cmd *io_req, struct fcp_cmnd *fcp_cmnd) {struct scsi_cmnd *sc_cmd = io_req->sc_cmd; -char tag[2 ];memset (fcp_cmnd,0 ,sizeof (struct fcp_cmnd ));@@ -1739,21 +1738,10 @@ void bnx2fc_build_fcp_cmnd(struct bnx2fc_cmd *io_req, fcp_cmnd->fc_tm_flags = io_req->mp_req.tm_flags; fcp_cmnd->fc_flags = io_req->io_req_flags; -if (scsi_populate_tag_msg (sc_cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - fcp_cmnd->fc_pri_ta =FCP_PTA_HEADQ ; -break ; -case ORDERED_QUEUE_TAG : - fcp_cmnd->fc_pri_ta =FCP_PTA_ORDERED ; -break ; -default : - fcp_cmnd->fc_pri_ta =FCP_PTA_SIMPLE ; -break ; - } - }else { +if (sc_cmd->flags &SCMD_TAGGED ) + fcp_cmnd->fc_pri_ta =FCP_PTA_SIMPLE ; +else fcp_cmnd->fc_pri_ta =0 ; - } } static void bnx2fc_parse_fcp_rsp(struct bnx2fc_cmd *io_req,drivers/scsi/csiostor/csio_scsi.c +4
-25@@ -152,28 +152,6 @@ csio_scsi_itnexus_loss_error(uint16_t error)return 0 ; } -static inline void -csio_scsi_tag (struct scsi_cmnd *scmnd,uint8_t *tag,uint8_t hq, -uint8_t oq,uint8_t sq) -{ -char stag[2 ]; - -if (scsi_populate_tag_msg (scmnd, stag)) { -switch (stag[0 ]) { -case HEAD_OF_QUEUE_TAG : - *tag = hq; -break ; -case ORDERED_QUEUE_TAG : - *tag = oq; -break ; -default : - *tag = sq; -break ; - } - }else - *tag =0 ; -} -/* * csio_scsi_fcp_cmnd - Frame the SCSI FCP command paylod. * @req: IO req structure. @@ -192,11 +170,12 @@ csio_scsi_fcp_cmnd(struct csio_ioreq *req, void *addr)int_to_scsilun (scmnd->device->lun, &fcp_cmnd->fc_lun); fcp_cmnd->fc_tm_flags =0 ; fcp_cmnd->fc_cmdref =0 ; - fcp_cmnd->fc_pri_ta =0 ;memcpy (fcp_cmnd->fc_cdb, scmnd->cmnd,16 ); -csio_scsi_tag (scmnd, &fcp_cmnd->fc_pri_ta, -FCP_PTA_HEADQ ,FCP_PTA_ORDERED ,FCP_PTA_SIMPLE ); +if (scmnd->flags &SCMD_TAGGED ) + fcp_cmnd->fc_pri_ta =FCP_PTA_SIMPLE ; +else + fcp_cmnd->fc_pri_ta =0 ; fcp_cmnd->fc_dl =cpu_to_be32 (scsi_bufflen (scmnd));if (req->nsge)drivers/scsi/esp_scsi.c +1
-1@@ -663,7 +663,7 @@ static struct esp_cmd_entry *find_and_prep_issuable_command(struct esp *esp)return ent; } -if (!scsi_populate_tag_msg (cmd, &ent->tag[0 ])) { +if (!spi_populate_tag_msg (&ent->tag[0 ], cmd)) { ent->tag[0 ] =0 ; ent->tag[1 ] =0 ; }drivers/scsi/fnic/fnic_scsi.c +2
-9@@ -325,13 +325,11 @@ static inline int fnic_queue_wq_copy_desc(struct fnic *fnic,struct fc_rport_libfc_priv *rp = rport->dd_data;struct host_sg_desc *desc;struct misc_stats *misc_stats = &fnic->fnic_stats.misc_stats; -u8 pri_tag =0 ;unsigned int i;unsigned long intr_flags;int flags;u8 exch_flags;struct scsi_lun fc_lun; -char msg[2 ];if (sg_count) {/* For each SGE, create a device desc entry */ @@ -357,12 +355,6 @@ static inline int fnic_queue_wq_copy_desc(struct fnic *fnic,int_to_scsilun (sc->device->lun, &fc_lun); - pri_tag =FCPIO_ICMND_PTA_SIMPLE ; - msg[0 ] =MSG_SIMPLE_TAG ; -scsi_populate_tag_msg (sc, msg); -if (msg[0 ] ==MSG_ORDERED_TAG ) - pri_tag =FCPIO_ICMND_PTA_ORDERED ; -/* Enqueue the descriptor in the Copy WQ */ spin_lock_irqsave (&fnic->wq_copy_lock[0 ], intr_flags);@@ -394,7 +386,8 @@ static inline int fnic_queue_wq_copy_desc(struct fnic *fnic, io_req->sgl_list_pa, io_req->sense_buf_pa,0 ,/* scsi cmd ref, always 0 */ - pri_tag,/* scsi pri and tag */ +FCPIO_ICMND_PTA_SIMPLE , +/* scsi pri and tag */ flags,/* command flags */ sc->cmnd, sc->cmd_len, scsi_bufflen(sc),drivers/scsi/ibmvscsi/ibmvfc.c +3
-13@@ -1643,19 +1643,9 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,int_to_scsilun (cmnd->device->lun, &vfc_cmd->iu.lun);memcpy (vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len); -if (scsi_populate_tag_msg (cmnd, tag)) { - vfc_cmd->task_tag =cpu_to_be64 (tag[1 ]); -switch (tag[0 ]) { -case MSG_SIMPLE_TAG : - vfc_cmd->iu.pri_task_attr =IBMVFC_SIMPLE_TASK ; -break ; -case MSG_HEAD_TAG : - vfc_cmd->iu.pri_task_attr =IBMVFC_HEAD_OF_QUEUE ; -break ; -case MSG_ORDERED_TAG : - vfc_cmd->iu.pri_task_attr =IBMVFC_ORDERED_TASK ; -break ; - }; +if (cmnd->flags &SCMD_TAGGED ) { + vfc_cmd->task_tag =cpu_to_be64 (cmnd->tag); + vfc_cmd->iu.pri_task_attr =IBMVFC_SIMPLE_TASK ; }if (likely (!(rc =ibmvfc_map_sg_data (cmnd, evt, vfc_cmd, vhost->dev))))drivers/scsi/ipr.c +4
-30@@ -5752,35 +5752,6 @@ static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg, }/** -* ipr_get_task_attributes - Translate SPI Q-Tag to task attributes -* @scsi_cmd: scsi command struct -* -* Return value: -* task attributes -**/ -static u8 ipr_get_task_attributes (struct scsi_cmnd *scsi_cmd) -{ -u8 tag[2 ]; -u8 rc =IPR_FLAGS_LO_UNTAGGED_TASK ; - -if (scsi_populate_tag_msg (scsi_cmd, tag)) { -switch (tag[0 ]) { -case MSG_SIMPLE_TAG : - rc =IPR_FLAGS_LO_SIMPLE_TASK ; -break ; -case MSG_HEAD_TAG : - rc =IPR_FLAGS_LO_HEAD_OF_Q_TASK ; -break ; -case MSG_ORDERED_TAG : - rc =IPR_FLAGS_LO_ORDERED_TASK ; -break ; - }; - } - -return rc; -} - -/** * ipr_erp_done - Process completion of ERP for a device * @ipr_cmd: ipr command struct * @@ -6315,7 +6286,10 @@ static int ipr_queuecommand(struct Scsi_Host *shost, ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_DELAY_AFTER_RST ; } ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_ALIGNED_BFR ; - ioarcb->cmd_pkt.flags_lo |=ipr_get_task_attributes (scsi_cmd); +if (scsi_cmd->flags &SCMD_TAGGED ) + ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_SIMPLE_TASK ; +else + ioarcb->cmd_pkt.flags_lo |=IPR_FLAGS_LO_UNTAGGED_TASK ; } if (scsi_cmd->cmnd[0] >= 0xC0 &&drivers/scsi/lpfc/lpfc_scsi.c +1
-15@@ -4266,7 +4266,6 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;struct lpfc_iocbq *piocbq = &(lpfc_cmd->cur_iocbq);int datadir = scsi_cmnd->sc_data_direction; -char tag[2 ];uint8_t *ptr;bool sli4;uint32_t fcpdl;@@ -4288,20 +4287,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,memset (ptr,0 , (LPFC_FCP_CDB_LEN - scsi_cmnd->cmd_len)); } -if (scsi_populate_tag_msg (scsi_cmnd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - fcp_cmnd->fcpCntl1 =HEAD_OF_Q ; -break ; -case ORDERED_QUEUE_TAG : - fcp_cmnd->fcpCntl1 =ORDERED_Q ; -break ; -default : - fcp_cmnd->fcpCntl1 =SIMPLE_Q ; -break ; - } - }else - fcp_cmnd->fcpCntl1 =SIMPLE_Q ; + fcp_cmnd->fcpCntl1 =SIMPLE_Q ; sli4 = (phba->sli_rev ==LPFC_SLI_REV4 ); piocbq->iocb.un.fcpi.fcpi_XRdy =0 ;drivers/scsi/pmcraid.c +3
-31@@ -3169,36 +3169,6 @@ static int pmcraid_eh_host_reset_handler(struct scsi_cmnd *scmd) }/** -* pmcraid_task_attributes - Translate SPI Q-Tags to task attributes -* @scsi_cmd: scsi command struct -* -* Return value -* number of tags or 0 if the task is not tagged -*/ -static u8 pmcraid_task_attributes (struct scsi_cmnd *scsi_cmd) -{ -char tag[2 ]; -u8 rc =0 ; - -if (scsi_populate_tag_msg (scsi_cmd, tag)) { -switch (tag[0 ]) { -case MSG_SIMPLE_TAG : - rc =TASK_TAG_SIMPLE ; -break ; -case MSG_HEAD_TAG : - rc =TASK_TAG_QUEUE_HEAD ; -break ; -case MSG_ORDERED_TAG : - rc =TASK_TAG_ORDERED ; -break ; - }; - } - -return rc; -} - - -/** * pmcraid_init_ioadls - initializes IOADL related fields in IOARCB * @cmd: pmcraid command struct * @sgcount: count of scatter-gather elements @@ -3553,7 +3523,9 @@ static int pmcraid_queuecommand_lck( } ioarcb->request_flags0 |=NO_LINK_DESCS ; - ioarcb->request_flags1 |=pmcraid_task_attributes (scsi_cmd); + +if (scsi_cmd->flags &SCMD_TAGGED ) + ioarcb->request_flags1 |=TASK_TAG_SIMPLE ;if (RES_IS_GSCSI (res->cfg_entry)) ioarcb->request_flags1 |=DELAY_AFTER_RESET ;drivers/scsi/qla2xxx/qla_iocb.c +2
-52@@ -325,7 +325,6 @@ qla2x00_start_scsi(srb_t *sp)struct qla_hw_data *ha;struct req_que *req;struct rsp_que *rsp; -char tag[2 ];/* Setup device pointers. */ ret =0 ;@@ -404,26 +403,7 @@ qla2x00_start_scsi(srb_t *sp)/* Set target ID and LUN number*/ SET_TARGET_ID (ha, cmd_pkt->target, sp->fcport->loop_id); cmd_pkt->lun =cpu_to_le16 (cmd->device->lun); - -/* Update tagged queuing modifier */ -if (scsi_populate_tag_msg (cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - cmd_pkt->control_flags = -__constant_cpu_to_le16 (CF_HEAD_TAG ); -break ; -case ORDERED_QUEUE_TAG : - cmd_pkt->control_flags = -__constant_cpu_to_le16 (CF_ORDERED_TAG ); -break ; -default : - cmd_pkt->control_flags = -__constant_cpu_to_le16 (CF_SIMPLE_TAG ); -break ; - } - }else { - cmd_pkt->control_flags =__constant_cpu_to_le16 (CF_SIMPLE_TAG ); - } + cmd_pkt->control_flags =__constant_cpu_to_le16 (CF_SIMPLE_TAG );/* Load SCSI command packet. */ memcpy (cmd_pkt->scsi_cdb, cmd->cmnd, cmd->cmd_len);@@ -1264,7 +1244,6 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt,uint16_t fcp_cmnd_len;struct fcp_cmnd *fcp_cmnd;dma_addr_t crc_ctx_dma; -char tag[2 ]; cmd =GET_CMD_SP (sp);@@ -1356,25 +1335,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt, cmd_pkt->fcp_cmnd_dseg_address[1 ] =cpu_to_le32 (MSD (crc_ctx_dma +CRC_CONTEXT_FCPCMND_OFF )); fcp_cmnd->task_management =0 ; - -/* -* Update tagged queuing modifier if using command tag queuing -*/ -if (scsi_populate_tag_msg (cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - fcp_cmnd->task_attribute =TSK_HEAD_OF_QUEUE ; -break ; -case ORDERED_QUEUE_TAG : - fcp_cmnd->task_attribute =TSK_ORDERED ; -break ; -default : - fcp_cmnd->task_attribute =TSK_SIMPLE ; -break ; - } - }else { - fcp_cmnd->task_attribute =TSK_SIMPLE ; - } + fcp_cmnd->task_attribute =TSK_SIMPLE ; cmd_pkt->fcp_rsp_dseg_len =0 ;/* Let response come in status iocb */ @@ -1495,7 +1456,6 @@ qla24xx_start_scsi(srb_t *sp)struct scsi_cmnd *cmd =GET_CMD_SP (sp);struct scsi_qla_host *vha = sp->fcport->vha;struct qla_hw_data *ha = vha->hw; -char tag[2 ];/* Setup device pointers. */ ret =0 ;@@ -1578,22 +1538,7 @@ qla24xx_start_scsi(srb_t *sp)int_to_scsilun (cmd->device->lun, &cmd_pkt->lun);host_to_fcp_swap ((uint8_t *)&cmd_pkt->lun,sizeof (cmd_pkt->lun)); -/* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */ -if (scsi_populate_tag_msg (cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - cmd_pkt->task =TSK_HEAD_OF_QUEUE ; -break ; -case ORDERED_QUEUE_TAG : - cmd_pkt->task =TSK_ORDERED ; -break ; -default :
drivers/scsi/qla2xxx/qla_iocb.c qla24xx_start_scsi(srb_t *sp) · line 1544
Quoted 10 lines
drivers/scsi/qla2xxx/qla_iocb.c +1
-6- cmd_pkt->task =TSK_SIMPLE ; -break ; - } - }else { - cmd_pkt->task =TSK_SIMPLE ; - } + cmd_pkt->task =TSK_SIMPLE ;/* Load SCSI command packet. */ memcpy (cmd_pkt->fcp_cdb, cmd->cmnd, cmd->cmd_len);
Hmm. Either ->task needs to be initialized with TSK_SIMPLE (=0), then it's missing with the other instances below.
Or it doesn't, but then this line is pointless.
For clarification I'd rather have it set explicitly below.
Quoted 142 lines
drivers/scsi/qla2xxx/qla_iocb.c +0
-31@@ -2310,7 +2255,6 @@ qla82xx_start_scsi(srb_t *sp)struct qla_hw_data *ha = vha->hw;struct req_que *req =NULL ;struct rsp_que *rsp =NULL ; -char tag[2 ];/* Setup device pointers. */ ret =0 ;@@ -2489,22 +2433,6 @@ sufficient_dsds:else if (cmd->sc_data_direction ==DMA_FROM_DEVICE ) ctx->fcp_cmnd->additional_cdb_len |=2 ; -/* -* Update tagged queuing modifier -- default is TSK_SIMPLE (0). -*/ -if (scsi_populate_tag_msg (cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - ctx->fcp_cmnd->task_attribute = -TSK_HEAD_OF_QUEUE ; -break ; -case ORDERED_QUEUE_TAG : - ctx->fcp_cmnd->task_attribute = -TSK_ORDERED ; -break ; - } - } -/* Populate the FCP_PRIO. */ if (ha->flags.fcp_prio_enabled) ctx->fcp_cmnd->task_attribute |=@@ -2565,20 +2493,6 @@ sufficient_dsds:host_to_fcp_swap ((uint8_t *)&cmd_pkt->lun,sizeof (cmd_pkt->lun)); -/* -* Update tagged queuing modifier -- default is TSK_SIMPLE (0). -*/ -if (scsi_populate_tag_msg (cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - cmd_pkt->task =TSK_HEAD_OF_QUEUE ; -break ; -case ORDERED_QUEUE_TAG : - cmd_pkt->task =TSK_ORDERED ; -break ; - } - } -/* Populate the FCP_PRIO. */ if (ha->flags.fcp_prio_enabled) cmd_pkt->task |= sp->fcport->fcp_prio <<3 ;drivers/scsi/qla2xxx/qla_mr.c +0
-13@@ -3086,7 +3086,6 @@ qlafx00_start_scsi(srb_t *sp)struct cmd_type_7_fx00 *cmd_pkt;struct cmd_type_7_fx00 lcmd_pkt;struct scsi_lun llun; -char tag[2 ];/* Setup device pointers. */ ret =0 ;@@ -3157,18 +3156,6 @@ qlafx00_start_scsi(srb_t *sp)host_to_adap ((uint8_t *)&llun, (uint8_t *)&lcmd_pkt.lun,sizeof (lcmd_pkt.lun)); -/* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */ -if (scsi_populate_tag_msg (cmd, tag)) { -switch (tag[0 ]) { -case HEAD_OF_QUEUE_TAG : - lcmd_pkt.task =TSK_HEAD_OF_QUEUE ; -break ; -case ORDERED_QUEUE_TAG : - lcmd_pkt.task =TSK_ORDERED ; -break ; - } - } -/* Load SCSI command packet. */ host_to_adap (cmd->cmnd, lcmd_pkt.fcp_cdb,sizeof (lcmd_pkt.fcp_cdb)); lcmd_pkt.byte_count =cpu_to_le32 ((uint32_t )scsi_bufflen (cmd));drivers/scsi/qla4xxx/ql4_iocb.c +0
-10@@ -280,7 +280,6 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)uint16_t req_cnt;unsigned long flags;uint32_t index; -char tag[2 ];/* Get real lun and adapter */ ddb_entry = srb->ddb;@@ -352,15 +351,6 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)/* Set tagged queueing control flags */ cmd_entry->control_flags |=CF_SIMPLE_TAG ; -if (scsi_populate_tag_msg (cmd, tag)) -switch (tag[0 ]) { -case MSG_HEAD_TAG : - cmd_entry->control_flags |=CF_HEAD_TAG ; -break ; -case MSG_ORDERED_TAG : - cmd_entry->control_flags |=CF_ORDERED_TAG ; -break ; - }qla4xxx_advance_req_ring_ptr (ha);qla4xxx_build_scsi_iocbs (srb, cmd_entry, tot_dsds);drivers/scsi/scsi_transport_spi.c +16
-0@@ -32,6 +32,7 @@#include <scsi/scsi_host.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_eh.h> +#include <scsi/scsi_tcq.h> #include <scsi/scsi_transport.h> #include <scsi/scsi_transport_spi.h> @@ -1207,6 +1208,28 @@ int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, }EXPORT_SYMBOL_GPL (spi_populate_ppr_msg); +/** +* scsi_populate_tag_msg - place a tag message in a buffer +* @msg: pointer to the area to place the tag +* @cmd: pointer to the scsi command for the tag +* +* Notes: +* designed to create the correct type of tag message for the +* particular request. Returns the size of the tag message. +* May return 0 if TCQ is disabled for this device. +**/ +int spi_populate_tag_msg (unsigned char *msg,struct scsi_cmnd *cmd) +{ +if (cmd->flags &SCMD_TAGGED ) { + *msg++ =MSG_SIMPLE_TAG ; + *msg++ = cmd->request->tag;
drivers/scsi/scsi_transport_spi.c int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, · line 1235
Quoted 10 lines
drivers/scsi/scsi_transport_spi.c +7
-0+return 2 ; + } + +return 0 ; +} +EXPORT_SYMBOL_GPL (spi_populate_tag_msg); +#ifdef CONFIG_SCSI_CONSTANTS static const char *const one_byte_msgs[] = { /* 0x00 */ "Task Complete", NULL /* Extended Message */, "Save Pointers",
The function description needs to be adapted; it still refers to the original function name 'scsi_populate_tag_msg;
Quoted 75 lines
drivers/scsi/tmscsim.c +5
-7@@ -243,7 +243,6 @@#include <scsi/scsicam.h> #include <scsi/scsi_tcq.h> -#define DC390_BANNER "Tekram DC390/AM53C974"#define DC390_VERSION "2.1d 2004-05-27"@@ -508,7 +507,6 @@ dc390_StartSCSI( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srstruct scsi_cmnd *scmd = pSRB->pcmd;struct scsi_device *sdev = scmd->device;u8 cmd, disc_allowed, try_sync_nego; -char tag[2 ]; pSRB->ScsiPhase =SCSI_NOP0 ;@@ -560,11 +558,11 @@ dc390_StartSCSI( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_sr cmd =SEL_W_ATN ;DC390_write8 (ScsiFifo,IDENTIFY (disc_allowed, pDCB->TargetLUN));/* Change 99/05/31: Don't use tags when not disconnecting (BUSY) */ -if ((pDCB->SyncMode &EN_TAG_QUEUEING ) && disc_allowed &&scsi_populate_tag_msg (scmd, tag)) { -DC390_write8 (ScsiFifo, tag[0 ]); - pDCB->TagMask |=1 << tag[1 ]; - pSRB->TagNumber = tag[1 ]; -DC390_write8 (ScsiFifo, tag[1 ]); +if ((pDCB->SyncMode &EN_TAG_QUEUEING ) && disc_allowed && (scmd->flags &SCMD_TAGGED )) { +DC390_write8 (ScsiFifo,MSG_SIMPLE_TAG ); + pDCB->TagMask |=1 << scmd->request->tag; + pSRB->TagNumber = scmd->request->tag; +DC390_write8 (ScsiFifo, scmd->request->tag);DEBUG1 (printk (KERN_INFO "DC390: Select w/DisCn for SRB %p, block tag %02x\n" , pSRB, tag[1 ])); cmd =SEL_W_ATN3 ; }else {include/scsi/scsi_tcq.h +0
-21@@ -80,27 +80,6 @@ static inline void scsi_deactivate_tcq(struct scsi_device *sdev, int depth)scsi_adjust_queue_depth (sdev,0 , depth); } -/** -* scsi_populate_tag_msg - place a tag message in a buffer -* @SCpnt: pointer to the Scsi_Cmnd for the tag -* @msg: pointer to the area to place the tag -* -* Notes: -* designed to create the correct type of tag message for the -* particular request. Returns the size of the tag message. -* May return 0 if TCQ is disabled for this device. -**/ -static inline int scsi_populate_tag_msg (struct scsi_cmnd *cmd,char *msg) -{ -if (cmd->flags &SCMD_TAGGED ) { - *msg++ =MSG_SIMPLE_TAG ; - *msg++ = cmd->request->tag; -return 2 ; - } - -return 0 ; -} -static inline struct scsi_cmnd *scsi_mq_find_tag (struct Scsi_Host *shost,unsigned int hw_ctx,int tag) {include/scsi/scsi_transport_spi.h +0
-0
include/scsi/scsi_transport_spi.h int spi_populate_width_msg(unsigned char *msg, int width); · line 162
Quoted 6 lines
include/scsi/scsi_transport_spi.h +1
-0@@ -157,5 +157,6 @@ int spi_populate_width_msg(unsigned char *msg, int width);int spi_populate_sync_msg (unsigned char *msg,int period,int offset);int spi_populate_ppr_msg (unsigned char *msg,int period,int offset,int width,int options); +int spi_populate_tag_msg (unsigned char *msg,struct scsi_cmnd *cmd);#endif /* SCSI_TRANSPORT_SPI_H */
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 05/11] scsi: remove abuses of scsi_populate_tag
Quoted 5 lines
Hmm. Either ->task needs to be initialized with
TSK_SIMPLE(=0), then it's missing with the other instances below.
Or it doesn't, but then this line is pointless.For clarification I'd rather have it set explicitly below.
This just keeps the inconsistency the driver already had. If the
qlogic folks care it could be cleaned up later.
Quoted 2 lines
The function description needs to be adapted; it still refers to the original function name '
scsi_populate_tag_msg;
Thanks, fixed.
PATCH 6/11 mptfusion: don't change queue type in ->change_queue_depth
In reply to Christoph HellwigThis function shouldn't change the queue type, just the depth.
--- drivers/message/fusion/mptscsih.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/message/fusion/mptscsih.c +1 -6
@@ -2322,7 +2322,6 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)VirtTarget *vtarget;struct scsi_target *starget;int max_depth; -int tagged;MPT_ADAPTER *ioc = hd->ioc; starget =scsi_target (sdev);
@@ -2347,12 +2346,8 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)if (qdepth > max_depth) qdepth = max_depth; -if (qdepth ==1 ) - tagged =0 ; -else - tagged =MSG_SIMPLE_TAG ; -scsi_adjust_queue_depth (sdev, tagged, qdepth); +scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth);return sdev->queue_depth; }
Signature · 1 line
1.9.1
Re: [PATCH 06/11] mptfusion: don't change queue type in ->change_queue_depth
Quoted 24 lines · Christoph Hellwig
This function shouldn't change the queue type, just the depth.
Signed-off-by Christoph Hellwig <[email protected]>--- drivers/message/fusion/mptscsih.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)drivers/message/fusion/mptscsih.c +0
-1@@ -2322,7 +2322,6 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)VirtTarget *vtarget;struct scsi_target *starget;int max_depth; -int tagged;MPT_ADAPTER *ioc = hd->ioc; starget =scsi_target (sdev);@@ -2347,12 +2346,8 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)if (qdepth > max_depth) qdepth = max_depth;
drivers/message/fusion/mptscsih.c mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) · line 2353
Quoted 10 lines
drivers/message/fusion/mptscsih.c +1
-5-if (qdepth ==1 ) - tagged =0 ; -else - tagged =MSG_SIMPLE_TAG ; -scsi_adjust_queue_depth (sdev, tagged, qdepth); +scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth);return sdev->queue_depth; }
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 06/11] mptfusion: don't change queue type in ->change_queue_depth
In reply to Christoph HellwigQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Christoph> This function shouldn't change the queue type, just the Christoph> depth.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
PATCH 7/11 scsi: remove use_blk_tcq Scsi_Host field
In reply to Christoph Hellwig--- include/scsi/scsi_host.h | 1 - 1 file changed, 1 deletion(-)
include/scsi/scsi_host.h +0 -1
@@ -642,7 +642,6 @@ struct Scsi_Host { unsigned active_mode:2; unsigned unchecked_isa_dma:1; unsigned use_clustering:1; - unsigned use_blk_tcq:1;/* * Host has requested that no further requests come through for the
Signature · 1 line
1.9.1
Re: [PATCH 07/11] scsi: remove use_blk_tcq Scsi_Host field
Quoted 11 lines · Christoph Hellwig
Signed-off-by Christoph Hellwig <[email protected]>--- include/scsi/scsi_host.h | 1 - 1 file changed, 1 deletion(-)include/scsi/scsi_host.h +0
-0
include/scsi/scsi_host.h struct Scsi_Host { · line 647
Quoted 7 lines
include/scsi/scsi_host.h +0
-1@@ -642,7 +642,6 @@ struct Scsi_Host { unsigned active_mode:2; unsigned unchecked_isa_dma:1; unsigned use_clustering:1; - unsigned use_blk_tcq:1;/* * Host has requested that no further requests come through for the
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 07/11] scsi: remove use_blk_tcq Scsi_Host field
In reply to Christoph HellwigQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
PATCH 8/11 scsi: always assign block layer tags if enabled
In reply to Christoph HellwigAllow a driver to ask for block layer tags by setting .use_blk_tags in the host template, in which case it will always see a valid value in request->tag, similar to the behavior when using blk-mq. This means even SCSI "untagged" commands will now have a tag, which is especially useful when using a host-wide tag map.
--- Documentation/scsi/scsi_mid_low_api.txt | 38 +-------------------------------- drivers/message/fusion/mptsas.c | 1 + drivers/scsi/53c700.c | 12 +++++------ drivers/scsi/aic7xxx/aic79xx_osm.c | 11 +++++----- drivers/scsi/aic7xxx/aic7xxx_osm.c | 11 +++++----- drivers/scsi/aic94xx/aic94xx_init.c | 1 + drivers/scsi/bfa/bfad_im.c | 8 +++---- drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 1 + drivers/scsi/csiostor/csio_scsi.c | 8 +++---- drivers/scsi/esas2r/esas2r_main.c | 12 +++++------ drivers/scsi/esp_scsi.c | 6 +++--- drivers/scsi/fcoe/fcoe.c | 1 + drivers/scsi/fnic/fnic_main.c | 3 ++- drivers/scsi/ibmvscsi/ibmvfc.c | 11 +++++----- drivers/scsi/ipr.c | 1 + drivers/scsi/isci/init.c | 1 + drivers/scsi/libfc/fc_fcp.c | 7 +----- drivers/scsi/libsas/sas_scsi_host.c | 11 +++------- drivers/scsi/lpfc/lpfc_scsi.c | 7 +++--- drivers/scsi/mvsas/mv_init.c | 1 + drivers/scsi/pm8001/pm8001_init.c | 1 + drivers/scsi/pmcraid.c | 4 ++-- drivers/scsi/qla2xxx/qla_os.c | 6 ++---- drivers/scsi/qla4xxx/ql4_os.c | 10 ++------- drivers/scsi/scsi.c | 12 ++++------- drivers/scsi/scsi_scan.c | 6 ++++++ drivers/scsi/stex.c | 10 ++------- drivers/scsi/tmscsim.c | 3 ++- drivers/scsi/ufs/ufshcd.c | 5 +++-- drivers/target/loopback/tcm_loop.c | 2 +- drivers/usb/storage/uas.c | 4 ++-- include/scsi/scsi_host.h | 5 +++++ include/scsi/scsi_tcq.h | 34 ----------------------------- 33 files changed, 86 insertions(+), 168 deletions(-)
Documentation/scsi/scsi_mid_low_api.txt +1 -37
@@ -366,13 +366,11 @@ is initialized. The functions below are listed alphabetically and their names all start with "scsi_". Summary: - scsi_activate_tcq - turn on tag command queueing scsi_add_device - creates new scsi device (lu) instance scsi_add_host - perform sysfs registration and set up transport class scsi_adjust_queue_depth - change the queue depth on a SCSI device scsi_bios_ptable - return copy of block device's partition table scsi_block_requests - prevent further commands being queued to given host - scsi_deactivate_tcq - turn off tag command queueing scsi_host_alloc - return a new scsi_host instance whose refcount==1 scsi_host_get - increments Scsi_Host instance's refcount scsi_host_put - decrements Scsi_Host instance's refcount (free if 0)
@@ -390,24 +388,6 @@ Summary: Details: /** - * scsi_activate_tcq - turn on tag command queueing ("ordered" task attribute) - * @sdev: device to turn on TCQ for - * @depth: queue depth - * - * Returns nothing - * - * Might block: no - * - * Notes: Eventually, it is hoped depth would be the maximum depth - * the device could cope with and the real queue depth - * would be adjustable from 0 to depth. - * - * Defined (inline) in: include/scsi/scsi_tcq.h - **/ -void scsi_activate_tcq(struct scsi_device *sdev, int depth) - - -/** * scsi_add_device - creates new scsi device (lu) instance * @shost: pointer to scsi host instance * @channel: channel number (rarely other than 0)
@@ -471,9 +451,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device * dev) * * Notes: Can be invoked any time on a SCSI device controlled by this * LLD. [Specifically during and after slave_configure() and prior to - * slave_destroy().] Can safely be invoked from interrupt code. Actual - * queue depth change may be delayed until the next command is being - * processed. See also scsi_activate_tcq() and scsi_deactivate_tcq(). + * slave_destroy().] Can safely be invoked from interrupt code. * * Defined in: drivers/scsi/scsi.c [see source code for more notes] *
@@ -515,20 +493,6 @@ void scsi_block_requests(struct Scsi_Host * shost) /** - * scsi_deactivate_tcq - turn off tag command queueing - * @sdev: device to turn off TCQ for - * @depth: queue depth (stored in sdev) - * - * Returns nothing - * - * Might block: no - * - * Defined (inline) in: include/scsi/scsi_tcq.h - **/ -void scsi_deactivate_tcq(struct scsi_device *sdev, int depth) - - -/** * scsi_host_alloc - create a scsi host adapter instance and perform basic * initialization. * @sht: pointer to scsi host template
drivers/message/fusion/mptsas.c +1 -0
@@ -1994,6 +1994,7 @@ static struct scsi_host_template mptsas_driver_template = { .cmd_per_lun = 7, .use_clustering = ENABLE_CLUSTERING, .shost_attrs = mptscsih_host_attrs, + .use_blk_tags = 1, };static int mptsas_get_linkerrors (struct sas_phy *phy)
drivers/scsi/53c700.c +5 -7
@@ -327,6 +327,7 @@ NCR_700_detect(struct scsi_host_template *tpnt, tpnt->slave_alloc = NCR_700_slave_alloc; tpnt->change_queue_depth = NCR_700_change_queue_depth; tpnt->change_queue_type = NCR_700_change_queue_type; + tpnt->use_blk_tags =1 ;if (tpnt->name ==NULL ) tpnt->name ="53c700" ;
@@ -902,7 +903,7 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdataNCR_700_set_tag_neg_state (SCp->device,NCR_700_FINISHED_TAG_NEGOTIATION ); hostdata->tag_negotiated &= ~(1 <<scmd_id (SCp)); SCp->device->tagged_supported =0 ; -scsi_deactivate_tcq (SCp->device, host->cmd_per_lun); +scsi_adjust_queue_depth (SCp->device,0 , host->cmd_per_lun); }else { shost_printk(KERN_WARNING, host, "(%d:%d) Unexpected REJECT Message %s\n",
@@ -2049,8 +2050,7 @@ NCR_700_slave_configure(struct scsi_device *SDp)/* to do here: allocate memory; build a queue_full list */ if (SDp->tagged_supported) { -scsi_set_tag_type (SDp,MSG_ORDERED_TAG ); -scsi_activate_tcq (SDp,NCR_700_DEFAULT_TAGS ); +scsi_adjust_queue_depth (SDp,MSG_ORDERED_TAG ,NCR_700_DEFAULT_TAGS );NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); }else {/* initialise to default depth */
@@ -2094,8 +2094,6 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0 ]; -scsi_set_tag_type (SDp, tag_type); -/* We have a global (per target) flag to track whether TCQ is * enabled, so we'll be turning it off for the entire target here. * our tag algorithm will fail if we mix tagged and untagged commands,
@@ -2106,12 +2104,12 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)if (!tag_type) {/* shift back to the default unqueued number of commands * (the user can still raise this) */ -scsi_deactivate_tcq (SDp, SDp->host->cmd_per_lun); +scsi_adjust_queue_depth (SDp,0 , SDp->host->cmd_per_lun); hostdata->tag_negotiated &= ~(1 <<sdev_id (SDp)); }else {/* Here, we cleared the negotiation flag above, so this * will force the driver to renegotiate */ -scsi_activate_tcq (SDp, SDp->queue_depth); +scsi_adjust_queue_depth (SDp, tag_type, SDp->queue_depth);if (change_tag)NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); }
drivers/scsi/aic7xxx/aic79xx_osm.c +6 -5
@@ -925,6 +925,7 @@ struct scsi_host_template aic79xx_driver_template = { .slave_configure = ahd_linux_slave_configure, .target_alloc = ahd_linux_target_alloc, .target_destroy = ahd_linux_target_destroy, + .use_blk_tags = 1, };/******************************** Bus DMA *************************************/
@@ -1468,12 +1469,12 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,switch ((dev->flags & (AHD_DEV_Q_BASIC |AHD_DEV_Q_TAGGED ))) {case AHD_DEV_Q_BASIC : -scsi_set_tag_type (sdev,MSG_SIMPLE_TASK ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , + dev->openings + dev->active);break ;case AHD_DEV_Q_TAGGED : -scsi_set_tag_type (sdev,MSG_ORDERED_TASK ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , + dev->openings + dev->active);break ;default :/*
@@ -1482,7 +1483,7 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_deactivate_tcq (sdev,1 ); +scsi_adjust_queue_depth (sdev,0 ,1 );break ; } }
drivers/scsi/aic7xxx/aic7xxx_osm.c +6 -5
@@ -812,6 +812,7 @@ struct scsi_host_template aic7xxx_driver_template = { .slave_configure = ahc_linux_slave_configure, .target_alloc = ahc_linux_target_alloc, .target_destroy = ahc_linux_target_destroy, + .use_blk_tags = 1, };/**************************** Tasklet Handler *********************************/
@@ -1334,12 +1335,12 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, }switch ((dev->flags & (AHC_DEV_Q_BASIC |AHC_DEV_Q_TAGGED ))) {case AHC_DEV_Q_BASIC : -scsi_set_tag_type (sdev,MSG_SIMPLE_TAG ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , + dev->openings + dev->active);break ;case AHC_DEV_Q_TAGGED : -scsi_set_tag_type (sdev,MSG_ORDERED_TAG ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , + dev->openings + dev->active);break ;default :/*
@@ -1348,7 +1349,7 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_deactivate_tcq (sdev,2 ); +scsi_adjust_queue_depth (sdev,0 ,2 );break ; } }
drivers/scsi/aic94xx/aic94xx_init.c +1 -0
@@ -83,6 +83,7 @@ static struct scsi_host_template aic94xx_sht = { .eh_bus_reset_handler = sas_eh_bus_reset_handler, .target_destroy = sas_target_destroy, .ioctl = sas_ioctl, + .use_blk_tags = 1, };static int asd_map_memio (struct asd_ha_struct *asd_ha)
drivers/scsi/bfa/bfad_im.c +3 -5
@@ -776,11 +776,7 @@ bfad_thread_workq(struct bfad_s *bfad)static int bfad_im_slave_configure (struct scsi_device *sdev) { -if (sdev->tagged_supported) -scsi_activate_tcq (sdev, bfa_lun_queue_depth); -else -scsi_deactivate_tcq (sdev, bfa_lun_queue_depth); - +scsi_adjust_queue_depth (sdev,0 , bfa_lun_queue_depth);return 0 ; }
@@ -804,6 +800,7 @@ struct scsi_host_template bfad_im_scsi_host_template = { .shost_attrs = bfad_im_host_attrs, .max_sectors = BFAD_MAX_SECTORS, .vendor_id = BFA_PCI_VENDOR_ID_BROCADE, + .use_blk_tags = 1, };struct scsi_host_template bfad_im_vport_template = {
@@ -825,6 +822,7 @@ struct scsi_host_template bfad_im_vport_template = { .use_clustering = ENABLE_CLUSTERING, .shost_attrs = bfad_im_vport_attrs, .max_sectors = BFAD_MAX_SECTORS, + .use_blk_tags = 1, }; bfa_status_t
drivers/scsi/bnx2fc/bnx2fc_fcoe.c +1 -0
@@ -2790,6 +2790,7 @@ static struct scsi_host_template bnx2fc_shost_template = { .use_clustering = ENABLE_CLUSTERING, .sg_tablesize = BNX2FC_MAX_BDS_PER_CMD, .max_sectors = 1024, + .use_blk_tags = 1, };static struct libfc_function_template bnx2fc_libfc_fcn_templ = {
drivers/scsi/csiostor/csio_scsi.c +3 -5
@@ -2241,11 +2241,7 @@ csio_slave_alloc(struct scsi_device *sdev)static int csio_slave_configure (struct scsi_device *sdev) { -if (sdev->tagged_supported) -scsi_activate_tcq (sdev, csio_lun_qdepth); -else -scsi_deactivate_tcq (sdev, csio_lun_qdepth); - +scsi_adjust_queue_depth (sdev,0 , csio_lun_qdepth);return 0 ; }
@@ -2290,6 +2286,7 @@ struct scsi_host_template csio_fcoe_shost_template = { .use_clustering = ENABLE_CLUSTERING, .shost_attrs = csio_fcoe_lport_attrs, .max_sectors = CSIO_MAX_SECTOR_SIZE, + .use_blk_tags = 1, };struct scsi_host_template csio_fcoe_shost_vport_template = {
@@ -2309,6 +2306,7 @@ struct scsi_host_template csio_fcoe_shost_vport_template = { .use_clustering = ENABLE_CLUSTERING, .shost_attrs = csio_fcoe_vport_attrs, .max_sectors = CSIO_MAX_SECTOR_SIZE, + .use_blk_tags = 1, };/*
drivers/scsi/esas2r/esas2r_main.c +5 -7
@@ -260,6 +260,7 @@ static struct scsi_host_template driver_template = { .change_queue_depth = esas2r_change_queue_depth, .change_queue_type = scsi_change_queue_type, .max_sectors = 0xFFFF, + .use_blk_tags = 1, };int sgl_page_size =512 ;
@@ -1278,13 +1279,10 @@ int esas2r_slave_configure(struct scsi_device *dev)esas2r_log_dev (ESAS2R_LOG_INFO , &(dev->sdev_gendev),"esas2r_slave_configure()" ); -if (dev->tagged_supported) { -scsi_set_tag_type (dev,MSG_SIMPLE_TAG ); -scsi_activate_tcq (dev, cmd_per_lun); - }else { -scsi_set_tag_type (dev,0 ); -scsi_deactivate_tcq (dev, cmd_per_lun); - } +if (dev->tagged_supported) +scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , cmd_per_lun); +else +scsi_adjust_queue_depth (dev,0 , cmd_per_lun);return 0 ; }
drivers/scsi/esp_scsi.c +3 -3
@@ -2419,10 +2419,9 @@ static int esp_slave_configure(struct scsi_device *dev) queue_depth = dev->host->cmd_per_lun;if (goal_tags) { -scsi_set_tag_type (dev,MSG_ORDERED_TAG ); -scsi_activate_tcq (dev, queue_depth); +scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , queue_depth); }else { -scsi_deactivate_tcq (dev, queue_depth); +scsi_adjust_queue_depth (dev,0 , queue_depth); } tp->flags |=ESP_TGT_DISCONNECT ;
@@ -2631,6 +2630,7 @@ struct scsi_host_template scsi_esp_template = { .use_clustering = ENABLE_CLUSTERING, .max_sectors = 0xffff, .skip_settle_delay = 1, + .use_blk_tags = 1, };EXPORT_SYMBOL (scsi_esp_template);
drivers/scsi/fcoe/fcoe.c +1 -0
@@ -288,6 +288,7 @@ static struct scsi_host_template fcoe_shost_template = { .use_clustering = ENABLE_CLUSTERING, .sg_tablesize = SG_ALL, .max_sectors = 0xffff, + .use_blk_tags = 1, };/**
drivers/scsi/fnic/fnic_main.c +2 -1
@@ -100,7 +100,7 @@ static int fnic_slave_alloc(struct scsi_device *sdev)if (!rport ||fc_remote_port_chkready (rport))return -ENXIO ; -scsi_activate_tcq (sdev, fnic_max_qdepth); +scsi_adjust_queue_depth (sdev,0 , fnic_max_qdepth);return 0 ; }
@@ -121,6 +121,7 @@ static struct scsi_host_template fnic_host_template = { .sg_tablesize = FNIC_MAX_SG_DESC_CNT, .max_sectors = 0xffff, .shost_attrs = fnic_attrs, + .use_blk_tags = 1, }; static void
drivers/scsi/ibmvscsi/ibmvfc.c +6 -5
@@ -2888,11 +2888,11 @@ static int ibmvfc_slave_configure(struct scsi_device *sdev)if (sdev->type ==TYPE_DISK ) sdev->allow_restart =1 ; -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev,MSG_SIMPLE_TAG ); -scsi_activate_tcq (sdev, sdev->queue_depth); - }else -scsi_deactivate_tcq (sdev, sdev->queue_depth); +if (sdev->tagged_supported) +scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , + sdev->queue_depth); +else +scsi_adjust_queue_depth (sdev,0 , sdev->queue_depth);spin_unlock_irqrestore (shost->host_lock, flags);return 0 ; }
@@ -3108,6 +3108,7 @@ static struct scsi_host_template driver_template = { .max_sectors = IBMVFC_MAX_SECTORS, .use_clustering = ENABLE_CLUSTERING, .shost_attrs = ibmvfc_attrs, + .use_blk_tags = 1, };/**
drivers/scsi/ipr.c +1 -0
@@ -6410,6 +6410,7 @@ static struct scsi_host_template driver_template = { .sdev_attrs = ipr_dev_attrs, .proc_name = IPR_NAME, .no_write_same = 1, + .use_blk_tags = 1, };/**
drivers/scsi/isci/init.c +1 -0
@@ -172,6 +172,7 @@ static struct scsi_host_template isci_sht = { .target_destroy = sas_target_destroy, .ioctl = sas_ioctl, .shost_attrs = isci_host_attrs, + .use_blk_tags = 1, };static struct sas_domain_function_template isci_transport_ops = {
drivers/scsi/libfc/fc_fcp.c +1 -6
@@ -2160,12 +2160,7 @@ int fc_slave_alloc(struct scsi_device *sdev)if (!rport ||fc_remote_port_chkready (rport))return -ENXIO ; -if (sdev->tagged_supported) -scsi_activate_tcq (sdev,FC_FCP_DFLT_QUEUE_DEPTH ); -else -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), -FC_FCP_DFLT_QUEUE_DEPTH ); - +scsi_adjust_queue_depth (sdev,0 ,FC_FCP_DFLT_QUEUE_DEPTH );return 0 ; }EXPORT_SYMBOL (fc_slave_alloc);
drivers/scsi/libsas/sas_scsi_host.c +3 -8
@@ -940,15 +940,13 @@ int sas_slave_configure(struct scsi_device *scsi_dev)sas_read_port_mode_page (scsi_dev);if (scsi_dev->tagged_supported) { -scsi_set_tag_type (scsi_dev,MSG_SIMPLE_TAG ); -scsi_activate_tcq (scsi_dev,SAS_DEF_QD ); +scsi_adjust_queue_depth (scsi_dev,MSG_SIMPLE_TAG ,SAS_DEF_QD ); }else {SAS_DPRINTK ("device %llx, LUN %llx doesn't support " "TCQ\n" ,SAS_ADDR (dev->sas_addr), scsi_dev->lun); scsi_dev->tagged_supported =0 ; -scsi_set_tag_type (scsi_dev,0 ); -scsi_deactivate_tcq (scsi_dev,1 ); +scsi_adjust_queue_depth (scsi_dev,0 ,1 ); } scsi_dev->allow_restart =1 ;
@@ -991,10 +989,7 @@ int sas_change_queue_type(struct scsi_device *scsi_dev, int qt)if (!scsi_dev->tagged_supported)return 0 ; -scsi_deactivate_tcq (scsi_dev,1 ); - -scsi_set_tag_type (scsi_dev, qt); -scsi_activate_tcq (scsi_dev, scsi_dev->queue_depth); +scsi_adjust_queue_depth (scsi_dev, qt, scsi_dev->queue_depth);return qt; }
drivers/scsi/lpfc/lpfc_scsi.c +3 -4
@@ -5598,10 +5598,7 @@ lpfc_slave_configure(struct scsi_device *sdev)struct lpfc_vport *vport = (struct lpfc_vport *) sdev->host->hostdata;struct lpfc_hba *phba = vport->phba; -if (sdev->tagged_supported) -scsi_activate_tcq (sdev, vport->cfg_lun_queue_depth); -else -scsi_deactivate_tcq (sdev, vport->cfg_lun_queue_depth); +scsi_adjust_queue_depth (sdev,0 , vport->cfg_lun_queue_depth);if (phba->cfg_poll &ENABLE_FCP_RING_POLLING ) { lpfc_sli_handle_fast_ring_event(phba,
@@ -5986,6 +5983,7 @@ struct scsi_host_template lpfc_template = { .vendor_id = LPFC_NL_VENDOR_ID, .change_queue_depth = lpfc_change_queue_depth, .change_queue_type = scsi_change_queue_type, + .use_blk_tags = 1, };struct scsi_host_template lpfc_vport_template = {
@@ -6009,4 +6007,5 @@ struct scsi_host_template lpfc_vport_template = { .max_sectors = 0xFFFF, .change_queue_depth = lpfc_change_queue_depth, .change_queue_type = scsi_change_queue_type, + .use_blk_tags = 1, };
drivers/scsi/mvsas/mv_init.c +1 -0
@@ -76,6 +76,7 @@ static struct scsi_host_template mvs_sht = { .target_destroy = sas_target_destroy, .ioctl = sas_ioctl, .shost_attrs = mvst_host_attrs, + .use_blk_tags = 1, };static struct sas_domain_function_template mvs_transport_ops = {
drivers/scsi/pm8001/pm8001_init.c +1 -0
@@ -89,6 +89,7 @@ static struct scsi_host_template pm8001_sht = { .target_destroy = sas_target_destroy, .ioctl = sas_ioctl, .shost_attrs = pm8001_host_attrs, + .use_blk_tags = 1, };/**
drivers/scsi/pmcraid.c +2 -2
@@ -251,7 +251,6 @@ static int pmcraid_slave_configure(struct scsi_device *scsi_dev)if (scsi_dev->tagged_supported && (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) { -scsi_activate_tcq (scsi_dev, scsi_dev->queue_depth);scsi_adjust_queue_depth (scsi_dev,MSG_SIMPLE_TAG , scsi_dev->host->cmd_per_lun); }else {
@@ -4295,7 +4294,8 @@ static struct scsi_host_template pmcraid_host_template = { .cmd_per_lun = PMCRAID_MAX_CMD_PER_LUN, .use_clustering = ENABLE_CLUSTERING, .shost_attrs = pmcraid_host_attrs, - .proc_name = PMCRAID_DRIVER_NAME + .proc_name = PMCRAID_DRIVER_NAME, + .use_blk_tags = 1, };/*
drivers/scsi/qla2xxx/qla_os.c +2 -4
@@ -269,6 +269,7 @@ struct scsi_host_template qla2xxx_driver_template = { .shost_attrs = qla2x00_host_attrs, .supported_mode = MODE_INITIATOR, + .use_blk_tags = 1, };static struct scsi_transport_template *qla2xxx_transport_template =NULL ;
@@ -1404,10 +1405,7 @@ qla2xxx_slave_configure(struct scsi_device *sdev)if (IS_T10_PI_CAPABLE (vha->hw))blk_queue_update_dma_alignment (sdev->request_queue,0x7 ); -if (sdev->tagged_supported) -scsi_activate_tcq (sdev, req->max_q_depth); -else -scsi_deactivate_tcq (sdev, req->max_q_depth); +scsi_adjust_queue_depth (sdev,0 , req->max_q_depth);return 0 ; }
drivers/scsi/qla4xxx/ql4_os.c +2 -8
@@ -163,7 +163,6 @@ static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd);static int qla4xxx_eh_host_reset (struct scsi_cmnd *cmd);static int qla4xxx_slave_alloc (struct scsi_device *device);static int qla4xxx_slave_configure (struct scsi_device *device); -static void qla4xxx_slave_destroy (struct scsi_device *sdev);static umode_t qla4_attr_is_visible (int param_type,int param);static int qla4xxx_host_reset (struct Scsi_Host *shost,int reset_type); static int qla4xxx_change_queue_depth(struct scsi_device *sdev, int qdepth,
@@ -206,7 +205,6 @@ static struct scsi_host_template qla4xxx_driver_template = { .slave_configure = qla4xxx_slave_configure, .slave_alloc = qla4xxx_slave_alloc, - .slave_destroy = qla4xxx_slave_destroy, .change_queue_depth = qla4xxx_change_queue_depth, .this_id = -1,
@@ -218,6 +216,7 @@ static struct scsi_host_template qla4xxx_driver_template = { .shost_attrs = qla4xxx_host_attrs, .host_reset = qla4xxx_host_reset, .vendor_id = SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_QLOGIC, + .use_blk_tags = 1, };static struct iscsi_transport qla4xxx_iscsi_transport = {
@@ -9065,7 +9064,7 @@ static int qla4xxx_slave_alloc(struct scsi_device *sdev)if (ql4xmaxqdepth !=0 && ql4xmaxqdepth <=0xffffU ) queue_depth = ql4xmaxqdepth; -scsi_activate_tcq (sdev, queue_depth); +scsi_adjust_queue_depth (sdev,0 , queue_depth);return 0 ; }
@@ -9075,11 +9074,6 @@ static int qla4xxx_slave_configure(struct scsi_device *sdev)return 0 ; } -static void qla4xxx_slave_destroy (struct scsi_device *sdev) -{ -scsi_deactivate_tcq (sdev,1 ); -} -static int qla4xxx_change_queue_depth (struct scsi_device *sdev,int qdepth,int reason) {
drivers/scsi/scsi.c +4 -8
@@ -864,16 +864,12 @@ EXPORT_SYMBOL(scsi_track_queue_full);*/ int scsi_change_queue_type (struct scsi_device *sdev,int tag_type) { -if (sdev->tagged_supported) { -scsi_set_tag_type (sdev, tag_type); -if (tag_type) -scsi_activate_tcq (sdev, sdev->queue_depth); -else -scsi_deactivate_tcq (sdev, sdev->queue_depth); - }else - tag_type =0 ; +if (!sdev->tagged_supported) +return 0 ; +scsi_adjust_queue_depth (sdev, tag_type, sdev->queue_depth);return tag_type; + }EXPORT_SYMBOL (scsi_change_queue_type);
drivers/scsi/scsi_scan.c +6 -0
@@ -286,6 +286,12 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, }WARN_ON_ONCE (!blk_get_queue (sdev->request_queue)); sdev->request_queue->queuedata = sdev; + +if (!shost_use_blk_mq (sdev->host) && + (shost->bqt || shost->hostt->use_blk_tags)) { +blk_queue_init_tags (sdev->request_queue, + sdev->host->cmd_per_lun, shost->bqt); + }scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun);scsi_sysfs_device_initialize (sdev);
drivers/scsi/stex.c +2 -8
@@ -549,7 +549,7 @@ stex_slave_alloc(struct scsi_device *sdev)/* Cheat: usually extracted from Inquiry data */ sdev->tagged_supported =1 ; -scsi_activate_tcq (sdev, sdev->host->can_queue); +scsi_adjust_queue_depth (sdev,0 , sdev->host->can_queue);return 0 ; }
@@ -565,12 +565,6 @@ stex_slave_config(struct scsi_device *sdev)return 0 ; } -static void -stex_slave_destroy (struct scsi_device *sdev) -{ -scsi_deactivate_tcq (sdev,1 ); -} -static int stex_queuecommand_lck (struct scsi_cmnd *cmd,void (*done)(struct scsi_cmnd *)) {
@@ -1390,10 +1384,10 @@ static struct scsi_host_template driver_template = { .queuecommand = stex_queuecommand, .slave_alloc = stex_slave_alloc, .slave_configure = stex_slave_config, - .slave_destroy = stex_slave_destroy, .eh_abort_handler = stex_abort, .eh_host_reset_handler = stex_reset, .this_id = -1, + .use_blk_tags = 1, };static struct pci_device_id stex_pci_tbl[] = {
drivers/scsi/tmscsim.c +2 -1
@@ -2187,7 +2187,7 @@ static int dc390_slave_configure(struct scsi_device *sdev) acb->scan_devices =0 ;if (sdev->tagged_supported && (dcb->DevMode &TAG_QUEUEING_ )) { dcb->SyncMode |=EN_TAG_QUEUEING ; -scsi_activate_tcq (sdev, acb->TagMaxNum); +scsi_adjust_queue_depth (sdev,0 , acb->TagMaxNum); }return 0 ;
@@ -2209,6 +2209,7 @@ static struct scsi_host_template driver_template = { .cmd_per_lun = 1, .use_clustering = ENABLE_CLUSTERING, .max_sectors = 0x4000, /* 8MiB = 16 * 1024 * 512 */ + .use_blk_tags = 1, };/***********************************************************************
drivers/scsi/ufs/ufshcd.c +3 -2
@@ -2695,7 +2695,8 @@ static void ufshcd_set_queue_depth(struct scsi_device *sdev)dev_dbg (hba->dev,"%s: activate tcq with queue depth %d\n" , __func__, lun_qdepth); -scsi_activate_tcq (sdev, lun_qdepth); +if (sdev->tagged_supported) +scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), lun_qdepth); }/*
@@ -2842,7 +2843,6 @@ static void ufshcd_slave_destroy(struct scsi_device *sdev)struct ufs_hba *hba; hba =shost_priv (sdev->host); -scsi_deactivate_tcq (sdev, hba->nutrs);/* Drop the reference as it won't be needed anymore */ if (ufshcd_scsi_to_upiu_lun (sdev->lun) ==UFS_UPIU_UFS_DEVICE_WLUN ) hba->sdev_ufs_device =NULL ;
@@ -4235,6 +4235,7 @@ static struct scsi_host_template ufshcd_driver_template = { .cmd_per_lun = UFSHCD_CMD_PER_LUN, .can_queue = UFSHCD_CAN_QUEUE, .max_host_blocked = 1, + .use_blk_tags = 1, }; static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,
drivers/target/loopback/tcm_loop.c +1 -1
@@ -407,7 +407,6 @@ static int tcm_loop_slave_alloc(struct scsi_device *sd)static int tcm_loop_slave_configure (struct scsi_device *sd) {if (sd->tagged_supported) { -scsi_activate_tcq (sd, sd->queue_depth);scsi_adjust_queue_depth (sd,MSG_SIMPLE_TAG , sd->host->cmd_per_lun); }else {
@@ -437,6 +436,7 @@ static struct scsi_host_template tcm_loop_driver_template = { .slave_alloc = tcm_loop_slave_alloc, .slave_configure = tcm_loop_slave_configure, .module = THIS_MODULE, + .use_blk_tags = 1, };static int tcm_loop_driver_probe (struct device *dev)
drivers/usb/storage/uas.c +2 -2
@@ -799,8 +799,7 @@ static int uas_slave_configure(struct scsi_device *sdev)if (devinfo->flags &US_FL_NO_REPORT_OPCODES ) sdev->no_report_opcodes =1 ; -scsi_set_tag_type (sdev,MSG_ORDERED_TAG ); -scsi_activate_tcq (sdev, devinfo->qdepth -2 ); +scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , devinfo->qdepth -2 );return 0 ; }
@@ -824,6 +823,7 @@ static struct scsi_host_template uas_host_template = {* allocator. */ .disable_blk_mq = true, + .use_blk_tags = 1, }; #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
include/scsi/scsi_host.h +5 -0
@@ -422,6 +422,11 @@ struct scsi_host_template {unsigned char present;/* +* Let the block layer assigns tags to all commands. +*/ + unsigned use_blk_tags:1; + +/* * This specifies the mode that a LLD supports. */ unsigned supported_mode:2;
include/scsi/scsi_tcq.h +0 -34
@@ -45,40 +45,6 @@ static inline void scsi_set_tag_type(struct scsi_device *sdev, int tag)break ; } } -/** -* scsi_activate_tcq - turn on tag command queueing -* @SDpnt: device to turn on TCQ for -* @depth: queue depth -* -* Notes: -* Eventually, I hope depth would be the maximum depth -* the device could cope with and the real queue depth -* would be adjustable from 0 to depth. -**/ -static inline void scsi_activate_tcq (struct scsi_device *sdev,int depth) -{ -if (!sdev->tagged_supported) -return ; - -if (shost_use_blk_mq (sdev->host)) -queue_flag_set_unlocked (QUEUE_FLAG_QUEUED , sdev->request_queue); -else if (!blk_queue_tagged (sdev->request_queue)) -blk_queue_init_tags (sdev->request_queue, depth, - sdev->host->bqt); - -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); -} - -/** -* scsi_deactivate_tcq - turn off tag command queueing -* @SDpnt: device to turn off TCQ for -**/ -static inline void scsi_deactivate_tcq (struct scsi_device *sdev,int depth) -{ -if (blk_queue_tagged (sdev->request_queue)) -blk_queue_free_tags (sdev->request_queue); -scsi_adjust_queue_depth (sdev,0 , depth); -}static inline struct scsi_cmnd *scsi_mq_find_tag (struct Scsi_Host *shost,unsigned int hw_ctx,int tag)
Signature · 1 line
1.9.1
Hannes Reinecke
maintainerRe: [PATCH 08/11] scsi: always assign block layer tags if enabled
Quoted 253 lines · Christoph Hellwig
Allow a driver to ask for block layer tags by setting .use_blk_tags in the host template, in which case it will always see a valid value in
request->tag, similar to the behavior when using blk-mq. This means even SCSI "untagged" commands will now have a tag, which is especially useful when using a host-wide tag map.Signed-off-by Christoph Hellwig <[email protected]>--- Documentation/scsi/scsi_mid_low_api.txt | 38 +-------------------------------- drivers/message/fusion/mptsas.c | 1 + drivers/scsi/53c700.c | 12 +++++------ drivers/scsi/aic7xxx/aic79xx_osm.c | 11 +++++----- drivers/scsi/aic7xxx/aic7xxx_osm.c | 11 +++++----- drivers/scsi/aic94xx/aic94xx_init.c | 1 + drivers/scsi/bfa/bfad_im.c | 8 +++---- drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 1 + drivers/scsi/csiostor/csio_scsi.c | 8 +++---- drivers/scsi/esas2r/esas2r_main.c | 12 +++++------ drivers/scsi/esp_scsi.c | 6 +++--- drivers/scsi/fcoe/fcoe.c | 1 + drivers/scsi/fnic/fnic_main.c | 3 ++- drivers/scsi/ibmvscsi/ibmvfc.c | 11 +++++----- drivers/scsi/ipr.c | 1 + drivers/scsi/isci/init.c | 1 + drivers/scsi/libfc/fc_fcp.c | 7 +----- drivers/scsi/libsas/sas_scsi_host.c | 11 +++------- drivers/scsi/lpfc/lpfc_scsi.c | 7 +++--- drivers/scsi/mvsas/mv_init.c | 1 + drivers/scsi/pm8001/pm8001_init.c | 1 + drivers/scsi/pmcraid.c | 4 ++-- drivers/scsi/qla2xxx/qla_os.c | 6 ++---- drivers/scsi/qla4xxx/ql4_os.c | 10 ++------- drivers/scsi/scsi.c | 12 ++++------- drivers/scsi/scsi_scan.c | 6 ++++++ drivers/scsi/stex.c | 10 ++------- drivers/scsi/tmscsim.c | 3 ++- drivers/scsi/ufs/ufshcd.c | 5 +++-- drivers/target/loopback/tcm_loop.c | 2 +- drivers/usb/storage/uas.c | 4 ++-- include/scsi/scsi_host.h | 5 +++++ include/scsi/scsi_tcq.h | 34 ----------------------------- 33 files changed, 86 insertions(+), 168 deletions(-)Documentation/scsi/scsi_mid_low_api.txt +1
-37@@ -366,13 +366,11 @@ is initialized. The functions below are listed alphabetically and their names all start with "scsi_". Summary: - scsi_activate_tcq - turn on tag command queueing scsi_add_device - creates new scsi device (lu) instance scsi_add_host - perform sysfs registration and set up transport class scsi_adjust_queue_depth - change the queue depth on a SCSI device scsi_bios_ptable - return copy of block device's partition table scsi_block_requests - prevent further commands being queued to given host - scsi_deactivate_tcq - turn off tag command queueing scsi_host_alloc - return a new scsi_host instance whose refcount==1 scsi_host_get - increments Scsi_Host instance's refcount scsi_host_put - decrements Scsi_Host instance's refcount (free if 0)@@ -390,24 +388,6 @@ Summary: Details: /** - * scsi_activate_tcq - turn on tag command queueing ("ordered" task attribute) - * @sdev: device to turn on TCQ for - * @depth: queue depth - * - * Returns nothing - * - * Might block: no - * - * Notes: Eventually, it is hoped depth would be the maximum depth - * the device could cope with and the real queue depth - * would be adjustable from 0 to depth. - * - * Defined (inline) in: include/scsi/scsi_tcq.h - **/ -void scsi_activate_tcq(struct scsi_device *sdev, int depth) - - -/** * scsi_add_device - creates new scsi device (lu) instance * @shost: pointer to scsi host instance * @channel: channel number (rarely other than 0)@@ -471,9 +451,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device * dev) * * Notes: Can be invoked any time on a SCSI device controlled by this * LLD. [Specifically during and after slave_configure() and prior to - * slave_destroy().] Can safely be invoked from interrupt code. Actual - * queue depth change may be delayed until the next command is being - * processed. See also scsi_activate_tcq() and scsi_deactivate_tcq(). + * slave_destroy().] Can safely be invoked from interrupt code. * * Defined in: drivers/scsi/scsi.c [see source code for more notes] *@@ -515,20 +493,6 @@ void scsi_block_requests(struct Scsi_Host * shost) /** - * scsi_deactivate_tcq - turn off tag command queueing - * @sdev: device to turn off TCQ for - * @depth: queue depth (stored in sdev) - * - * Returns nothing - * - * Might block: no - * - * Defined (inline) in: include/scsi/scsi_tcq.h - **/ -void scsi_deactivate_tcq(struct scsi_device *sdev, int depth) - - -/** * scsi_host_alloc - create a scsi host adapter instance and perform basic * initialization. * @sht: pointer to scsi host templatedrivers/message/fusion/mptsas.c +1
-0@@ -1994,6 +1994,7 @@ static struct scsi_host_template mptsas_driver_template = { .cmd_per_lun = 7, .use_clustering = ENABLE_CLUSTERING, .shost_attrs = mptscsih_host_attrs, + .use_blk_tags = 1, };static int mptsas_get_linkerrors (struct sas_phy *phy)drivers/scsi/53c700.c +5
-7@@ -327,6 +327,7 @@ NCR_700_detect(struct scsi_host_template *tpnt, tpnt->slave_alloc = NCR_700_slave_alloc; tpnt->change_queue_depth = NCR_700_change_queue_depth; tpnt->change_queue_type = NCR_700_change_queue_type; + tpnt->use_blk_tags =1 ;if (tpnt->name ==NULL ) tpnt->name ="53c700" ;@@ -902,7 +903,7 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdataNCR_700_set_tag_neg_state (SCp->device,NCR_700_FINISHED_TAG_NEGOTIATION ); hostdata->tag_negotiated &= ~(1 <<scmd_id (SCp)); SCp->device->tagged_supported =0 ; -scsi_deactivate_tcq (SCp->device, host->cmd_per_lun); +scsi_adjust_queue_depth (SCp->device,0 , host->cmd_per_lun); }else { shost_printk(KERN_WARNING, host, "(%d:%d) Unexpected REJECT Message %s\n",@@ -2049,8 +2050,7 @@ NCR_700_slave_configure(struct scsi_device *SDp)/* to do here: allocate memory; build a queue_full list */ if (SDp->tagged_supported) { -scsi_set_tag_type (SDp,MSG_ORDERED_TAG ); -scsi_activate_tcq (SDp,NCR_700_DEFAULT_TAGS ); +scsi_adjust_queue_depth (SDp,MSG_ORDERED_TAG ,NCR_700_DEFAULT_TAGS );NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); }else {/* initialise to default depth */ @@ -2094,8 +2094,6 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0 ]; -scsi_set_tag_type (SDp, tag_type); -/* We have a global (per target) flag to track whether TCQ is * enabled, so we'll be turning it off for the entire target here. * our tag algorithm will fail if we mix tagged and untagged commands, @@ -2106,12 +2104,12 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)if (!tag_type) {/* shift back to the default unqueued number of commands * (the user can still raise this) */ -scsi_deactivate_tcq (SDp, SDp->host->cmd_per_lun); +scsi_adjust_queue_depth (SDp,0 , SDp->host->cmd_per_lun); hostdata->tag_negotiated &= ~(1 <<sdev_id (SDp)); }else {/* Here, we cleared the negotiation flag above, so this * will force the driver to renegotiate */ -scsi_activate_tcq (SDp, SDp->queue_depth); +scsi_adjust_queue_depth (SDp, tag_type, SDp->queue_depth);if (change_tag)NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); }drivers/scsi/aic7xxx/aic79xx_osm.c +6
-5@@ -925,6 +925,7 @@ struct scsi_host_template aic79xx_driver_template = { .slave_configure = ahd_linux_slave_configure, .target_alloc = ahd_linux_target_alloc, .target_destroy = ahd_linux_target_destroy, + .use_blk_tags = 1, };/******************************** Bus DMA *************************************/ @@ -1468,12 +1469,12 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,switch ((dev->flags & (AHD_DEV_Q_BASIC |AHD_DEV_Q_TAGGED ))) {case AHD_DEV_Q_BASIC : -scsi_set_tag_type (sdev,MSG_SIMPLE_TASK ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , + dev->openings + dev->active);break ;case AHD_DEV_Q_TAGGED : -scsi_set_tag_type (sdev,MSG_ORDERED_TASK ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , + dev->openings + dev->active);break ;default :/* @@ -1482,7 +1483,7 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_deactivate_tcq (sdev,1 ); +scsi_adjust_queue_depth (sdev,0 ,1 );break ; } }drivers/scsi/aic7xxx/aic7xxx_osm.c +5
-4@@ -812,6 +812,7 @@ struct scsi_host_template aic7xxx_driver_template = { .slave_configure = ahc_linux_slave_configure, .target_alloc = ahc_linux_target_alloc, .target_destroy = ahc_linux_target_destroy, + .use_blk_tags = 1, };/**************************** Tasklet Handler *********************************/ @@ -1334,12 +1335,12 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, }switch ((dev->flags & (AHC_DEV_Q_BASIC |AHC_DEV_Q_TAGGED ))) {case AHC_DEV_Q_BASIC : -scsi_set_tag_type (sdev,MSG_SIMPLE_TAG ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , + dev->openings + dev->active);break ;case AHC_DEV_Q_TAGGED : -scsi_set_tag_type (sdev,MSG_ORDERED_TAG ); -scsi_activate_tcq (sdev, dev->openings + dev->active); +scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , + dev->openings + dev->active);break ;default :/*
drivers/scsi/aic7xxx/aic7xxx_osm.c ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, · line 1355
Quoted 8 lines
drivers/scsi/aic7xxx/aic7xxx_osm.c +1
-1@@ -1348,7 +1349,7 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_deactivate_tcq (sdev,2 ); +scsi_adjust_queue_depth (sdev,0 ,2 );break ; } }
Hmm. With patch 03/11 and 04/11 you've removed the ordered_tags fields, on the ground that the block layer never issues ordered tags nowadays.
Yet these drivers still try to activate ordered tags.
So what's happening here?
Do these drivers switch on ordered tags on their own?
If so, why shouldn't the other drivers (like the various FC HBAs) be allowed to do it, too?
Shouldn't we rather remove ordered tagging from those drivers, too?
(Although I'm not too happy about removing ordered tags support in the other drivers. I have the nagging feeling they might become important if and when ZBC ever gets off the ground ...)
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 08/11] scsi: always assign block layer tags if enabled
Quoted 5 lines · Hannes Reinecke
Hmm. With patch 03/11 and 04/11 you've removed the
ordered_tagsfields, on the ground that the block layer never issues ordered tags nowadays.
Yet these drivers still try to activate ordered tags.
So what's happening here?
Broken APIs - in the current tree we can set the ->ordered_tags field through scsi_adjust_queue_depth and scsi_set_tag_type, but that field isn't ever checked except for the queue_type sysfs file and a few pintks.
Quoted 4 lines
Do these drivers switch on ordered tags on their own?
If so, why shouldn't the other drivers (like the various FC HBAs) be allowed to do it, too?
Shouldn't we rather remove ordered tagging from those drivers, too?
Except for a few SPI drivers that issue an ordered tag on their own every N commands to avoid locking devices up ordered tag support is gone from the tree (at least on the initiator side).
Quoted 3 lines
(Although I'm not too happy about removing ordered tags support in the other drivers. I have the nagging feeling they might become important if and when ZBC ever gets off the ground ...)
Good luck with that mess. It will have to look very different anyway if it should be remotely supportable, and would be limited to a small set of hardware currently not pretending to have ordered tag support (SAS + SATA basically).
Re: [PATCH 08/11] scsi: always assign block layer tags if enabled
Quoted 7 lines · Christoph Hellwig
Quoted 5 lines · Hannes Reinecke
Hmm. With patch 03/11 and 04/11 you've removed the
ordered_tagsfields, on the ground that the block layer never issues ordered tags nowadays.
Yet these drivers still try to activate ordered tags.
So what's happening here?
Quoted 5 lines
Broken APIs - in the current tree we can set the ->ordered_tags field through
scsi_adjust_queue_depthandscsi_set_tag_type, but that field isn't ever checked except for thequeue_typesysfs file and a few pintks.
Yeah, I've seen that.
Quoted 9 lines
Quoted 4 lines
Do these drivers switch on ordered tags on their own?
If so, why shouldn't the other drivers (like the various FC HBAs) be allowed to do it, too?
Shouldn't we rather remove ordered tagging from those drivers, too?Except for a few SPI drivers that issue an ordered tag on their own every N commands to avoid locking devices up ordered tag support is gone from the tree (at least on the initiator side).
Okay.
Quoted 9 lines
Quoted 3 lines
(Although I'm not too happy about removing ordered tags support in the other drivers. I have the nagging feeling they might become important if and when ZBC ever gets off the ground ...)
Good luck with that mess. It will have to look very different anyway if it should be remotely supportable, and would be limited to a small set of hardware currently not pretending to have ordered tag support (SAS + SATA basically).
Well, it's nothing definite as of yet.
SATA has NCQ nowadays, which should take care of this. And for SAS ... we'll cross that bridge if we come to it.
So go ahead with this.
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 08/11] scsi: always assign block layer tags if enabled
In reply to Christoph HellwigQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Christoph> Allow a driver to ask for block layer tags by setting Christoph> .use_blk_tags in the host template, in which case it will Christoph> always see a valid value in request->tag, similar to the Christoph> behavior when using blk-mq. This means request-> even Christoph> SCSI "untagged" commands will now have a tag, which is Christoph> especially useful when using a host-wide tag map.
Christoph> + scsi_adjust_queue_depth(dev, MSG_SIMPLE_TAG, cmd_per_lun); Christoph> + else
Christoph> + scsi_adjust_queue_depth(dev, 0, cmd_per_lun);
I kept tripping over these. In one case we have a well-defined MSG_SIMPLE_TAG constant in the other it's '0'.
Also, when I read the disable case it's not immediately obvious whether the 0 is the queue depth or the tag type (although in the example above it's obvious due to it being cmd_per_lun).
Anyway. Minor nitpicking.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
Re: [PATCH 08/11] scsi: always assign block layer tags if enabled
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Martin" == Martin K Petersen <[email protected]> writes:
Martin> Also, when I read the disable case it's not immediately obvious Martin> whether the 0 is the queue depth or the tag type (although in Martin> the example above it's obvious due to it being cmd_per_lun).
Ignore me. Just made it to patch 09/11.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
Bart Van Assche
maintainerRe: [PATCH 08/11] scsi: always assign block layer tags if enabled
In reply to Christoph HellwigQuoted 13 lines · Christoph Hellwig
include/scsi/scsi_tcq.h +0
-13-/** -* scsi_activate_tcq - turn on tag command queueing -* @SDpnt: device to turn on TCQ for -* @depth: queue depth -* -* Notes: -* Eventually, I hope depth would be the maximum depth -* the device could cope with and the real queue depth -* would be adjustable from 0 to depth. -**/ -static inline void scsi_activate_tcq (struct scsi_device *sdev,int depth) -{ -if (!sdev->tagged_supported)
include/scsi/scsi_tcq.h static inline void scsi_set_tag_type(struct scsi_device *sdev, int tag) · line 70
Quoted 10 lines
include/scsi/scsi_tcq.h +0
-10-return ; - -if (shost_use_blk_mq (sdev->host)) -queue_flag_set_unlocked (QUEUE_FLAG_QUEUED , sdev->request_queue); -else if (!blk_queue_tagged (sdev->request_queue)) -blk_queue_init_tags (sdev->request_queue, depth, - sdev->host->bqt); - -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); -}
Apparently this patch removes the queue_flag_set_unlocked(QUEUE_FLAG_QUEUED, sdev->request_queue) call for the multiqueue case. I think it should be explained in the commit message why that has been done.
include/scsi/scsi_tcq.h static inline void scsi_set_tag_type(struct scsi_device *sdev, int tag) · line 81
Quoted 10 lines
include/scsi/scsi_tcq.h +0
-10-/** -* scsi_deactivate_tcq - turn off tag command queueing -* @SDpnt: device to turn off TCQ for -**/ -static inline void scsi_deactivate_tcq (struct scsi_device *sdev,int depth) -{ -if (blk_queue_tagged (sdev->request_queue)) -blk_queue_free_tags (sdev->request_queue); -scsi_adjust_queue_depth (sdev,0 , depth); -}
Hmm ... where has the blk_queue_free_tags() call been moved to ?
Bart.
Re: [PATCH 08/11] scsi: always assign block layer tags if enabled
Quoted 4 lines · Bart Van Assche
Apparently this patch removes the
queue_flag_set_unlocked(QUEUE_FLAG_QUEUED, sdev->request_queue)call for the multiqueue case. I think it should be explained in the commit message why that has been done.
Ok, I will update it.
Quoted 8 lines
include/scsi/scsi_tcq.h static inline void scsi_set_tag_type(struct scsi_device *sdev, int tag) · line 81
Quoted 6 lines
include/scsi/scsi_tcq.h +0
-6-static inline void scsi_deactivate_tcq (struct scsi_device *sdev,int depth) -{ -if (blk_queue_tagged (sdev->request_queue)) -blk_queue_free_tags (sdev->request_queue); -scsi_adjust_queue_depth (sdev,0 , depth); -}Hmm ... where has the
blk_queue_free_tags()call been moved to ?
It's gone. Despite the confusing name blk_queue_free_tags just clears QUEUE_FLAG_QUEUED, which we now never do until the actual tag structure is freed when the queue is torn via blk_release_queue -> __blk_queue_free_tags.
PATCH 9/11 scsi: don't set tagging state from scsi_adjust_queue_depth
In reply to Christoph HellwigRemove the tagged argument from scsi_adjust_queue_depth, and just let it handle the queue depth. For most drivers those two are fairly separate, given that most modern drivers don't care about the SCSI "tagged" status of a command at all, and many old drivers allow queuing of multiple untagged commands in the driver.
Instead we start out with the ->simple_tags flag set before calling ->slave_configure, which is how all drivers actually looking at ->simple_tags except for one worke anyway. The one other case looks broken, but I've kept the behavior as-is for now.
Except for that we only change ->simple_tags from the ->change_queue_type, and when rejecting a tag message in a single driver, so keeping this churn out of scsi_adjust_queue_depth is a clear win.
Now that the usage of scsi_adjust_queue_depth is more obvious we can also remove all the trivial instances in ->slave_alloc or ->slave_configure that just set it to the cmd_per_lun default.
--- Documentation/scsi/scsi_mid_low_api.txt | 12 ++++------ drivers/ata/libata-scsi.c | 4 ++-- drivers/infiniband/ulp/srp/ib_srp.c | 2 +- drivers/message/fusion/mptscsih.c | 2 +- drivers/s390/scsi/zfcp_scsi.c | 8 +++---- drivers/scsi/3w-9xxx.c | 2 +- drivers/scsi/3w-sas.c | 2 +- drivers/scsi/3w-xxxx.c | 2 +- drivers/scsi/53c700.c | 17 ++++++------- drivers/scsi/BusLogic.c | 4 ++-- drivers/scsi/aacraid/linit.c | 9 ++++--- drivers/scsi/advansys.c | 7 ++---- drivers/scsi/aic7xxx/aic79xx_osm.c | 7 ++---- drivers/scsi/aic7xxx/aic7xxx_osm.c | 8 ++----- drivers/scsi/arcmsr/arcmsr_hba.c | 2 +- drivers/scsi/bfa/bfad_im.c | 3 +-- drivers/scsi/csiostor/csio_scsi.c | 2 +- drivers/scsi/dpt_i2o.c | 4 +--- drivers/scsi/eata.c | 8 +++---- drivers/scsi/esas2r/esas2r.h | 3 --- drivers/scsi/esas2r/esas2r_main.c | 29 +--------------------- drivers/scsi/esp_scsi.c | 17 ++----------- drivers/scsi/fnic/fnic_main.c | 2 +- drivers/scsi/gdth.c | 1 - drivers/scsi/hpsa.c | 2 +- drivers/scsi/hptiop.c | 2 +- drivers/scsi/ibmvscsi/ibmvfc.c | 8 +------ drivers/scsi/ibmvscsi/ibmvscsi.c | 3 +-- drivers/scsi/ipr.c | 8 +++---- drivers/scsi/ips.c | 2 +- drivers/scsi/libfc/fc_fcp.c | 6 ++--- drivers/scsi/libiscsi.c | 4 ++-- drivers/scsi/libsas/sas_scsi_host.c | 20 +++++----------- drivers/scsi/lpfc/lpfc_scsi.c | 4 ++-- drivers/scsi/megaraid/megaraid_mbox.c | 2 +- drivers/scsi/megaraid/megaraid_sas_base.c | 3 +-- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 2 +- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 +- drivers/scsi/ncr53c8xx.c | 5 +--- drivers/scsi/pmcraid.c | 40 ++++++------------------------- drivers/scsi/qla1280.c | 5 ++-- drivers/scsi/qla2xxx/qla_os.c | 6 ++--- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi.c | 25 ++++--------------- drivers/scsi/scsi_debug.c | 7 ++---- drivers/scsi/scsi_scan.c | 6 +++-- drivers/scsi/stex.c | 2 -- drivers/scsi/storvsc_drv.c | 3 +-- drivers/scsi/sym53c8xx_2/sym_glue.c | 4 +--- drivers/scsi/tmscsim.c | 9 ++++++- drivers/scsi/u14-34f.c | 10 ++++---- drivers/scsi/ufs/ufshcd.c | 4 ++-- drivers/scsi/virtio_scsi.c | 4 +--- drivers/scsi/vmw_pvscsi.c | 2 +- drivers/target/loopback/tcm_loop.c | 18 ++------------ drivers/usb/storage/uas.c | 2 +- include/scsi/scsi_device.h | 2 +- 57 files changed, 120 insertions(+), 261 deletions(-)
Documentation/scsi/scsi_mid_low_api.txt +4 -8
@@ -271,9 +271,9 @@ init_this_scsi_driver() ----+ slave_destroy() *** ------------------------------------------------------------ -The mid level invokes scsi_adjust_queue_depth() with tagged queuing off and -"cmd_per_lun" for that host as the queue length. These settings can be -overridden by a slave_configure() supplied by the LLD. +The mid level invokes scsi_adjust_queue_depth() with "cmd_per_lun" for that +host as the queue length. These settings can be overridden by a +slave_configure() supplied by the LLD. *** For scsi devices that the mid level tries to scan but do not respond, a slave_alloc(), slave_destroy() pair is called.
@@ -438,9 +438,6 @@ int scsi_add_host(struct Scsi_Host *shost, struct device * dev) /** * scsi_adjust_queue_depth - allow LLD to change queue depth on a SCSI device * @sdev: pointer to SCSI device to change queue depth on - * @tagged: 0 - no tagged queuing - * MSG_SIMPLE_TAG - simple tagged queuing - * MSG_ORDERED_TAG - ordered tagged queuing * @tags Number of tags allowed if tagged queuing enabled, * or number of commands the LLD can queue up * in non-tagged mode (as per cmd_per_lun).
@@ -456,8 +453,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device * dev) * Defined in: drivers/scsi/scsi.c [see source code for more notes] * **/ -void scsi_adjust_queue_depth(struct scsi_device * sdev, int tagged, - int tags) +void scsi_adjust_queue_depth(struct scsi_device *sdev, int tags) /**
drivers/ata/libata-scsi.c +2 -2
@@ -1164,7 +1164,7 @@ static int ata_scsi_dev_config(struct scsi_device *sdev, depth =min (sdev->host->can_queue,ata_id_queue_depth (dev->id)); depth =min (ATA_MAX_QUEUE -1 , depth); -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , depth); +scsi_adjust_queue_depth (sdev, depth); }blk_queue_flush_queueable (q, false);
@@ -1282,7 +1282,7 @@ int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,if (sdev->queue_depth == queue_depth)return -EINVAL ; -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }
drivers/infiniband/ulp/srp/ib_srp.c +1 -1
@@ -2278,7 +2278,7 @@ srp_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }else if (reason ==SCSI_QDEPTH_QFULL )scsi_track_queue_full (sdev, qdepth);else
drivers/message/fusion/mptscsih.c +1 -1
@@ -2347,7 +2347,7 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }
drivers/s390/scsi/zfcp_scsi.c +3 -5
@@ -37,13 +37,13 @@ static int zfcp_scsi_change_queue_depth(struct scsi_device *sdev, int depth, {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;default :return -EOPNOTSUPP ;
@@ -66,9 +66,7 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdev)static int zfcp_scsi_slave_configure (struct scsi_device *sdp) {if (sdp->tagged_supported) -scsi_adjust_queue_depth (sdp,MSG_SIMPLE_TAG , default_depth); -else -scsi_adjust_queue_depth (sdp,0 ,1 ); +scsi_adjust_queue_depth (sdp, default_depth);return 0 ; }
drivers/scsi/3w-9xxx.c +1 -1
@@ -198,7 +198,7 @@ static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth,if (queue_depth >TW_Q_LENGTH -2 ) queue_depth =TW_Q_LENGTH -2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }/* End twa_change_queue_depth() */
drivers/scsi/3w-sas.c +1 -1
@@ -200,7 +200,7 @@ static int twl_change_queue_depth(struct scsi_device *sdev, int queue_depth,if (queue_depth >TW_Q_LENGTH -2 ) queue_depth =TW_Q_LENGTH -2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }/* End twl_change_queue_depth() */
drivers/scsi/3w-xxxx.c +1 -1
@@ -532,7 +532,7 @@ static int tw_change_queue_depth(struct scsi_device *sdev, int queue_depth,if (queue_depth >TW_Q_LENGTH -2 ) queue_depth =TW_Q_LENGTH -2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }/* End tw_change_queue_depth() */
drivers/scsi/53c700.c +9 -8
@@ -902,8 +902,10 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata/* we're done negotiating */ NCR_700_set_tag_neg_state (SCp->device,NCR_700_FINISHED_TAG_NEGOTIATION ); hostdata->tag_negotiated &= ~(1 <<scmd_id (SCp)); + SCp->device->tagged_supported =0 ; -scsi_adjust_queue_depth (SCp->device,0 , host->cmd_per_lun); +scsi_adjust_queue_depth (SCp->device, host->cmd_per_lun); +scsi_set_tag_type (SCp->device,0 ); }else { shost_printk(KERN_WARNING, host, "(%d:%d) Unexpected REJECT Message %s\n",
@@ -2050,12 +2052,10 @@ NCR_700_slave_configure(struct scsi_device *SDp)/* to do here: allocate memory; build a queue_full list */ if (SDp->tagged_supported) { -scsi_adjust_queue_depth (SDp,MSG_ORDERED_TAG ,NCR_700_DEFAULT_TAGS ); +scsi_adjust_queue_depth (SDp,NCR_700_DEFAULT_TAGS );NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); - }else { -/* initialise to default depth */ -scsi_adjust_queue_depth (SDp,0 , SDp->host->cmd_per_lun); } +if (hostdata->fast) {/* Find the correct offset and period via domain validation */ if (!spi_initial_dv (SDp->sdev_target))
@@ -2083,7 +2083,7 @@ NCR_700_change_queue_depth(struct scsi_device *SDp, int depth, int reason)if (depth >NCR_700_MAX_TAGS ) depth =NCR_700_MAX_TAGS ; -scsi_adjust_queue_depth (SDp,scsi_get_tag_type (SDp), depth); +scsi_adjust_queue_depth (SDp, depth);return depth; }
@@ -2101,15 +2101,16 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)if (change_tag)scsi_target_quiesce (SDp->sdev_target); +scsi_set_tag_type (SDp, tag_type);if (!tag_type) {/* shift back to the default unqueued number of commands * (the user can still raise this) */ -scsi_adjust_queue_depth (SDp,0 , SDp->host->cmd_per_lun); +scsi_adjust_queue_depth (SDp, SDp->host->cmd_per_lun); hostdata->tag_negotiated &= ~(1 <<sdev_id (SDp)); }else {/* Here, we cleared the negotiation flag above, so this * will force the driver to renegotiate */ -scsi_adjust_queue_depth (SDp, tag_type, SDp->queue_depth); +scsi_adjust_queue_depth (SDp, SDp->queue_depth);if (change_tag)NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); }
drivers/scsi/BusLogic.c +2 -2
@@ -2327,12 +2327,12 @@ static int blogic_slaveconfig(struct scsi_device *dev)if (qdepth ==0 ) qdepth =BLOGIC_MAX_AUTO_TAG_DEPTH ; adapter->qdepth[tgt_id] = qdepth; -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , qdepth); +scsi_adjust_queue_depth (dev, qdepth); }else { adapter->tagq_ok &= ~(1 << tgt_id); qdepth = adapter->untag_qdepth; adapter->qdepth[tgt_id] = qdepth; -scsi_adjust_queue_depth (dev,0 , qdepth); +scsi_adjust_queue_depth (dev, qdepth); } qdepth =0 ;for (tgt_id =0 ; tgt_id < adapter->maxdev; tgt_id++)
drivers/scsi/aacraid/linit.c +4 -5
@@ -462,9 +462,8 @@ static int aac_slave_configure(struct scsi_device *sdev) depth =256 ; else if (depth < 2) depth =2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , depth); - }else -scsi_adjust_queue_depth (sdev,0 ,1 ); +scsi_adjust_queue_depth (sdev, depth); + }return 0 ; }
@@ -504,9 +503,9 @@ static int aac_change_queue_depth(struct scsi_device *sdev, int depth, depth =256 ; else if (depth < 2) depth =2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , depth); +scsi_adjust_queue_depth (sdev, depth); }else -scsi_adjust_queue_depth (sdev,0 ,1 ); +scsi_adjust_queue_depth (sdev,1 );return sdev->queue_depth; }
drivers/scsi/advansys.c +2 -5
@@ -7706,7 +7706,7 @@ advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc) asc_dvc->cfg->can_tagged_qng |= tid_bit; asc_dvc->use_tagged_qng |= tid_bit; } -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , +scsi_adjust_queue_depth (sdev, asc_dvc->max_dvc_qng[sdev->id]); } }else {
@@ -7714,7 +7714,6 @@ advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc) asc_dvc->cfg->can_tagged_qng &= ~tid_bit; asc_dvc->use_tagged_qng &= ~tid_bit; } -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); } if ((sdev->lun == 0) &&
@@ -7849,10 +7848,8 @@ advansys_wide_slave_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc) }if ((adv_dvc->tagqng_able & tidmask) && sdev->tagged_supported) { -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , +scsi_adjust_queue_depth (sdev, adv_dvc->max_dvc_qng); - }else { -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); } }
drivers/scsi/aic7xxx/aic79xx_osm.c +2 -5
@@ -1469,11 +1469,8 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,switch ((dev->flags & (AHD_DEV_Q_BASIC |AHD_DEV_Q_TAGGED ))) {case AHD_DEV_Q_BASIC : -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , - dev->openings + dev->active); -break ;case AHD_DEV_Q_TAGGED : -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , +scsi_adjust_queue_depth (sdev, dev->openings + dev->active);break ;default :
@@ -1483,7 +1480,7 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_adjust_queue_depth (sdev,0 ,1 ); +scsi_adjust_queue_depth (sdev,1 );break ; } }
drivers/scsi/aic7xxx/aic7xxx_osm.c +2 -6
@@ -1335,13 +1335,9 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, }switch ((dev->flags & (AHC_DEV_Q_BASIC |AHC_DEV_Q_TAGGED ))) {case AHC_DEV_Q_BASIC : -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , - dev->openings + dev->active); -break ;case AHC_DEV_Q_TAGGED : -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , +scsi_adjust_queue_depth (sdev, dev->openings + dev->active); -break ;default :/* * We allow the OS to queue 2 untagged transactions to
@@ -1349,7 +1345,7 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_adjust_queue_depth (sdev,0 ,2 ); +scsi_adjust_queue_depth (sdev,2 );break ; } }
drivers/scsi/arcmsr/arcmsr_hba.c +1 -1
@@ -122,7 +122,7 @@ static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev,if (queue_depth >ARCMSR_MAX_CMD_PERLUN ) queue_depth =ARCMSR_MAX_CMD_PERLUN ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }
drivers/scsi/bfa/bfad_im.c +1 -2
@@ -776,7 +776,7 @@ bfad_thread_workq(struct bfad_s *bfad)static int bfad_im_slave_configure (struct scsi_device *sdev) { -scsi_adjust_queue_depth (sdev,0 , bfa_lun_queue_depth); +scsi_adjust_queue_depth (sdev, bfa_lun_queue_depth);return 0 ; }
@@ -867,7 +867,6 @@ bfad_ramp_up_qdepth(struct bfad_itnim_s *itnim, struct scsi_device *sdev)if (tmp_sdev->id != sdev->id)continue ;scsi_adjust_queue_depth (tmp_sdev, -MSG_SIMPLE_TAG , tmp_sdev->queue_depth +1 ); itnim->last_ramp_up_time = jiffies;
drivers/scsi/csiostor/csio_scsi.c +1 -1
@@ -2241,7 +2241,7 @@ csio_slave_alloc(struct scsi_device *sdev)static int csio_slave_configure (struct scsi_device *sdev) { -scsi_adjust_queue_depth (sdev,0 , csio_lun_qdepth); +scsi_adjust_queue_depth (sdev, csio_lun_qdepth);return 0 ; }
drivers/scsi/dpt_i2o.c +1 -3
@@ -415,10 +415,8 @@ static int adpt_slave_configure(struct scsi_device * device) pHba = (adpt_hba *) host->hostdata[0 ];if (host->can_queue && device->tagged_supported) { -scsi_adjust_queue_depth (device,MSG_SIMPLE_TAG , +scsi_adjust_queue_depth (device, host->can_queue -1 ); - }else { -scsi_adjust_queue_depth (device,0 ,1 ); }return 0 ; }
drivers/scsi/eata.c +3 -5
@@ -946,20 +946,18 @@ static int eata2x_slave_configure(struct scsi_device *dev)if (TLDEV (dev->type) && dev->tagged_supported) {if (tag_mode ==TAG_SIMPLE ) { -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , tqd); tag_suffix =", simple tags" ; }else if (tag_mode ==TAG_ORDERED ) { -scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , tqd); tag_suffix =", ordered tags" ; }else { -scsi_adjust_queue_depth (dev,0 , tqd); tag_suffix =", no tags" ; } +scsi_adjust_queue_depth (dev, tqd); }else if (TLDEV (dev->type) && linked_comm) { -scsi_adjust_queue_depth (dev,0 , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", untagged" ; }else { -scsi_adjust_queue_depth (dev,0 , utqd); +scsi_adjust_queue_depth (dev, utqd); tag_suffix ="" ; }
drivers/scsi/esas2r/esas2r.h +0 -3
@@ -972,9 +972,6 @@ u8 handle_hba_ioctl(struct esas2r_adapter *a, struct atto_ioctl *ioctl_hba);int esas2r_queuecommand (struct Scsi_Host *host,struct scsi_cmnd *cmd);int esas2r_show_info (struct seq_file *m,struct Scsi_Host *sh); -int esas2r_slave_alloc (struct scsi_device *dev); -int esas2r_slave_configure (struct scsi_device *dev); -void esas2r_slave_destroy (struct scsi_device *dev);int esas2r_change_queue_depth (struct scsi_device *dev,int depth,int reason);long esas2r_proc_ioctl (struct file *fp,unsigned int cmd,unsigned long arg);
drivers/scsi/esas2r/esas2r_main.c +1 -28
@@ -254,9 +254,6 @@ static struct scsi_host_template driver_template = { .use_clustering = ENABLE_CLUSTERING, .emulated = 0, .proc_name = ESAS2R_DRVR_NAME, - .slave_configure = esas2r_slave_configure, - .slave_alloc = esas2r_slave_alloc, - .slave_destroy = esas2r_slave_destroy, .change_queue_depth = esas2r_change_queue_depth, .change_queue_type = scsi_change_queue_type, .max_sectors = 0xFFFF,
@@ -1264,35 +1261,11 @@ int esas2r_change_queue_depth(struct scsi_device *dev, int depth, int reason) {esas2r_log (ESAS2R_LOG_INFO ,"change_queue_depth %p, %d" , dev, depth); -scsi_adjust_queue_depth (dev,scsi_get_tag_type (dev), depth); +scsi_adjust_queue_depth (dev, depth);return dev->queue_depth; } -int esas2r_slave_alloc (struct scsi_device *dev) -{ -return 0 ; -} - -int esas2r_slave_configure (struct scsi_device *dev) -{ -esas2r_log_dev (ESAS2R_LOG_INFO , &(dev->sdev_gendev), -"esas2r_slave_configure()" ); - -if (dev->tagged_supported) -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , cmd_per_lun); -else -scsi_adjust_queue_depth (dev,0 , cmd_per_lun); - -return 0 ; -} - -void esas2r_slave_destroy (struct scsi_device *dev) -{ -esas2r_log_dev (ESAS2R_LOG_INFO , &(dev->sdev_gendev), -"esas2r_slave_destroy()" ); -} -void esas2r_log_request_failure (struct esas2r_adapter *a,struct esas2r_request *rq) {
drivers/scsi/esp_scsi.c +2 -15
@@ -2402,27 +2402,14 @@ static int esp_slave_configure(struct scsi_device *dev) {struct esp *esp =shost_priv (dev->host);struct esp_target_data *tp = &esp->target[dev->id]; -int goal_tags, queue_depth; - - goal_tags =0 ;if (dev->tagged_supported) {/* XXX make this configurable somehow XXX */ - goal_tags =ESP_DEFAULT_TAGS ; +int goal_tags =min (ESP_DEFAULT_TAGS ,ESP_MAX_TAG ); -if (goal_tags >ESP_MAX_TAG ) - goal_tags =ESP_MAX_TAG ; +scsi_adjust_queue_depth (dev, goal_tags); } - queue_depth = goal_tags; -if (queue_depth < dev->host->cmd_per_lun) - queue_depth = dev->host->cmd_per_lun; - -if (goal_tags) { -scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , queue_depth); - }else { -scsi_adjust_queue_depth (dev,0 , queue_depth); - } tp->flags |=ESP_TGT_DISCONNECT ;if (!spi_initial_dv (dev->sdev_target))
drivers/scsi/fnic/fnic_main.c +1 -1
@@ -100,7 +100,7 @@ static int fnic_slave_alloc(struct scsi_device *sdev)if (!rport ||fc_remote_port_chkready (rport))return -ENXIO ; -scsi_adjust_queue_depth (sdev,0 , fnic_max_qdepth); +scsi_adjust_queue_depth (sdev, fnic_max_qdepth);return 0 ; }
drivers/scsi/gdth.c +0 -1
@@ -4661,7 +4661,6 @@ static void gdth_flush(gdth_ha_str *ha)/* configure lun */ static int gdth_slave_configure (struct scsi_device *sdev) { -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); sdev->skip_ms_page_3f =1 ; sdev->skip_ms_page_8 =1 ;return 0 ;
drivers/scsi/hpsa.c +1 -1
@@ -4165,7 +4165,7 @@ static int hpsa_change_queue_depth(struct scsi_device *sdev,else if (qdepth > h->nr_cmds) qdepth = h->nr_cmds; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }
drivers/scsi/hptiop.c +1 -1
@@ -1127,7 +1127,7 @@ static int hptiop_adjust_disk_queue_depth(struct scsi_device *sdev,if (queue_depth > hba->max_requests) queue_depth = hba->max_requests; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }
drivers/scsi/ibmvscsi/ibmvfc.c +1 -7
@@ -2887,12 +2887,6 @@ static int ibmvfc_slave_configure(struct scsi_device *sdev)spin_lock_irqsave (shost->host_lock, flags);if (sdev->type ==TYPE_DISK ) sdev->allow_restart =1 ; - -if (sdev->tagged_supported) -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , - sdev->queue_depth); -else -scsi_adjust_queue_depth (sdev,0 , sdev->queue_depth);spin_unlock_irqrestore (shost->host_lock, flags);return 0 ; }
@@ -2915,7 +2909,7 @@ static int ibmvfc_change_queue_depth(struct scsi_device *sdev, int qdepth,if (qdepth >IBMVFC_MAX_CMDS_PER_LUN ) qdepth =IBMVFC_MAX_CMDS_PER_LUN ; -scsi_adjust_queue_depth (sdev,0 , qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }
drivers/scsi/ibmvscsi/ibmvscsi.c +1 -2
@@ -1929,7 +1929,6 @@ static int ibmvscsi_slave_configure(struct scsi_device *sdev)blk_queue_rq_timeout (sdev->request_queue,120 *HZ ); }spin_unlock_irqrestore (shost->host_lock, lock_flags); -scsi_adjust_queue_depth (sdev,0 , shost->cmd_per_lun);return 0 ; }
@@ -1951,7 +1950,7 @@ static int ibmvscsi_change_queue_depth(struct scsi_device *sdev, int qdepth,if (qdepth >IBMVSCSI_MAX_CMDS_PER_LUN ) qdepth =IBMVSCSI_MAX_CMDS_PER_LUN ; -scsi_adjust_queue_depth (sdev,0 , qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }
drivers/scsi/ipr.c +4 -4
@@ -4348,7 +4348,7 @@ static int ipr_change_queue_depth(struct scsi_device *sdev, int qdepth, qdepth =IPR_MAX_CMD_PER_ATA_LUN ;spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags); -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }
@@ -4755,10 +4755,10 @@ static int ipr_slave_configure(struct scsi_device *sdev)spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags);if (ap) { -scsi_adjust_queue_depth (sdev,0 ,IPR_MAX_CMD_PER_ATA_LUN ); +scsi_adjust_queue_depth (sdev,IPR_MAX_CMD_PER_ATA_LUN );ata_sas_slave_configure (sdev, ap); - }else -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); + } +if (ioa_cfg->sis64) sdev_printk(KERN_INFO, sdev, "Resource path: %s\n", ipr_format_res_path(ioa_cfg,
drivers/scsi/ips.c +1 -1
@@ -1210,7 +1210,7 @@ ips_slave_configure(struct scsi_device * SDptr) min = ha->max_cmds /2 ;if (ha->enq->ucLogDriveCount <=2 ) min = ha->max_cmds -1 ; -scsi_adjust_queue_depth (SDptr,MSG_ORDERED_TAG , min); +scsi_adjust_queue_depth (SDptr, min); } SDptr->skip_ms_page_8 =1 ;
drivers/scsi/libfc/fc_fcp.c +3 -3
@@ -2160,7 +2160,7 @@ int fc_slave_alloc(struct scsi_device *sdev)if (!rport ||fc_remote_port_chkready (rport))return -ENXIO ; -scsi_adjust_queue_depth (sdev,0 ,FC_FCP_DFLT_QUEUE_DEPTH ); +scsi_adjust_queue_depth (sdev,FC_FCP_DFLT_QUEUE_DEPTH );return 0 ; }EXPORT_SYMBOL (fc_slave_alloc);
@@ -2175,13 +2175,13 @@ int fc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, qdepth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;default :return -EOPNOTSUPP ;
drivers/scsi/libiscsi.c +2 -2
@@ -1775,13 +1775,13 @@ int iscsi_change_queue_depth(struct scsi_device *sdev, int depth, int reason) {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;default :return -EOPNOTSUPP ;
drivers/scsi/libsas/sas_scsi_host.c +6 -14
@@ -940,13 +940,13 @@ int sas_slave_configure(struct scsi_device *scsi_dev)sas_read_port_mode_page (scsi_dev);if (scsi_dev->tagged_supported) { -scsi_adjust_queue_depth (scsi_dev,MSG_SIMPLE_TAG ,SAS_DEF_QD ); +scsi_adjust_queue_depth (scsi_dev,SAS_DEF_QD ); }else {SAS_DPRINTK ("device %llx, LUN %llx doesn't support " "TCQ\n" ,SAS_ADDR (dev->sas_addr), scsi_dev->lun); scsi_dev->tagged_supported =0 ; -scsi_adjust_queue_depth (scsi_dev,0 ,1 ); +scsi_adjust_queue_depth (scsi_dev,1 ); } scsi_dev->allow_restart =1 ;
@@ -967,7 +967,7 @@ int sas_change_queue_depth(struct scsi_device *sdev, int depth, int reason)case SCSI_QDEPTH_RAMP_UP :if (!sdev->tagged_supported) depth =1 ; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);
@@ -979,19 +979,11 @@ int sas_change_queue_depth(struct scsi_device *sdev, int depth, int reason)return depth; } -int sas_change_queue_type (struct scsi_device *scsi_dev,int qt) +int sas_change_queue_type (struct scsi_device *scsi_dev,int type) { -struct domain_device *dev =sdev_to_domain_dev (scsi_dev); - -if (dev_is_sata (dev)) +if (dev_is_sata (sdev_to_domain_dev (scsi_dev)))return -EINVAL ; - -if (!scsi_dev->tagged_supported) -return 0 ; - -scsi_adjust_queue_depth (scsi_dev, qt, scsi_dev->queue_depth); - -return qt; +return scsi_change_queue_type (scsi_dev, type); } int sas_bios_param(struct scsi_device *scsi_dev,
drivers/scsi/lpfc/lpfc_scsi.c +2 -2
@@ -320,7 +320,7 @@ lpfc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)case SCSI_QDEPTH_DEFAULT :/* change request from sysfs, fall through */ case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;case SCSI_QDEPTH_QFULL :if (scsi_track_queue_full (sdev, qdepth) ==0 )
@@ -5598,7 +5598,7 @@ lpfc_slave_configure(struct scsi_device *sdev)struct lpfc_vport *vport = (struct lpfc_vport *) sdev->host->hostdata;struct lpfc_hba *phba = vport->phba; -scsi_adjust_queue_depth (sdev,0 , vport->cfg_lun_queue_depth); +scsi_adjust_queue_depth (sdev, vport->cfg_lun_queue_depth);if (phba->cfg_poll &ENABLE_FCP_RING_POLLING ) { lpfc_sli_handle_fast_ring_event(phba,
drivers/scsi/megaraid/megaraid_mbox.c +1 -1
@@ -349,7 +349,7 @@ static int megaraid_change_queue_depth(struct scsi_device *sdev, int qdepth,if (qdepth >MBOX_MAX_SCSI_CMDS ) qdepth =MBOX_MAX_SCSI_CMDS ; -scsi_adjust_queue_depth (sdev,0 , qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }
drivers/scsi/megaraid/megaraid_sas_base.c +1 -2
@@ -2594,8 +2594,7 @@ static int megasas_change_queue_depth(struct scsi_device *sdev,if (queue_depth > sdev->host->can_queue) queue_depth = sdev->host->can_queue; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), - queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }
drivers/scsi/mpt2sas/mpt2sas_scsih.c +1 -1
@@ -1222,7 +1222,7 @@ _scsih_adjust_queue_depth(struct scsi_device *sdev, int qdepth) max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }/**
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -1
@@ -1090,7 +1090,7 @@ _scsih_adjust_queue_depth(struct scsi_device *sdev, int qdepth) max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }/**
drivers/scsi/ncr53c8xx.c +1 -4
@@ -7997,10 +7997,7 @@ static int ncr53c8xx_slave_configure(struct scsi_device *device)if (depth_to_use >MAX_TAGS ) depth_to_use =MAX_TAGS ; -scsi_adjust_queue_depth (device, - (device->tagged_supported ? -MSG_SIMPLE_TAG :0 ), - depth_to_use); +scsi_adjust_queue_depth (device, depth_to_use);/* ** Since the queue depth is not tunable under Linux,
drivers/scsi/pmcraid.c +7 -33
@@ -249,14 +249,11 @@ static int pmcraid_slave_configure(struct scsi_device *scsi_dev) PMCRAID_VSET_MAX_SECTORS); } -if (scsi_dev->tagged_supported && - (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) { -scsi_adjust_queue_depth (scsi_dev,MSG_SIMPLE_TAG , - scsi_dev->host->cmd_per_lun); - }else { -scsi_adjust_queue_depth (scsi_dev,0 , - scsi_dev->host->cmd_per_lun); - } +/* +* We never want to report TCQ support for these types of devices. +*/ +if (!RES_IS_GSCSI (res->cfg_entry) && !RES_IS_VSET (res->cfg_entry)) + scsi_dev->tagged_supported =0 ;return 0 ; }
@@ -302,35 +299,12 @@ static int pmcraid_change_queue_depth(struct scsi_device *scsi_dev, int depth,if (depth >PMCRAID_MAX_CMD_PER_LUN ) depth =PMCRAID_MAX_CMD_PER_LUN ; -scsi_adjust_queue_depth (scsi_dev,scsi_get_tag_type (scsi_dev), depth); +scsi_adjust_queue_depth (scsi_dev, depth);return scsi_dev->queue_depth; }/** -* pmcraid_change_queue_type - Change the device's queue type -* @scsi_dev: scsi device struct -* @tag: type of tags to use -* -* Return value: -* actual queue type set -*/ -static int pmcraid_change_queue_type (struct scsi_device *scsi_dev,int tag) -{ -struct pmcraid_resource_entry *res; - - res = (struct pmcraid_resource_entry *)scsi_dev->hostdata; -if (res && scsi_dev->tagged_supported && - (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) - tag =scsi_change_queue_type (scsi_dev, tag); -else - tag =0 ; - -return tag; -} - - -/** * pmcraid_init_cmdblk - initializes a command block * * @cmd: pointer to struct pmcraid_cmd to be initialized
@@ -4285,7 +4259,7 @@ static struct scsi_host_template pmcraid_host_template = { .slave_configure = pmcraid_slave_configure, .slave_destroy = pmcraid_slave_destroy, .change_queue_depth = pmcraid_change_queue_depth, - .change_queue_type = pmcraid_change_queue_type, + .change_queue_type = scsi_change_queue_type, .can_queue = PMCRAID_MAX_IO_CMD, .this_id = -1, .sg_tablesize = PMCRAID_MAX_IOADLS,
drivers/scsi/qla1280.c +2 -3
@@ -1224,10 +1224,9 @@ qla1280_slave_configure(struct scsi_device *device)if (device->tagged_supported && (ha->bus_settings[bus].qtag_enables & (BIT_0 << target))) { -scsi_adjust_queue_depth (device,MSG_ORDERED_TAG , - ha->bus_settings[bus].hiwat); +scsi_adjust_queue_depth (device, ha->bus_settings[bus].hiwat); }else { -scsi_adjust_queue_depth (device,0 , default_depth); +scsi_adjust_queue_depth (device, default_depth); } nv->bus[bus].target[target].parameter.enable_sync = device->sdtr;
drivers/scsi/qla2xxx/qla_os.c +3 -3
@@ -1405,7 +1405,7 @@ qla2xxx_slave_configure(struct scsi_device *sdev)if (IS_T10_PI_CAPABLE (vha->hw))blk_queue_update_dma_alignment (sdev->request_queue,0x7 ); -scsi_adjust_queue_depth (sdev,0 , req->max_q_depth); +scsi_adjust_queue_depth (sdev, req->max_q_depth);return 0 ; }
@@ -1440,7 +1440,7 @@ static void qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, int qdepth)if (req->max_q_depth <= sdev->queue_depth || req->max_q_depth < qdepth)return ; -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , qdepth); +scsi_adjust_queue_depth (sdev, qdepth); ql_dbg(ql_dbg_io, vha, 0x302a, "Queue depth adjusted-up to %d for nexus=%ld:%d:%llu.\n",
@@ -1452,7 +1452,7 @@ qla2x00_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;case SCSI_QDEPTH_QFULL :qla2x00_handle_queue_full (sdev, qdepth);
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -9064,7 +9064,7 @@ static int qla4xxx_slave_alloc(struct scsi_device *sdev)if (ql4xmaxqdepth !=0 && ql4xmaxqdepth <=0xffffU ) queue_depth = ql4xmaxqdepth; -scsi_adjust_queue_depth (sdev,0 , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return 0 ; }
drivers/scsi/scsi.c +5 -20
@@ -744,8 +744,6 @@ void scsi_finish_command(struct scsi_cmnd *cmd)/** * scsi_adjust_queue_depth - Let low level drivers change a device's queue depth * @sdev: SCSI Device in question -* @tagged: Do we use tagged queueing (non-0) or do we treat -* this device as an untagged device (0) * @tags: Number of tags allowed if tagged queueing enabled, * or number of commands the low level driver can * queue up in non-tagged mode (as per cmd_per_lun).
@@ -759,7 +757,7 @@ void scsi_finish_command(struct scsi_cmnd *cmd)* currently active and whether or not it even has the * command blocks built yet. */ -void scsi_adjust_queue_depth (struct scsi_device *sdev,int tagged,int tags) +void scsi_adjust_queue_depth (struct scsi_device *sdev,int tags) {unsigned long flags;
@@ -787,20 +785,6 @@ void scsi_adjust_queue_depth(struct scsi_device *sdev, int tagged, int tags) } sdev->queue_depth = tags; -switch (tagged) { -case 0 : - sdev->simple_tags =0 ; -break ; -case MSG_ORDERED_TAG : -case MSG_SIMPLE_TAG : - sdev->simple_tags =1 ; -break ; -default : - sdev->simple_tags =0 ; -sdev_printk (KERN_WARNING , sdev, -"scsi_adjust_queue_depth, bad queue type, " -"disabled\n" ); - } out:spin_unlock_irqrestore (sdev->request_queue->queue_lock, flags); }
@@ -848,11 +832,12 @@ int scsi_track_queue_full(struct scsi_device *sdev, int depth)return 0 ;if (sdev->last_queue_full_depth <8 ) {/* Drop back to untagged */ -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); +scsi_set_tag_type (sdev,0 ); +scsi_adjust_queue_depth (sdev, sdev->host->cmd_per_lun);return -1 ; } -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , depth); +scsi_adjust_queue_depth (sdev, depth);return depth; }EXPORT_SYMBOL (scsi_track_queue_full);
@@ -867,7 +852,7 @@ int scsi_change_queue_type(struct scsi_device *sdev, int tag_type)if (!sdev->tagged_supported)return 0 ; -scsi_adjust_queue_depth (sdev, tag_type, sdev->queue_depth); +scsi_set_tag_type (sdev, tag_type);return tag_type; }
drivers/scsi/scsi_debug.c +2 -5
@@ -2700,11 +2700,8 @@ static int scsi_debug_slave_configure(struct scsi_device *sdp) devip =devInfoReg (sdp);if (NULL == devip)return 1 ;/* no resources, will be marked offline */ - sdp->hostdata = devip; sdp->tagged_supported =1 ; -if (sdp->host->cmd_per_lun) -scsi_adjust_queue_depth (sdp,DEF_TAGGED_QUEUING , -DEF_CMD_PER_LUN ); + sdp->hostdata = devip;blk_queue_max_segment_size (sdp->request_queue,-1U );if (scsi_debug_no_uld) sdp->no_uld_attach =1 ;
@@ -4494,7 +4491,7 @@ sdebug_change_qdepth(struct scsi_device *sdev, int qdepth, int reason)/* allow to exceed max host queued_arr elements for testing */ if (qdepth >SCSI_DEBUG_CANQUEUE +10 ) qdepth =SCSI_DEBUG_CANQUEUE +10 ; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }else if (reason ==SCSI_QDEPTH_QFULL )scsi_track_queue_full (sdev, qdepth);else
drivers/scsi/scsi_scan.c +4 -2
@@ -292,7 +292,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,blk_queue_init_tags (sdev->request_queue, sdev->host->cmd_per_lun, shost->bqt); } -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); +scsi_adjust_queue_depth (sdev, sdev->host->cmd_per_lun);scsi_sysfs_device_initialize (sdev);
@@ -880,8 +880,10 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, (inq_result[3] & 0x0f) == 1 ? " CCS" : "");if ((sdev->scsi_level >=SCSI_2 ) && (inq_result[7 ] &2 ) && - !(*bflags &BLIST_NOTQ )) + !(*bflags &BLIST_NOTQ )) { sdev->tagged_supported =1 ; + sdev->simple_tags =1 ; + }/* * Some devices (Texel CD ROM drives) have handshaking problems
drivers/scsi/stex.c +0 -2
@@ -549,8 +549,6 @@ stex_slave_alloc(struct scsi_device *sdev)/* Cheat: usually extracted from Inquiry data */ sdev->tagged_supported =1 ; -scsi_adjust_queue_depth (sdev,0 , sdev->host->can_queue); -return 0 ; }
drivers/scsi/storvsc_drv.c +1 -2
@@ -1429,8 +1429,7 @@ static void storvsc_device_destroy(struct scsi_device *sdevice)static int storvsc_device_configure (struct scsi_device *sdevice) { -scsi_adjust_queue_depth (sdevice,MSG_SIMPLE_TAG , -STORVSC_MAX_IO_REQUESTS ); +scsi_adjust_queue_depth (sdevice,STORVSC_MAX_IO_REQUESTS );blk_queue_max_segment_size (sdevice->request_queue,PAGE_SIZE );
drivers/scsi/sym53c8xx_2/sym_glue.c +1 -3
@@ -820,9 +820,7 @@ static int sym53c8xx_slave_configure(struct scsi_device *sdev)if (reqtags >SYM_CONF_MAX_TAG ) reqtags =SYM_CONF_MAX_TAG ; depth_to_use = reqtags ? reqtags :1 ; -scsi_adjust_queue_depth (sdev, - sdev->tagged_supported ?MSG_SIMPLE_TAG :0 , - depth_to_use); +scsi_adjust_queue_depth (sdev, depth_to_use); lp->s.scdev_depth = depth_to_use;sym_tune_dev_queuing (tp, sdev->lun, reqtags);
drivers/scsi/tmscsim.c +8 -1
@@ -2185,9 +2185,16 @@ static int dc390_slave_configure(struct scsi_device *sdev)struct dc390_dcb *dcb = (struct dc390_dcb *)sdev->hostdata; acb->scan_devices =0 ; + +/* +* XXX: Note that while this driver used to called scsi_activate_tcq, +* it never actually set a tag type, so emulate the old behavior. +*/ +scsi_set_tag_type (sdev,0 ); +if (sdev->tagged_supported && (dcb->DevMode &TAG_QUEUEING_ )) { dcb->SyncMode |=EN_TAG_QUEUEING ; -scsi_adjust_queue_depth (sdev,0 , acb->TagMaxNum); +scsi_adjust_queue_depth (sdev, acb->TagMaxNum); }return 0 ;
drivers/scsi/u14-34f.c +5 -5
@@ -696,25 +696,25 @@ static int u14_34f_slave_configure(struct scsi_device *dev) {if (TLDEV (dev->type) && dev->tagged_supported)if (tag_mode ==TAG_SIMPLE ) { -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", simple tags" ; }else if (tag_mode ==TAG_ORDERED ) { -scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", ordered tags" ; }else { -scsi_adjust_queue_depth (dev,0 , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", no tags" ; }else if (TLDEV (dev->type) && linked_comm) { -scsi_adjust_queue_depth (dev,0 , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", untagged" ; }else { -scsi_adjust_queue_depth (dev,0 , utqd); +scsi_adjust_queue_depth (dev, utqd); tag_suffix ="" ; }
drivers/scsi/ufs/ufshcd.c +2 -2
@@ -2696,7 +2696,7 @@ static void ufshcd_set_queue_depth(struct scsi_device *sdev)dev_dbg (hba->dev,"%s: activate tcq with queue depth %d\n" , __func__, lun_qdepth);if (sdev->tagged_supported) -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), lun_qdepth); +scsi_adjust_queue_depth (sdev, lun_qdepth); }/*
@@ -2808,7 +2808,7 @@ static int ufshcd_change_queue_depth(struct scsi_device *sdev,case SCSI_QDEPTH_RAMP_UP :if (!sdev->tagged_supported) depth =1 ; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);
drivers/scsi/virtio_scsi.c +1 -3
@@ -683,9 +683,7 @@ static int virtscsi_change_queue_depth(struct scsi_device *sdev,break ;case SCSI_QDEPTH_RAMP_UP :/* Raise qdepth after BUSY state resolved */ case SCSI_QDEPTH_DEFAULT :/* Manual change via sysfs */ -scsi_adjust_queue_depth (sdev, -scsi_get_tag_type (sdev), -min (max_depth, qdepth)); +scsi_adjust_queue_depth (sdev,min (max_depth, qdepth));break ;default :return -EOPNOTSUPP ;
drivers/scsi/vmw_pvscsi.c +1 -1
@@ -522,7 +522,7 @@ static int pvscsi_change_queue_depth(struct scsi_device *sdev, max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);if (sdev->inquiry_len >7 ) sdev_printk(KERN_INFO, sdev,
drivers/target/loopback/tcm_loop.c +2 -16
@@ -121,13 +121,13 @@ static int tcm_loop_change_queue_depth( {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;default :return -EOPNOTSUPP ;
@@ -404,19 +404,6 @@ static int tcm_loop_slave_alloc(struct scsi_device *sd)return 0 ; } -static int tcm_loop_slave_configure (struct scsi_device *sd) -{ -if (sd->tagged_supported) { -scsi_adjust_queue_depth (sd,MSG_SIMPLE_TAG , - sd->host->cmd_per_lun); - }else { -scsi_adjust_queue_depth (sd,0 , - sd->host->cmd_per_lun); - } - -return 0 ; -} -static struct scsi_host_template tcm_loop_driver_template = { .show_info = tcm_loop_show_info, .proc_name ="tcm_loopback" ,
@@ -434,7 +421,6 @@ static struct scsi_host_template tcm_loop_driver_template = { .max_sectors = 0xFFFF, .use_clustering = DISABLE_CLUSTERING, .slave_alloc = tcm_loop_slave_alloc, - .slave_configure = tcm_loop_slave_configure, .module = THIS_MODULE, .use_blk_tags = 1, };
drivers/usb/storage/uas.c +1 -1
@@ -799,7 +799,7 @@ static int uas_slave_configure(struct scsi_device *sdev)if (devinfo->flags &US_FL_NO_REPORT_OPCODES ) sdev->no_report_opcodes =1 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , devinfo->qdepth -2 ); +scsi_adjust_queue_depth (sdev, devinfo->qdepth -2 );return 0 ; }
include/scsi/scsi_device.h +1 -1
@@ -387,7 +387,7 @@ extern struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *,#define __shost_for_each_device (sdev, shost) \ list_for_each_entry((sdev), &((shost)->__devices), siblings) -extern void scsi_adjust_queue_depth (struct scsi_device *,int ,int ); +extern void scsi_adjust_queue_depth (struct scsi_device *,int );extern int scsi_track_queue_full (struct scsi_device *,int );extern int scsi_set_medium_removal (struct scsi_device *,char );
Signature · 1 line
1.9.1
Hannes Reinecke
maintainerRe: [PATCH 09/11] scsi: don't set tagging state from scsi_adjust_queue_depth
Quoted 319 lines · Christoph Hellwig
Remove the tagged argument from
scsi_adjust_queue_depth, and just let it handle the queue depth. For most drivers those two are fairly separate, given that most modern drivers don't care about the SCSI "tagged" status of a command at all, and many old drivers allow queuing of multiple untagged commands in the driver.Instead we start out with the ->simple_tags flag set before calling ->slave_configure, which is how all drivers actually looking at ->simple_tags except for one worke anyway. The one other case looks broken, but I've kept the behavior as-is for now.
Except for that we only change ->simple_tags from the ->change_queue_type, and when rejecting a tag message in a single driver, so keeping this churn out of
scsi_adjust_queue_depthis a clear win.Now that the usage of
scsi_adjust_queue_depthis more obvious we can also remove all the trivial instances in ->slave_alloc or ->slave_configure that just set it to thecmd_per_lundefault.Signed-off-by Christoph Hellwig <[email protected]>--- Documentation/scsi/scsi_mid_low_api.txt | 12 ++++------ drivers/ata/libata-scsi.c | 4 ++-- drivers/infiniband/ulp/srp/ib_srp.c | 2 +- drivers/message/fusion/mptscsih.c | 2 +- drivers/s390/scsi/zfcp_scsi.c | 8 +++---- drivers/scsi/3w-9xxx.c | 2 +- drivers/scsi/3w-sas.c | 2 +- drivers/scsi/3w-xxxx.c | 2 +- drivers/scsi/53c700.c | 17 ++++++------- drivers/scsi/BusLogic.c | 4 ++-- drivers/scsi/aacraid/linit.c | 9 ++++--- drivers/scsi/advansys.c | 7 ++---- drivers/scsi/aic7xxx/aic79xx_osm.c | 7 ++---- drivers/scsi/aic7xxx/aic7xxx_osm.c | 8 ++----- drivers/scsi/arcmsr/arcmsr_hba.c | 2 +- drivers/scsi/bfa/bfad_im.c | 3 +-- drivers/scsi/csiostor/csio_scsi.c | 2 +- drivers/scsi/dpt_i2o.c | 4 +--- drivers/scsi/eata.c | 8 +++---- drivers/scsi/esas2r/esas2r.h | 3 --- drivers/scsi/esas2r/esas2r_main.c | 29 +--------------------- drivers/scsi/esp_scsi.c | 17 ++----------- drivers/scsi/fnic/fnic_main.c | 2 +- drivers/scsi/gdth.c | 1 - drivers/scsi/hpsa.c | 2 +- drivers/scsi/hptiop.c | 2 +- drivers/scsi/ibmvscsi/ibmvfc.c | 8 +------ drivers/scsi/ibmvscsi/ibmvscsi.c | 3 +-- drivers/scsi/ipr.c | 8 +++---- drivers/scsi/ips.c | 2 +- drivers/scsi/libfc/fc_fcp.c | 6 ++--- drivers/scsi/libiscsi.c | 4 ++-- drivers/scsi/libsas/sas_scsi_host.c | 20 +++++----------- drivers/scsi/lpfc/lpfc_scsi.c | 4 ++-- drivers/scsi/megaraid/megaraid_mbox.c | 2 +- drivers/scsi/megaraid/megaraid_sas_base.c | 3 +-- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 2 +- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 +- drivers/scsi/ncr53c8xx.c | 5 +--- drivers/scsi/pmcraid.c | 40 ++++++------------------------- drivers/scsi/qla1280.c | 5 ++-- drivers/scsi/qla2xxx/qla_os.c | 6 ++--- drivers/scsi/qla4xxx/ql4_os.c | 2 +- drivers/scsi/scsi.c | 25 ++++--------------- drivers/scsi/scsi_debug.c | 7 ++---- drivers/scsi/scsi_scan.c | 6 +++-- drivers/scsi/stex.c | 2 -- drivers/scsi/storvsc_drv.c | 3 +-- drivers/scsi/sym53c8xx_2/sym_glue.c | 4 +--- drivers/scsi/tmscsim.c | 9 ++++++- drivers/scsi/u14-34f.c | 10 ++++---- drivers/scsi/ufs/ufshcd.c | 4 ++-- drivers/scsi/virtio_scsi.c | 4 +--- drivers/scsi/vmw_pvscsi.c | 2 +- drivers/target/loopback/tcm_loop.c | 18 ++------------ drivers/usb/storage/uas.c | 2 +- include/scsi/scsi_device.h | 2 +- 57 files changed, 120 insertions(+), 261 deletions(-)Documentation/scsi/scsi_mid_low_api.txt +4
-8@@ -271,9 +271,9 @@ init_this_scsi_driver() ----+ slave_destroy() *** ------------------------------------------------------------ -The mid level invokes scsi_adjust_queue_depth() with tagged queuing off and -"cmd_per_lun" for that host as the queue length. These settings can be -overridden by a slave_configure() supplied by the LLD. +The mid level invokes scsi_adjust_queue_depth() with "cmd_per_lun" for that +host as the queue length. These settings can be overridden by a +slave_configure() supplied by the LLD. *** For scsi devices that the mid level tries to scan but do not respond, a slave_alloc(), slave_destroy() pair is called.@@ -438,9 +438,6 @@ int scsi_add_host(struct Scsi_Host *shost, struct device * dev) /** * scsi_adjust_queue_depth - allow LLD to change queue depth on a SCSI device * @sdev: pointer to SCSI device to change queue depth on - * @tagged: 0 - no tagged queuing - * MSG_SIMPLE_TAG - simple tagged queuing - * MSG_ORDERED_TAG - ordered tagged queuing * @tags Number of tags allowed if tagged queuing enabled, * or number of commands the LLD can queue up * in non-tagged mode (as per cmd_per_lun).@@ -456,8 +453,7 @@ int scsi_add_host(struct Scsi_Host *shost, struct device * dev) * Defined in: drivers/scsi/scsi.c [see source code for more notes] * **/ -void scsi_adjust_queue_depth(struct scsi_device * sdev, int tagged, - int tags) +void scsi_adjust_queue_depth(struct scsi_device *sdev, int tags) /**drivers/ata/libata-scsi.c +2
-2@@ -1164,7 +1164,7 @@ static int ata_scsi_dev_config(struct scsi_device *sdev, depth =min (sdev->host->can_queue,ata_id_queue_depth (dev->id)); depth =min (ATA_MAX_QUEUE -1 , depth); -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , depth); +scsi_adjust_queue_depth (sdev, depth); }blk_queue_flush_queueable (q, false);@@ -1282,7 +1282,7 @@ int __ata_change_queue_depth(struct ata_port *ap, struct scsi_device *sdev,if (sdev->queue_depth == queue_depth)return -EINVAL ; -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }drivers/infiniband/ulp/srp/ib_srp.c +1
-1@@ -2278,7 +2278,7 @@ srp_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }else if (reason ==SCSI_QDEPTH_QFULL )scsi_track_queue_full (sdev, qdepth);else drivers/message/fusion/mptscsih.c +1
-1@@ -2347,7 +2347,7 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }drivers/s390/scsi/zfcp_scsi.c +3
-5@@ -37,13 +37,13 @@ static int zfcp_scsi_change_queue_depth(struct scsi_device *sdev, int depth, {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;default :return -EOPNOTSUPP ;@@ -66,9 +66,7 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdev)static int zfcp_scsi_slave_configure (struct scsi_device *sdp) {if (sdp->tagged_supported) -scsi_adjust_queue_depth (sdp,MSG_SIMPLE_TAG , default_depth); -else -scsi_adjust_queue_depth (sdp,0 ,1 ); +scsi_adjust_queue_depth (sdp, default_depth);return 0 ; }drivers/scsi/3w-9xxx.c +1
-1@@ -198,7 +198,7 @@ static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth,if (queue_depth >TW_Q_LENGTH -2 ) queue_depth =TW_Q_LENGTH -2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }/* End twa_change_queue_depth() */ drivers/scsi/3w-sas.c +1
-1@@ -200,7 +200,7 @@ static int twl_change_queue_depth(struct scsi_device *sdev, int queue_depth,if (queue_depth >TW_Q_LENGTH -2 ) queue_depth =TW_Q_LENGTH -2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }/* End twl_change_queue_depth() */ drivers/scsi/3w-xxxx.c +1
-1@@ -532,7 +532,7 @@ static int tw_change_queue_depth(struct scsi_device *sdev, int queue_depth,if (queue_depth >TW_Q_LENGTH -2 ) queue_depth =TW_Q_LENGTH -2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }/* End tw_change_queue_depth() */ drivers/scsi/53c700.c +9
-8@@ -902,8 +902,10 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata/* we're done negotiating */ NCR_700_set_tag_neg_state (SCp->device,NCR_700_FINISHED_TAG_NEGOTIATION ); hostdata->tag_negotiated &= ~(1 <<scmd_id (SCp)); + SCp->device->tagged_supported =0 ; -scsi_adjust_queue_depth (SCp->device,0 , host->cmd_per_lun); +scsi_adjust_queue_depth (SCp->device, host->cmd_per_lun); +scsi_set_tag_type (SCp->device,0 ); }else { shost_printk(KERN_WARNING, host, "(%d:%d) Unexpected REJECT Message %s\n",@@ -2050,12 +2052,10 @@ NCR_700_slave_configure(struct scsi_device *SDp)/* to do here: allocate memory; build a queue_full list */ if (SDp->tagged_supported) { -scsi_adjust_queue_depth (SDp,MSG_ORDERED_TAG ,NCR_700_DEFAULT_TAGS ); +scsi_adjust_queue_depth (SDp,NCR_700_DEFAULT_TAGS );NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); - }else { -/* initialise to default depth */ -scsi_adjust_queue_depth (SDp,0 , SDp->host->cmd_per_lun); } +if (hostdata->fast) {/* Find the correct offset and period via domain validation */ if (!spi_initial_dv (SDp->sdev_target))@@ -2083,7 +2083,7 @@ NCR_700_change_queue_depth(struct scsi_device *SDp, int depth, int reason)if (depth >NCR_700_MAX_TAGS ) depth =NCR_700_MAX_TAGS ; -scsi_adjust_queue_depth (SDp,scsi_get_tag_type (SDp), depth); +scsi_adjust_queue_depth (SDp, depth);return depth; }@@ -2101,15 +2101,16 @@ static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type)if (change_tag)scsi_target_quiesce (SDp->sdev_target); +scsi_set_tag_type (SDp, tag_type);if (!tag_type) {/* shift back to the default unqueued number of commands * (the user can still raise this) */ -scsi_adjust_queue_depth (SDp,0 , SDp->host->cmd_per_lun); +scsi_adjust_queue_depth (SDp, SDp->host->cmd_per_lun); hostdata->tag_negotiated &= ~(1 <<sdev_id (SDp)); }else {/* Here, we cleared the negotiation flag above, so this * will force the driver to renegotiate */ -scsi_adjust_queue_depth (SDp, tag_type, SDp->queue_depth); +scsi_adjust_queue_depth (SDp, SDp->queue_depth);if (change_tag)NCR_700_set_tag_neg_state (SDp,NCR_700_START_TAG_NEGOTIATION ); }drivers/scsi/BusLogic.c +2
-2@@ -2327,12 +2327,12 @@ static int blogic_slaveconfig(struct scsi_device *dev)if (qdepth ==0 ) qdepth =BLOGIC_MAX_AUTO_TAG_DEPTH ; adapter->qdepth[tgt_id] = qdepth; -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , qdepth); +scsi_adjust_queue_depth (dev, qdepth); }else { adapter->tagq_ok &= ~(1 << tgt_id); qdepth = adapter->untag_qdepth; adapter->qdepth[tgt_id] = qdepth; -scsi_adjust_queue_depth (dev,0 , qdepth); +scsi_adjust_queue_depth (dev, qdepth); } qdepth =0 ;for (tgt_id =0 ; tgt_id < adapter->maxdev; tgt_id++)drivers/scsi/aacraid/linit.c +0
-0@@ -462,9 +462,8 @@ static int aac_slave_configure(struct scsi_device *sdev) depth =256 ;
drivers/scsi/aacraid/linit.c static int aac_slave_configure(struct scsi_device *sdev) · line 469
Quoted 10 lines
drivers/scsi/aacraid/linit.c +2
-3else if (depth <2 ) depth =2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , depth); - }else -scsi_adjust_queue_depth (sdev,0 ,1 ); +scsi_adjust_queue_depth (sdev, depth); + }return 0 ; }
Why did you omit the 'else' branch?cmd_per_lun is set to 256 for aacraid AFAICS ...
Quoted 91 lines
drivers/scsi/aacraid/linit.c +2
-2@@ -504,9 +503,9 @@ static int aac_change_queue_depth(struct scsi_device *sdev, int depth, depth =256 ; else if (depth < 2) depth =2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , depth); +scsi_adjust_queue_depth (sdev, depth); }else -scsi_adjust_queue_depth (sdev,0 ,1 ); +scsi_adjust_queue_depth (sdev,1 );return sdev->queue_depth; }drivers/scsi/advansys.c +2
-5@@ -7706,7 +7706,7 @@ advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc) asc_dvc->cfg->can_tagged_qng |= tid_bit; asc_dvc->use_tagged_qng |= tid_bit; } -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , +scsi_adjust_queue_depth (sdev, asc_dvc->max_dvc_qng[sdev->id]); } }else {@@ -7714,7 +7714,6 @@ advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc) asc_dvc->cfg->can_tagged_qng &= ~tid_bit; asc_dvc->use_tagged_qng &= ~tid_bit; } -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); } if ((sdev->lun == 0) &&@@ -7849,10 +7848,8 @@ advansys_wide_slave_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc) }if ((adv_dvc->tagqng_able & tidmask) && sdev->tagged_supported) { -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , +scsi_adjust_queue_depth (sdev, adv_dvc->max_dvc_qng); - }else { -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); } }drivers/scsi/aic7xxx/aic79xx_osm.c +2
-5@@ -1469,11 +1469,8 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,switch ((dev->flags & (AHD_DEV_Q_BASIC |AHD_DEV_Q_TAGGED ))) {case AHD_DEV_Q_BASIC : -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , - dev->openings + dev->active); -break ;case AHD_DEV_Q_TAGGED : -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , +scsi_adjust_queue_depth (sdev, dev->openings + dev->active);break ;default :@@ -1483,7 +1480,7 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_adjust_queue_depth (sdev,0 ,1 ); +scsi_adjust_queue_depth (sdev,1 );break ; } }drivers/scsi/aic7xxx/aic7xxx_osm.c +1
-5@@ -1335,13 +1335,9 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, }switch ((dev->flags & (AHC_DEV_Q_BASIC |AHC_DEV_Q_TAGGED ))) {case AHC_DEV_Q_BASIC : -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TASK , - dev->openings + dev->active); -break ;case AHC_DEV_Q_TAGGED : -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TASK , +scsi_adjust_queue_depth (sdev, dev->openings + dev->active); -break ;default :/* * We allow the OS to queue 2 untagged transactions to
drivers/scsi/aic7xxx/aic7xxx_osm.c ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, · line 1351
Quoted 8 lines
drivers/scsi/aic7xxx/aic7xxx_osm.c +1
-1@@ -1349,7 +1345,7 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev,* serially on the controller/device. This should * remove some latency. */ -scsi_adjust_queue_depth (sdev,0 ,2 ); +scsi_adjust_queue_depth (sdev,2 );break ; } }
Hmm. This is actually wrong; it should be set to '1'. '2' is a left-over from the (long since removed) internal queueing within the aic7xxx driver.
Quoted 858 lines
drivers/scsi/arcmsr/arcmsr_hba.c +1
-1@@ -122,7 +122,7 @@ static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev,if (queue_depth >ARCMSR_MAX_CMD_PERLUN ) queue_depth =ARCMSR_MAX_CMD_PERLUN ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }drivers/scsi/bfa/bfad_im.c +1
-2@@ -776,7 +776,7 @@ bfad_thread_workq(struct bfad_s *bfad)static int bfad_im_slave_configure (struct scsi_device *sdev) { -scsi_adjust_queue_depth (sdev,0 , bfa_lun_queue_depth); +scsi_adjust_queue_depth (sdev, bfa_lun_queue_depth);return 0 ; }@@ -867,7 +867,6 @@ bfad_ramp_up_qdepth(struct bfad_itnim_s *itnim, struct scsi_device *sdev)if (tmp_sdev->id != sdev->id)continue ;scsi_adjust_queue_depth (tmp_sdev, -MSG_SIMPLE_TAG , tmp_sdev->queue_depth +1 ); itnim->last_ramp_up_time = jiffies;drivers/scsi/csiostor/csio_scsi.c +1
-1@@ -2241,7 +2241,7 @@ csio_slave_alloc(struct scsi_device *sdev)static int csio_slave_configure (struct scsi_device *sdev) { -scsi_adjust_queue_depth (sdev,0 , csio_lun_qdepth); +scsi_adjust_queue_depth (sdev, csio_lun_qdepth);return 0 ; }drivers/scsi/dpt_i2o.c +1
-3@@ -415,10 +415,8 @@ static int adpt_slave_configure(struct scsi_device * device) pHba = (adpt_hba *) host->hostdata[0 ];if (host->can_queue && device->tagged_supported) { -scsi_adjust_queue_depth (device,MSG_SIMPLE_TAG , +scsi_adjust_queue_depth (device, host->can_queue -1 ); - }else { -scsi_adjust_queue_depth (device,0 ,1 ); }return 0 ; }drivers/scsi/eata.c +3
-5@@ -946,20 +946,18 @@ static int eata2x_slave_configure(struct scsi_device *dev)if (TLDEV (dev->type) && dev->tagged_supported) {if (tag_mode ==TAG_SIMPLE ) { -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , tqd); tag_suffix =", simple tags" ; }else if (tag_mode ==TAG_ORDERED ) { -scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , tqd); tag_suffix =", ordered tags" ; }else { -scsi_adjust_queue_depth (dev,0 , tqd); tag_suffix =", no tags" ; } +scsi_adjust_queue_depth (dev, tqd); }else if (TLDEV (dev->type) && linked_comm) { -scsi_adjust_queue_depth (dev,0 , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", untagged" ; }else { -scsi_adjust_queue_depth (dev,0 , utqd); +scsi_adjust_queue_depth (dev, utqd); tag_suffix ="" ; }drivers/scsi/esas2r/esas2r.h +0
-3@@ -972,9 +972,6 @@ u8 handle_hba_ioctl(struct esas2r_adapter *a, struct atto_ioctl *ioctl_hba);int esas2r_queuecommand (struct Scsi_Host *host,struct scsi_cmnd *cmd);int esas2r_show_info (struct seq_file *m,struct Scsi_Host *sh); -int esas2r_slave_alloc (struct scsi_device *dev); -int esas2r_slave_configure (struct scsi_device *dev); -void esas2r_slave_destroy (struct scsi_device *dev);int esas2r_change_queue_depth (struct scsi_device *dev,int depth,int reason);long esas2r_proc_ioctl (struct file *fp,unsigned int cmd,unsigned long arg);drivers/scsi/esas2r/esas2r_main.c +1
-28@@ -254,9 +254,6 @@ static struct scsi_host_template driver_template = { .use_clustering = ENABLE_CLUSTERING, .emulated = 0, .proc_name = ESAS2R_DRVR_NAME, - .slave_configure = esas2r_slave_configure, - .slave_alloc = esas2r_slave_alloc, - .slave_destroy = esas2r_slave_destroy, .change_queue_depth = esas2r_change_queue_depth, .change_queue_type = scsi_change_queue_type, .max_sectors = 0xFFFF,@@ -1264,35 +1261,11 @@ int esas2r_change_queue_depth(struct scsi_device *dev, int depth, int reason) {esas2r_log (ESAS2R_LOG_INFO ,"change_queue_depth %p, %d" , dev, depth); -scsi_adjust_queue_depth (dev,scsi_get_tag_type (dev), depth); +scsi_adjust_queue_depth (dev, depth);return dev->queue_depth; } -int esas2r_slave_alloc (struct scsi_device *dev) -{ -return 0 ; -} - -int esas2r_slave_configure (struct scsi_device *dev) -{ -esas2r_log_dev (ESAS2R_LOG_INFO , &(dev->sdev_gendev), -"esas2r_slave_configure()" ); - -if (dev->tagged_supported) -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , cmd_per_lun); -else -scsi_adjust_queue_depth (dev,0 , cmd_per_lun); - -return 0 ; -} - -void esas2r_slave_destroy (struct scsi_device *dev) -{ -esas2r_log_dev (ESAS2R_LOG_INFO , &(dev->sdev_gendev), -"esas2r_slave_destroy()" ); -} -void esas2r_log_request_failure (struct esas2r_adapter *a,struct esas2r_request *rq) {drivers/scsi/esp_scsi.c +2
-15@@ -2402,27 +2402,14 @@ static int esp_slave_configure(struct scsi_device *dev) {struct esp *esp =shost_priv (dev->host);struct esp_target_data *tp = &esp->target[dev->id]; -int goal_tags, queue_depth; - - goal_tags =0 ;if (dev->tagged_supported) {/* XXX make this configurable somehow XXX */ - goal_tags =ESP_DEFAULT_TAGS ; +int goal_tags =min (ESP_DEFAULT_TAGS ,ESP_MAX_TAG ); -if (goal_tags >ESP_MAX_TAG ) - goal_tags =ESP_MAX_TAG ; +scsi_adjust_queue_depth (dev, goal_tags); } - queue_depth = goal_tags; -if (queue_depth < dev->host->cmd_per_lun) - queue_depth = dev->host->cmd_per_lun; - -if (goal_tags) { -scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , queue_depth); - }else { -scsi_adjust_queue_depth (dev,0 , queue_depth); - } tp->flags |=ESP_TGT_DISCONNECT ;if (!spi_initial_dv (dev->sdev_target))drivers/scsi/fnic/fnic_main.c +1
-1@@ -100,7 +100,7 @@ static int fnic_slave_alloc(struct scsi_device *sdev)if (!rport ||fc_remote_port_chkready (rport))return -ENXIO ; -scsi_adjust_queue_depth (sdev,0 , fnic_max_qdepth); +scsi_adjust_queue_depth (sdev, fnic_max_qdepth);return 0 ; }drivers/scsi/gdth.c +0
-1@@ -4661,7 +4661,6 @@ static void gdth_flush(gdth_ha_str *ha)/* configure lun */ static int gdth_slave_configure (struct scsi_device *sdev) { -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); sdev->skip_ms_page_3f =1 ; sdev->skip_ms_page_8 =1 ;return 0 ;drivers/scsi/hpsa.c +1
-1@@ -4165,7 +4165,7 @@ static int hpsa_change_queue_depth(struct scsi_device *sdev,else if (qdepth > h->nr_cmds) qdepth = h->nr_cmds; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }drivers/scsi/hptiop.c +1
-1@@ -1127,7 +1127,7 @@ static int hptiop_adjust_disk_queue_depth(struct scsi_device *sdev,if (queue_depth > hba->max_requests) queue_depth = hba->max_requests; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }drivers/scsi/ibmvscsi/ibmvfc.c +1
-7@@ -2887,12 +2887,6 @@ static int ibmvfc_slave_configure(struct scsi_device *sdev)spin_lock_irqsave (shost->host_lock, flags);if (sdev->type ==TYPE_DISK ) sdev->allow_restart =1 ; - -if (sdev->tagged_supported) -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , - sdev->queue_depth); -else -scsi_adjust_queue_depth (sdev,0 , sdev->queue_depth);spin_unlock_irqrestore (shost->host_lock, flags);return 0 ; }@@ -2915,7 +2909,7 @@ static int ibmvfc_change_queue_depth(struct scsi_device *sdev, int qdepth,if (qdepth >IBMVFC_MAX_CMDS_PER_LUN ) qdepth =IBMVFC_MAX_CMDS_PER_LUN ; -scsi_adjust_queue_depth (sdev,0 , qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }drivers/scsi/ibmvscsi/ibmvscsi.c +1
-2@@ -1929,7 +1929,6 @@ static int ibmvscsi_slave_configure(struct scsi_device *sdev)blk_queue_rq_timeout (sdev->request_queue,120 *HZ ); }spin_unlock_irqrestore (shost->host_lock, lock_flags); -scsi_adjust_queue_depth (sdev,0 , shost->cmd_per_lun);return 0 ; }@@ -1951,7 +1950,7 @@ static int ibmvscsi_change_queue_depth(struct scsi_device *sdev, int qdepth,if (qdepth >IBMVSCSI_MAX_CMDS_PER_LUN ) qdepth =IBMVSCSI_MAX_CMDS_PER_LUN ; -scsi_adjust_queue_depth (sdev,0 , qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }drivers/scsi/ipr.c +4
-4@@ -4348,7 +4348,7 @@ static int ipr_change_queue_depth(struct scsi_device *sdev, int qdepth, qdepth =IPR_MAX_CMD_PER_ATA_LUN ;spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags); -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }@@ -4755,10 +4755,10 @@ static int ipr_slave_configure(struct scsi_device *sdev)spin_unlock_irqrestore (ioa_cfg->host->host_lock, lock_flags);if (ap) { -scsi_adjust_queue_depth (sdev,0 ,IPR_MAX_CMD_PER_ATA_LUN ); +scsi_adjust_queue_depth (sdev,IPR_MAX_CMD_PER_ATA_LUN );ata_sas_slave_configure (sdev, ap); - }else -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); + } +if (ioa_cfg->sis64) sdev_printk(KERN_INFO, sdev, "Resource path: %s\n", ipr_format_res_path(ioa_cfg,drivers/scsi/ips.c +1
-1@@ -1210,7 +1210,7 @@ ips_slave_configure(struct scsi_device * SDptr) min = ha->max_cmds /2 ;if (ha->enq->ucLogDriveCount <=2 ) min = ha->max_cmds -1 ; -scsi_adjust_queue_depth (SDptr,MSG_ORDERED_TAG , min); +scsi_adjust_queue_depth (SDptr, min); } SDptr->skip_ms_page_8 =1 ;drivers/scsi/libfc/fc_fcp.c +3
-3@@ -2160,7 +2160,7 @@ int fc_slave_alloc(struct scsi_device *sdev)if (!rport ||fc_remote_port_chkready (rport))return -ENXIO ; -scsi_adjust_queue_depth (sdev,0 ,FC_FCP_DFLT_QUEUE_DEPTH ); +scsi_adjust_queue_depth (sdev,FC_FCP_DFLT_QUEUE_DEPTH );return 0 ; }EXPORT_SYMBOL (fc_slave_alloc);@@ -2175,13 +2175,13 @@ int fc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, qdepth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;default :return -EOPNOTSUPP ;drivers/scsi/libiscsi.c +2
-2@@ -1775,13 +1775,13 @@ int iscsi_change_queue_depth(struct scsi_device *sdev, int depth, int reason) {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;default :return -EOPNOTSUPP ;drivers/scsi/libsas/sas_scsi_host.c +6
-14@@ -940,13 +940,13 @@ int sas_slave_configure(struct scsi_device *scsi_dev)sas_read_port_mode_page (scsi_dev);if (scsi_dev->tagged_supported) { -scsi_adjust_queue_depth (scsi_dev,MSG_SIMPLE_TAG ,SAS_DEF_QD ); +scsi_adjust_queue_depth (scsi_dev,SAS_DEF_QD ); }else {SAS_DPRINTK ("device %llx, LUN %llx doesn't support " "TCQ\n" ,SAS_ADDR (dev->sas_addr), scsi_dev->lun); scsi_dev->tagged_supported =0 ; -scsi_adjust_queue_depth (scsi_dev,0 ,1 ); +scsi_adjust_queue_depth (scsi_dev,1 ); } scsi_dev->allow_restart =1 ;@@ -967,7 +967,7 @@ int sas_change_queue_depth(struct scsi_device *sdev, int depth, int reason)case SCSI_QDEPTH_RAMP_UP :if (!sdev->tagged_supported) depth =1 ; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);@@ -979,19 +979,11 @@ int sas_change_queue_depth(struct scsi_device *sdev, int depth, int reason)return depth; } -int sas_change_queue_type (struct scsi_device *scsi_dev,int qt) +int sas_change_queue_type (struct scsi_device *scsi_dev,int type) { -struct domain_device *dev =sdev_to_domain_dev (scsi_dev); - -if (dev_is_sata (dev)) +if (dev_is_sata (sdev_to_domain_dev (scsi_dev)))return -EINVAL ; - -if (!scsi_dev->tagged_supported) -return 0 ; - -scsi_adjust_queue_depth (scsi_dev, qt, scsi_dev->queue_depth); - -return qt; +return scsi_change_queue_type (scsi_dev, type); } int sas_bios_param(struct scsi_device *scsi_dev,drivers/scsi/lpfc/lpfc_scsi.c +2
-2@@ -320,7 +320,7 @@ lpfc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)case SCSI_QDEPTH_DEFAULT :/* change request from sysfs, fall through */ case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;case SCSI_QDEPTH_QFULL :if (scsi_track_queue_full (sdev, qdepth) ==0 )@@ -5598,7 +5598,7 @@ lpfc_slave_configure(struct scsi_device *sdev)struct lpfc_vport *vport = (struct lpfc_vport *) sdev->host->hostdata;struct lpfc_hba *phba = vport->phba; -scsi_adjust_queue_depth (sdev,0 , vport->cfg_lun_queue_depth); +scsi_adjust_queue_depth (sdev, vport->cfg_lun_queue_depth);if (phba->cfg_poll &ENABLE_FCP_RING_POLLING ) { lpfc_sli_handle_fast_ring_event(phba,drivers/scsi/megaraid/megaraid_mbox.c +1
-1@@ -349,7 +349,7 @@ static int megaraid_change_queue_depth(struct scsi_device *sdev, int qdepth,if (qdepth >MBOX_MAX_SCSI_CMDS ) qdepth =MBOX_MAX_SCSI_CMDS ; -scsi_adjust_queue_depth (sdev,0 , qdepth); +scsi_adjust_queue_depth (sdev, qdepth);return sdev->queue_depth; }drivers/scsi/megaraid/megaraid_sas_base.c +1
-2@@ -2594,8 +2594,7 @@ static int megasas_change_queue_depth(struct scsi_device *sdev,if (queue_depth > sdev->host->can_queue) queue_depth = sdev->host->can_queue; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), - queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return queue_depth; }drivers/scsi/mpt2sas/mpt2sas_scsih.c +1
-1@@ -1222,7 +1222,7 @@ _scsih_adjust_queue_depth(struct scsi_device *sdev, int qdepth) max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }/** drivers/scsi/mpt3sas/mpt3sas_scsih.c +1
-1@@ -1090,7 +1090,7 @@ _scsih_adjust_queue_depth(struct scsi_device *sdev, int qdepth) max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }/** drivers/scsi/ncr53c8xx.c +1
-4@@ -7997,10 +7997,7 @@ static int ncr53c8xx_slave_configure(struct scsi_device *device)if (depth_to_use >MAX_TAGS ) depth_to_use =MAX_TAGS ; -scsi_adjust_queue_depth (device, - (device->tagged_supported ? -MSG_SIMPLE_TAG :0 ), - depth_to_use); +scsi_adjust_queue_depth (device, depth_to_use);/* ** Since the queue depth is not tunable under Linux, drivers/scsi/pmcraid.c +7
-33@@ -249,14 +249,11 @@ static int pmcraid_slave_configure(struct scsi_device *scsi_dev) PMCRAID_VSET_MAX_SECTORS); } -if (scsi_dev->tagged_supported && - (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) { -scsi_adjust_queue_depth (scsi_dev,MSG_SIMPLE_TAG , - scsi_dev->host->cmd_per_lun); - }else { -scsi_adjust_queue_depth (scsi_dev,0 , - scsi_dev->host->cmd_per_lun); - } +/* +* We never want to report TCQ support for these types of devices. +*/ +if (!RES_IS_GSCSI (res->cfg_entry) && !RES_IS_VSET (res->cfg_entry)) + scsi_dev->tagged_supported =0 ;return 0 ; }@@ -302,35 +299,12 @@ static int pmcraid_change_queue_depth(struct scsi_device *scsi_dev, int depth,if (depth >PMCRAID_MAX_CMD_PER_LUN ) depth =PMCRAID_MAX_CMD_PER_LUN ; -scsi_adjust_queue_depth (scsi_dev,scsi_get_tag_type (scsi_dev), depth); +scsi_adjust_queue_depth (scsi_dev, depth);return scsi_dev->queue_depth; }/** -* pmcraid_change_queue_type - Change the device's queue type -* @scsi_dev: scsi device struct -* @tag: type of tags to use -* -* Return value: -* actual queue type set -*/ -static int pmcraid_change_queue_type (struct scsi_device *scsi_dev,int tag) -{ -struct pmcraid_resource_entry *res; - - res = (struct pmcraid_resource_entry *)scsi_dev->hostdata; -if (res && scsi_dev->tagged_supported && - (RES_IS_GSCSI (res->cfg_entry) ||RES_IS_VSET (res->cfg_entry))) - tag =scsi_change_queue_type (scsi_dev, tag); -else - tag =0 ; - -return tag; -} - - -/** * pmcraid_init_cmdblk - initializes a command block * * @cmd: pointer to struct pmcraid_cmd to be initialized @@ -4285,7 +4259,7 @@ static struct scsi_host_template pmcraid_host_template = { .slave_configure = pmcraid_slave_configure, .slave_destroy = pmcraid_slave_destroy, .change_queue_depth = pmcraid_change_queue_depth, - .change_queue_type = pmcraid_change_queue_type, + .change_queue_type = scsi_change_queue_type, .can_queue = PMCRAID_MAX_IO_CMD, .this_id = -1, .sg_tablesize = PMCRAID_MAX_IOADLS,drivers/scsi/qla1280.c +2
-3@@ -1224,10 +1224,9 @@ qla1280_slave_configure(struct scsi_device *device)if (device->tagged_supported && (ha->bus_settings[bus].qtag_enables & (BIT_0 << target))) { -scsi_adjust_queue_depth (device,MSG_ORDERED_TAG , - ha->bus_settings[bus].hiwat); +scsi_adjust_queue_depth (device, ha->bus_settings[bus].hiwat); }else { -scsi_adjust_queue_depth (device,0 , default_depth); +scsi_adjust_queue_depth (device, default_depth); } nv->bus[bus].target[target].parameter.enable_sync = device->sdtr;drivers/scsi/qla2xxx/qla_os.c +3
-3@@ -1405,7 +1405,7 @@ qla2xxx_slave_configure(struct scsi_device *sdev)if (IS_T10_PI_CAPABLE (vha->hw))blk_queue_update_dma_alignment (sdev->request_queue,0x7 ); -scsi_adjust_queue_depth (sdev,0 , req->max_q_depth); +scsi_adjust_queue_depth (sdev, req->max_q_depth);return 0 ; }@@ -1440,7 +1440,7 @@ static void qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, int qdepth)if (req->max_q_depth <= sdev->queue_depth || req->max_q_depth < qdepth)return ; -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , qdepth); +scsi_adjust_queue_depth (sdev, qdepth); ql_dbg(ql_dbg_io, vha, 0x302a, "Queue depth adjusted-up to %d for nexus=%ld:%d:%llu.\n",@@ -1452,7 +1452,7 @@ qla2x00_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);break ;case SCSI_QDEPTH_QFULL :qla2x00_handle_queue_full (sdev, qdepth);drivers/scsi/qla4xxx/ql4_os.c +1
-1@@ -9064,7 +9064,7 @@ static int qla4xxx_slave_alloc(struct scsi_device *sdev)if (ql4xmaxqdepth !=0 && ql4xmaxqdepth <=0xffffU ) queue_depth = ql4xmaxqdepth; -scsi_adjust_queue_depth (sdev,0 , queue_depth); +scsi_adjust_queue_depth (sdev, queue_depth);return 0 ; }drivers/scsi/scsi.c +5
-20@@ -744,8 +744,6 @@ void scsi_finish_command(struct scsi_cmnd *cmd)/** * scsi_adjust_queue_depth - Let low level drivers change a device's queue depth * @sdev: SCSI Device in question -* @tagged: Do we use tagged queueing (non-0) or do we treat -* this device as an untagged device (0) * @tags: Number of tags allowed if tagged queueing enabled, * or number of commands the low level driver can * queue up in non-tagged mode (as per cmd_per_lun). @@ -759,7 +757,7 @@ void scsi_finish_command(struct scsi_cmnd *cmd)* currently active and whether or not it even has the * command blocks built yet. */ -void scsi_adjust_queue_depth (struct scsi_device *sdev,int tagged,int tags) +void scsi_adjust_queue_depth (struct scsi_device *sdev,int tags) {unsigned long flags;@@ -787,20 +785,6 @@ void scsi_adjust_queue_depth(struct scsi_device *sdev, int tagged, int tags) } sdev->queue_depth = tags; -switch (tagged) { -case 0 : - sdev->simple_tags =0 ; -break ; -case MSG_ORDERED_TAG : -case MSG_SIMPLE_TAG : - sdev->simple_tags =1 ; -break ; -default : - sdev->simple_tags =0 ; -sdev_printk (KERN_WARNING , sdev, -"scsi_adjust_queue_depth, bad queue type, " -"disabled\n" ); - } out:spin_unlock_irqrestore (sdev->request_queue->queue_lock, flags); }@@ -848,11 +832,12 @@ int scsi_track_queue_full(struct scsi_device *sdev, int depth)return 0 ;if (sdev->last_queue_full_depth <8 ) {/* Drop back to untagged */ -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); +scsi_set_tag_type (sdev,0 ); +scsi_adjust_queue_depth (sdev, sdev->host->cmd_per_lun);return -1 ; } -scsi_adjust_queue_depth (sdev,MSG_SIMPLE_TAG , depth); +scsi_adjust_queue_depth (sdev, depth);return depth; }EXPORT_SYMBOL (scsi_track_queue_full);@@ -867,7 +852,7 @@ int scsi_change_queue_type(struct scsi_device *sdev, int tag_type)if (!sdev->tagged_supported)return 0 ; -scsi_adjust_queue_depth (sdev, tag_type, sdev->queue_depth); +scsi_set_tag_type (sdev, tag_type);return tag_type; }drivers/scsi/scsi_debug.c +2
-5@@ -2700,11 +2700,8 @@ static int scsi_debug_slave_configure(struct scsi_device *sdp) devip =devInfoReg (sdp);if (NULL == devip)return 1 ;/* no resources, will be marked offline */ - sdp->hostdata = devip; sdp->tagged_supported =1 ; -if (sdp->host->cmd_per_lun) -scsi_adjust_queue_depth (sdp,DEF_TAGGED_QUEUING , -DEF_CMD_PER_LUN ); + sdp->hostdata = devip;blk_queue_max_segment_size (sdp->request_queue,-1U );if (scsi_debug_no_uld) sdp->no_uld_attach =1 ;@@ -4494,7 +4491,7 @@ sdebug_change_qdepth(struct scsi_device *sdev, int qdepth, int reason)/* allow to exceed max host queued_arr elements for testing */ if (qdepth >SCSI_DEBUG_CANQUEUE +10 ) qdepth =SCSI_DEBUG_CANQUEUE +10 ; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth); }else if (reason ==SCSI_QDEPTH_QFULL )scsi_track_queue_full (sdev, qdepth);else drivers/scsi/scsi_scan.c +4
-2@@ -292,7 +292,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,blk_queue_init_tags (sdev->request_queue, sdev->host->cmd_per_lun, shost->bqt); } -scsi_adjust_queue_depth (sdev,0 , sdev->host->cmd_per_lun); +scsi_adjust_queue_depth (sdev, sdev->host->cmd_per_lun);scsi_sysfs_device_initialize (sdev);@@ -880,8 +880,10 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, (inq_result[3] & 0x0f) == 1 ? " CCS" : "");if ((sdev->scsi_level >=SCSI_2 ) && (inq_result[7 ] &2 ) && - !(*bflags &BLIST_NOTQ )) + !(*bflags &BLIST_NOTQ )) { sdev->tagged_supported =1 ; + sdev->simple_tags =1 ; + }/* * Some devices (Texel CD ROM drives) have handshaking problems drivers/scsi/stex.c +0
-2@@ -549,8 +549,6 @@ stex_slave_alloc(struct scsi_device *sdev)/* Cheat: usually extracted from Inquiry data */ sdev->tagged_supported =1 ; -scsi_adjust_queue_depth (sdev,0 , sdev->host->can_queue); -return 0 ; }drivers/scsi/storvsc_drv.c +1
-2@@ -1429,8 +1429,7 @@ static void storvsc_device_destroy(struct scsi_device *sdevice)static int storvsc_device_configure (struct scsi_device *sdevice) { -scsi_adjust_queue_depth (sdevice,MSG_SIMPLE_TAG , -STORVSC_MAX_IO_REQUESTS ); +scsi_adjust_queue_depth (sdevice,STORVSC_MAX_IO_REQUESTS );blk_queue_max_segment_size (sdevice->request_queue,PAGE_SIZE );drivers/scsi/sym53c8xx_2/sym_glue.c +1
-3@@ -820,9 +820,7 @@ static int sym53c8xx_slave_configure(struct scsi_device *sdev)if (reqtags >SYM_CONF_MAX_TAG ) reqtags =SYM_CONF_MAX_TAG ; depth_to_use = reqtags ? reqtags :1 ; -scsi_adjust_queue_depth (sdev, - sdev->tagged_supported ?MSG_SIMPLE_TAG :0 , - depth_to_use); +scsi_adjust_queue_depth (sdev, depth_to_use); lp->s.scdev_depth = depth_to_use;sym_tune_dev_queuing (tp, sdev->lun, reqtags);drivers/scsi/tmscsim.c +8
-1@@ -2185,9 +2185,16 @@ static int dc390_slave_configure(struct scsi_device *sdev)struct dc390_dcb *dcb = (struct dc390_dcb *)sdev->hostdata; acb->scan_devices =0 ; + +/* +* XXX: Note that while this driver used to called scsi_activate_tcq, +* it never actually set a tag type, so emulate the old behavior. +*/ +scsi_set_tag_type (sdev,0 ); +if (sdev->tagged_supported && (dcb->DevMode &TAG_QUEUEING_ )) { dcb->SyncMode |=EN_TAG_QUEUEING ; -scsi_adjust_queue_depth (sdev,0 , acb->TagMaxNum); +scsi_adjust_queue_depth (sdev, acb->TagMaxNum); }return 0 ;drivers/scsi/u14-34f.c +3
-4@@ -696,25 +696,25 @@ static int u14_34f_slave_configure(struct scsi_device *dev) {if (TLDEV (dev->type) && dev->tagged_supported)if (tag_mode ==TAG_SIMPLE ) { -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", simple tags" ; }else if (tag_mode ==TAG_ORDERED ) { -scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", ordered tags" ; }else { -scsi_adjust_queue_depth (dev,0 , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", no tags" ; }else if (TLDEV (dev->type) && linked_comm) { -scsi_adjust_queue_depth (dev,0 , tqd);
drivers/scsi/u14-34f.c static int u14_34f_slave_configure(struct scsi_device *dev) { · line 720
Quoted 10 lines
drivers/scsi/u14-34f.c +2
-1+scsi_adjust_queue_depth (dev, tqd); tag_suffix =", untagged" ; }else { -scsi_adjust_queue_depth (dev,0 , utqd); +scsi_adjust_queue_depth (dev, utqd); tag_suffix ="" ; }
See my comment on the previous patches. As we're not using ordered tags that branch is never used.
Quoted 117 lines
drivers/scsi/ufs/ufshcd.c +2
-2@@ -2696,7 +2696,7 @@ static void ufshcd_set_queue_depth(struct scsi_device *sdev)dev_dbg (hba->dev,"%s: activate tcq with queue depth %d\n" , __func__, lun_qdepth);if (sdev->tagged_supported) -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), lun_qdepth); +scsi_adjust_queue_depth (sdev, lun_qdepth); }/* @@ -2808,7 +2808,7 @@ static int ufshcd_change_queue_depth(struct scsi_device *sdev,case SCSI_QDEPTH_RAMP_UP :if (!sdev->tagged_supported) depth =1 ; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);drivers/scsi/virtio_scsi.c +1
-3@@ -683,9 +683,7 @@ static int virtscsi_change_queue_depth(struct scsi_device *sdev,break ;case SCSI_QDEPTH_RAMP_UP :/* Raise qdepth after BUSY state resolved */ case SCSI_QDEPTH_DEFAULT :/* Manual change via sysfs */ -scsi_adjust_queue_depth (sdev, -scsi_get_tag_type (sdev), -min (max_depth, qdepth)); +scsi_adjust_queue_depth (sdev,min (max_depth, qdepth));break ;default :return -EOPNOTSUPP ;drivers/scsi/vmw_pvscsi.c +1
-1@@ -522,7 +522,7 @@ static int pvscsi_change_queue_depth(struct scsi_device *sdev, max_depth =1 ;if (qdepth > max_depth) qdepth = max_depth; -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), qdepth); +scsi_adjust_queue_depth (sdev, qdepth);if (sdev->inquiry_len >7 ) sdev_printk(KERN_INFO, sdev,drivers/target/loopback/tcm_loop.c +2
-16@@ -121,13 +121,13 @@ static int tcm_loop_change_queue_depth( {switch (reason) {case SCSI_QDEPTH_DEFAULT : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :scsi_track_queue_full (sdev, depth);break ;case SCSI_QDEPTH_RAMP_UP : -scsi_adjust_queue_depth (sdev,scsi_get_tag_type (sdev), depth); +scsi_adjust_queue_depth (sdev, depth);break ;default :return -EOPNOTSUPP ;@@ -404,19 +404,6 @@ static int tcm_loop_slave_alloc(struct scsi_device *sd)return 0 ; } -static int tcm_loop_slave_configure (struct scsi_device *sd) -{ -if (sd->tagged_supported) { -scsi_adjust_queue_depth (sd,MSG_SIMPLE_TAG , - sd->host->cmd_per_lun); - }else { -scsi_adjust_queue_depth (sd,0 , - sd->host->cmd_per_lun); - } - -return 0 ; -} -static struct scsi_host_template tcm_loop_driver_template = { .show_info = tcm_loop_show_info, .proc_name ="tcm_loopback" ,@@ -434,7 +421,6 @@ static struct scsi_host_template tcm_loop_driver_template = { .max_sectors = 0xFFFF, .use_clustering = DISABLE_CLUSTERING, .slave_alloc = tcm_loop_slave_alloc, - .slave_configure = tcm_loop_slave_configure, .module = THIS_MODULE, .use_blk_tags = 1, };drivers/usb/storage/uas.c +1
-1@@ -799,7 +799,7 @@ static int uas_slave_configure(struct scsi_device *sdev)if (devinfo->flags &US_FL_NO_REPORT_OPCODES ) sdev->no_report_opcodes =1 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , devinfo->qdepth -2 ); +scsi_adjust_queue_depth (sdev, devinfo->qdepth -2 );return 0 ; }include/scsi/scsi_device.h +0
-0
include/scsi/scsi_device.h extern struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *, · line 393
Quoted 8 lines
include/scsi/scsi_device.h +1
-1@@ -387,7 +387,7 @@ extern struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *,#define __shost_for_each_device (sdev, shost) \ list_for_each_entry((sdev), &((shost)->__devices), siblings) -extern void scsi_adjust_queue_depth (struct scsi_device *,int ,int ); +extern void scsi_adjust_queue_depth (struct scsi_device *,int );extern int scsi_track_queue_full (struct scsi_device *,int );extern int scsi_set_medium_removal (struct scsi_device *,char );
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 09/11] scsi: don't set tagging state from scsi_adjust_queue_depth
Quoted 14 lines
Quoted 14 lines
drivers/scsi/aacraid/linit.c +2
-3@@ -462,9 +462,8 @@ static int aac_slave_configure(struct scsi_device *sdev) depth =256 ; else if (depth < 2) depth =2 ; -scsi_adjust_queue_depth (sdev,MSG_ORDERED_TAG , depth); - }else -scsi_adjust_queue_depth (sdev,0 ,1 ); +scsi_adjust_queue_depth (sdev, depth); + }
Quoted 4 lines
drivers/scsi/aacraid/linit.c static int aac_slave_configure(struct scsi_device *sdev) · line 469
Quoted 2 lines
drivers/scsi/aacraid/linit.c +0
-0return 0 ; }Why did you omit the 'else' branch?
cmd_per_lunis set to 256 for aacraid AFAICS ...
Thanks, fixed.
Quoted 3 lines
Hmm. This is actually wrong; it should be set to '1'. '2' is a left-over from the (long since removed) internal queueing within the aic7xxx driver.
Please send a separate patch for that. Interestingly your patch that sets it to 1 for aic79xx sais that's only temporarily. If you still have the hardware (either one should be fine) that driver could use some major cleanup in how it deals with queuing and tags.
Quoted 29 lines
Quoted 29 lines
drivers/scsi/u14-34f.c +4
-4@@ -696,25 +696,25 @@ static int u14_34f_slave_configure(struct scsi_device *dev) {if (TLDEV (dev->type) && dev->tagged_supported)if (tag_mode ==TAG_SIMPLE ) { -scsi_adjust_queue_depth (dev,MSG_SIMPLE_TAG , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", simple tags" ; }else if (tag_mode ==TAG_ORDERED ) { -scsi_adjust_queue_depth (dev,MSG_ORDERED_TAG , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", ordered tags" ; }else { -scsi_adjust_queue_depth (dev,0 , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", no tags" ; }else if (TLDEV (dev->type) && linked_comm) { -scsi_adjust_queue_depth (dev,0 , tqd); +scsi_adjust_queue_depth (dev, tqd); tag_suffix =", untagged" ; }
Quoted 8 lines
drivers/scsi/u14-34f.c static int u14_34f_slave_configure(struct scsi_device *dev) { · line 720
Quoted 6 lines
drivers/scsi/u14-34f.c +1
-1else { -scsi_adjust_queue_depth (dev,0 , utqd); +scsi_adjust_queue_depth (dev, utqd); tag_suffix ="" ; }See my comment on the previous patches. As we're not using ordered tags that branch is never used.
The tag_mode is a module parameter. I've kept it for compatibility (or lazyness..), but there's no effect left, similar to the queue_type sysfs file that still accept the "ordered" value.
Re: [PATCH 09/11] scsi: don't set tagging state from scsi_adjust_queue_depth
In reply to Christoph HellwigQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Christoph" == Christoph Hellwig <[email protected]> writes:
Christoph> Remove the tagged argument from scsi_adjust_queue_depth, and Christoph> just let it handle the queue depth. For most drivers those Christoph> two are fairly separate, given that most modern drivers don't Christoph> care about the SCSI "tagged" status of a command at all, and Christoph> many old drivers allow queuing of multiple untagged commands Christoph> in the driver.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering
PATCH 10/11 scsi: don't force tagged_supported in drivers
In reply to Christoph HellwigNow that we also get proper values in cmd->request->tag for untagged commands, there is no need to force tagged_supported to on in drivers that need host-wide tags.
--- drivers/scsi/fnic/fnic_main.c | 2 -- drivers/scsi/libsas/sas_scsi_host.c | 1 - drivers/scsi/qla4xxx/ql4_os.c | 9 --------- drivers/scsi/scsi_debug.c | 1 - drivers/scsi/stex.c | 11 ----------- drivers/scsi/ufs/ufshcd.c | 6 +----- 6 files changed, 1 insertion(+), 29 deletions(-)
drivers/scsi/fnic/fnic_main.c +0 -2
@@ -95,8 +95,6 @@ static int fnic_slave_alloc(struct scsi_device *sdev) {struct fc_rport *rport =starget_to_rport (scsi_target (sdev)); - sdev->tagged_supported =1 ; -if (!rport ||fc_remote_port_chkready (rport))return -ENXIO ;
drivers/scsi/libsas/sas_scsi_host.c +0 -1
@@ -945,7 +945,6 @@ int sas_slave_configure(struct scsi_device *scsi_dev)SAS_DPRINTK ("device %llx, LUN %llx doesn't support " "TCQ\n" ,SAS_ADDR (dev->sas_addr), scsi_dev->lun); - scsi_dev->tagged_supported =0 ;scsi_adjust_queue_depth (scsi_dev,1 ); }
drivers/scsi/qla4xxx/ql4_os.c +0 -9
@@ -162,7 +162,6 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd);static int qla4xxx_eh_target_reset (struct scsi_cmnd *cmd);static int qla4xxx_eh_host_reset (struct scsi_cmnd *cmd);static int qla4xxx_slave_alloc (struct scsi_device *device); -static int qla4xxx_slave_configure (struct scsi_device *device);static umode_t qla4_attr_is_visible (int param_type,int param);static int qla4xxx_host_reset (struct Scsi_Host *shost,int reset_type); static int qla4xxx_change_queue_depth(struct scsi_device *sdev, int qdepth,
@@ -203,7 +202,6 @@ static struct scsi_host_template qla4xxx_driver_template = { .eh_host_reset_handler = qla4xxx_eh_host_reset, .eh_timed_out = qla4xxx_eh_cmd_timed_out, - .slave_configure = qla4xxx_slave_configure, .slave_alloc = qla4xxx_slave_alloc, .change_queue_depth = qla4xxx_change_queue_depth,
@@ -9059,7 +9057,6 @@ static int qla4xxx_slave_alloc(struct scsi_device *sdev) ddb = sess->dd_data; sdev->hostdata = ddb; - sdev->tagged_supported =1 ;if (ql4xmaxqdepth !=0 && ql4xmaxqdepth <=0xffffU ) queue_depth = ql4xmaxqdepth;
@@ -9068,12 +9065,6 @@ static int qla4xxx_slave_alloc(struct scsi_device *sdev)return 0 ; } -static int qla4xxx_slave_configure (struct scsi_device *sdev) -{ - sdev->tagged_supported =1 ; -return 0 ; -} -static int qla4xxx_change_queue_depth (struct scsi_device *sdev,int qdepth,int reason) {
drivers/scsi/scsi_debug.c +0 -1
@@ -2700,7 +2700,6 @@ static int scsi_debug_slave_configure(struct scsi_device *sdp) devip =devInfoReg (sdp);if (NULL == devip)return 1 ;/* no resources, will be marked offline */ - sdp->tagged_supported =1 ; sdp->hostdata = devip;blk_queue_max_segment_size (sdp->request_queue,-1U );if (scsi_debug_no_uld)
drivers/scsi/stex.c +0 -11
@@ -544,21 +544,11 @@ stex_ss_send_cmd(struct st_hba *hba, struct req_msg *req, u16 tag) }static int -stex_slave_alloc (struct scsi_device *sdev) -{ -/* Cheat: usually extracted from Inquiry data */ - sdev->tagged_supported =1 ; - -return 0 ; -} - -static int stex_slave_config (struct scsi_device *sdev) { sdev->use_10_for_rw =1 ; sdev->use_10_for_ms =1 ;blk_queue_rq_timeout (sdev->request_queue,60 *HZ ); - sdev->tagged_supported =1 ;return 0 ; }
@@ -1380,7 +1370,6 @@ static struct scsi_host_template driver_template = { .proc_name = DRV_NAME, .bios_param = stex_biosparam, .queuecommand = stex_queuecommand, - .slave_alloc = stex_slave_alloc, .slave_configure = stex_slave_config, .eh_abort_handler = stex_abort, .eh_host_reset_handler = stex_reset,
drivers/scsi/ufs/ufshcd.c +1 -5
@@ -2695,8 +2695,7 @@ static void ufshcd_set_queue_depth(struct scsi_device *sdev)dev_dbg (hba->dev,"%s: activate tcq with queue depth %d\n" , __func__, lun_qdepth); -if (sdev->tagged_supported) -scsi_adjust_queue_depth (sdev, lun_qdepth); +scsi_adjust_queue_depth (sdev, lun_qdepth); }/*
@@ -2766,7 +2765,6 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev)struct ufs_hba *hba; hba =shost_priv (sdev->host); - sdev->tagged_supported =1 ;/* Mode sense(6) is not supported by UFS, so use Mode sense(10) */ sdev->use_10_for_ms =1 ;
@@ -2806,8 +2804,6 @@ static int ufshcd_change_queue_depth(struct scsi_device *sdev,switch (reason) {case SCSI_QDEPTH_DEFAULT :case SCSI_QDEPTH_RAMP_UP : -if (!sdev->tagged_supported) - depth =1 ;scsi_adjust_queue_depth (sdev, depth);break ;case SCSI_QDEPTH_QFULL :
Signature · 1 line
1.9.1
Re: [PATCH 10/11] scsi: don't force tagged_supported in drivers
2014-11-04 8:54 GMT+01:00 Christoph Hellwig <[email protected]>:
Quoted 14 lines
Now that we also get proper values in
cmd->request->tagfor untagged commands, there is no need to forcetagged_supportedto on in drivers that need host-wide tags.Signed-off-by Christoph Hellwig <[email protected]>--- drivers/scsi/fnic/fnic_main.c | 2 -- drivers/scsi/libsas/sas_scsi_host.c | 1 -drivers/scsi/libsas/sas_scsi_host.c +0
-0
drivers/scsi/libsas/sas_scsi_host.c int sas_slave_configure(struct scsi_device *scsi_dev) · line 949
Quoted 6 lines
drivers/scsi/libsas/sas_scsi_host.c +0
-1@@ -945,7 +945,6 @@ int sas_slave_configure(struct scsi_device *scsi_dev)SAS_DPRINTK ("device %llx, LUN %llx doesn't support " "TCQ\n" ,SAS_ADDR (dev->sas_addr), scsi_dev->lun); - scsi_dev->tagged_supported =0 ;scsi_adjust_queue_depth (scsi_dev,1 ); }
Hi Christoph,
The commit msg doesn't match for above, is it intentional ?
Regards,
Jack
Re: [PATCH 10/11] scsi: don't force tagged_supported in drivers
Quoted 13 lines · Jack Wang
drivers/scsi/libsas/sas_scsi_host.c int sas_slave_configure(struct scsi_device *scsi_dev) · line 949
Quoted 11 lines
drivers/scsi/libsas/sas_scsi_host.c +0
-1@@ -945,7 +945,6 @@ int sas_slave_configure(struct scsi_device *scsi_dev)SAS_DPRINTK ("device %llx, LUN %llx doesn't support " "TCQ\n" ,SAS_ADDR (dev->sas_addr), scsi_dev->lun); - scsi_dev->tagged_supported =0 ;scsi_adjust_queue_depth (scsi_dev,1 ); }Hi Christoph,
Quoted 1 line
The commit msg doesn't match for above, is it intentional ?
It's a force off in a branch where it's already guaranteed to be off, but I'll update the description to include this hunk.
PATCH 11/11 ufs: remove spurious scsi_set_tag_type call
In reply to Christoph Hellwigufs never looks at the tag type, so there is no need to set it either.
--- drivers/scsi/ufs/ufshcd.c | 1 - 1 file changed, 1 deletion(-)
drivers/scsi/ufs/ufshcd.c +0 -1
@@ -2768,7 +2768,6 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev)/* Mode sense(6) is not supported by UFS, so use Mode sense(10) */ sdev->use_10_for_ms =1 ; -scsi_set_tag_type (sdev,MSG_SIMPLE_TAG );/* allow SCSI layer to restart the device in case of errors */ sdev->allow_restart =1 ;
Signature · 1 line
1.9.1
I've pushed an updated branch with the review comments addressed to
git://git.infradead.org/users/hch/scsi.git tcq-rework
Thansk for all the reviews, and looking forward to the missing ones!