scsi: ibmvfc: Set and track hw queue in ibmvfc_event struct
authorTyrel Datwyler <tyreld@linux.ibm.com>
Thu, 14 Jan 2021 20:31:41 +0000 (14:31 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 15 Jan 2021 03:29:38 +0000 (22:29 -0500)
Extract the hwq id from a SCSI command and store it in the ibmvfc_event
structure to identify which Sub-CRQ to send the command down when channels
are being utilized.

Link: https://lore.kernel.org/r/20210114203148.246656-15-tyreld@linux.ibm.com
Reviewed-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ibmvscsi/ibmvfc.c
drivers/scsi/ibmvscsi/ibmvfc.h

index 31f0e55098d6d049a97fa0123170351a6072ee10..dd117ca8fef63c62ac550e9d804fe73cdfebd9d3 100644 (file)
@@ -1483,6 +1483,7 @@ static void ibmvfc_init_event(struct ibmvfc_event *evt,
                evt->_done = done;
                evt->done = ibmvfc_locked_done;
        }
+       evt->hwq = 0;
 }
 
 /**
@@ -1839,6 +1840,8 @@ static int ibmvfc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
        struct ibmvfc_cmd *vfc_cmd;
        struct ibmvfc_fcp_cmd_iu *iu;
        struct ibmvfc_event *evt;
+       u32 tag_and_hwq = blk_mq_unique_tag(cmnd->request);
+       u16 hwq = blk_mq_unique_tag_to_hwq(tag_and_hwq);
        int rc;
 
        if (unlikely((rc = fc_remote_port_chkready(rport))) ||
@@ -1865,6 +1868,8 @@ static int ibmvfc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
        }
 
        vfc_cmd->correlation = cpu_to_be64(evt);
+       if (vhost->using_channels)
+               evt->hwq = hwq % vhost->scsi_scrqs.active_queues;
 
        if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev))))
                return ibmvfc_send_event(evt, vhost, 0);
index 3d76cd3c1fd93ddbf99a9ac4081a3eabcfaf7559..2dbce707140965744a54ffce03330d538e390593 100644 (file)
@@ -753,6 +753,7 @@ struct ibmvfc_event {
        struct completion comp;
        struct completion *eh_comp;
        struct timer_list timer;
+       u16 hwq;
 };
 
 /* a pool of event structs for use */