diff mbox series

[6/7] iscsi_tcp: fix shost can_queue initialization

Message ID 20210118203430.4921-7-michael.christie@oracle.com
State Superseded
Headers show
Series iscsi fixes/cleanups | expand

Commit Message

Mike Christie Jan. 18, 2021, 8:34 p.m. UTC
We are setting the shost's can_queue after we add the host which is
too late, because scsi-ml will have allocated the tag set based on
the can_queue value at that time. This patch has us use the
iscsi_host_get_max_scsi_cmds helper to figure out the number of
scsi cmds.

It also fixes up the template can_queue so it reflects the max scsi
cmds we can support like how other drivers work.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
---
 drivers/scsi/iscsi_tcp.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Lee Duncan Jan. 27, 2021, 7:47 p.m. UTC | #1
On 1/18/21 12:34 PM, Mike Christie wrote:
> We are setting the shost's can_queue after we add the host which is

> too late, because scsi-ml will have allocated the tag set based on

> the can_queue value at that time. This patch has us use the

> iscsi_host_get_max_scsi_cmds helper to figure out the number of

> scsi cmds.

> 

> It also fixes up the template can_queue so it reflects the max scsi

> cmds we can support like how other drivers work.

> 

> Signed-off-by: Mike Christie <michael.christie@oracle.com>

> ---

>  drivers/scsi/iscsi_tcp.c | 9 +++++++--

>  1 file changed, 7 insertions(+), 2 deletions(-)

> 

> diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c

> index a9ce6298b935..f0070e3c7ffa 100644

> --- a/drivers/scsi/iscsi_tcp.c

> +++ b/drivers/scsi/iscsi_tcp.c

> @@ -847,6 +847,7 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,

>  	struct iscsi_session *session;

>  	struct iscsi_sw_tcp_host *tcp_sw_host;

>  	struct Scsi_Host *shost;

> +	int rc;

>  

>  	if (ep) {

>  		printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);

> @@ -864,6 +865,11 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,

>  	shost->max_channel = 0;

>  	shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;

>  

> +	rc = iscsi_host_get_max_scsi_cmds(shost, cmds_max);

> +	if (rc < 0)

> +		goto free_host;

> +	shost->can_queue = rc;

> +

>  	if (iscsi_host_add(shost, NULL))

>  		goto free_host;

>  

> @@ -878,7 +884,6 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,

>  	tcp_sw_host = iscsi_host_priv(shost);

>  	tcp_sw_host->session = session;

>  

> -	shost->can_queue = session->scsi_cmds_max;

>  	if (iscsi_tcp_r2tpool_alloc(session))

>  		goto remove_session;

>  	return cls_session;

> @@ -981,7 +986,7 @@ static struct scsi_host_template iscsi_sw_tcp_sht = {

>  	.name			= "iSCSI Initiator over TCP/IP",

>  	.queuecommand           = iscsi_queuecommand,

>  	.change_queue_depth	= scsi_change_queue_depth,

> -	.can_queue		= ISCSI_DEF_XMIT_CMDS_MAX - 1,

> +	.can_queue		= ISCSI_TOTAL_CMDS_MAX - ISCSI_MGMT_CMDS_MAX,

>  	.sg_tablesize		= 4096,

>  	.max_sectors		= 0xFFFF,

>  	.cmd_per_lun		= ISCSI_DEF_CMD_PER_LUN,

> 


Reviewed-by: Lee Duncan <lduncan@suse.com>
diff mbox series

Patch

diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index a9ce6298b935..f0070e3c7ffa 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -847,6 +847,7 @@  iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
 	struct iscsi_session *session;
 	struct iscsi_sw_tcp_host *tcp_sw_host;
 	struct Scsi_Host *shost;
+	int rc;
 
 	if (ep) {
 		printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);
@@ -864,6 +865,11 @@  iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
 	shost->max_channel = 0;
 	shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
 
+	rc = iscsi_host_get_max_scsi_cmds(shost, cmds_max);
+	if (rc < 0)
+		goto free_host;
+	shost->can_queue = rc;
+
 	if (iscsi_host_add(shost, NULL))
 		goto free_host;
 
@@ -878,7 +884,6 @@  iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
 	tcp_sw_host = iscsi_host_priv(shost);
 	tcp_sw_host->session = session;
 
-	shost->can_queue = session->scsi_cmds_max;
 	if (iscsi_tcp_r2tpool_alloc(session))
 		goto remove_session;
 	return cls_session;
@@ -981,7 +986,7 @@  static struct scsi_host_template iscsi_sw_tcp_sht = {
 	.name			= "iSCSI Initiator over TCP/IP",
 	.queuecommand           = iscsi_queuecommand,
 	.change_queue_depth	= scsi_change_queue_depth,
-	.can_queue		= ISCSI_DEF_XMIT_CMDS_MAX - 1,
+	.can_queue		= ISCSI_TOTAL_CMDS_MAX - ISCSI_MGMT_CMDS_MAX,
 	.sg_tablesize		= 4096,
 	.max_sectors		= 0xFFFF,
 	.cmd_per_lun		= ISCSI_DEF_CMD_PER_LUN,