diff mbox series

[12/14] qla2xxx: Changes to support kdump kernel for NVMe BFS

Message ID 20210805102005.20183-13-njavali@marvell.com (mailing list archive)
State Superseded
Headers show
Series qla2xxx driver bug fixes | expand

Commit Message

Nilesh Javali Aug. 5, 2021, 10:20 a.m. UTC
From: Saurav Kashyap <skashyap@marvell.com>

The MSI-X and MSI calls fails in kdump kernel, because of this
qla2xxx_create_qpair fails leading to .create_queue callback failure.
The fix is to return existing qpair instead of allocating new one and
allocate single hw queue.

[   19.975838] qla2xxx [0000:d8:00.1]-00c7:11: MSI-X: Failed to enable support,
giving   up -- 16/-28.
[   19.984885] qla2xxx [0000:d8:00.1]-0037:11: Falling back-to MSI mode --
ret=-28.
[   19.992278] qla2xxx [0000:d8:00.1]-0039:11: Falling back-to INTa mode --
ret=-28.
..
..
..
[   21.141518] qla2xxx [0000:d8:00.0]-2104:2: qla_nvme_alloc_queue: handle
00000000e7ee499d, idx =1, qsize 32
[   21.151166] qla2xxx [0000:d8:00.0]-0181:2: FW/Driver is not multi-queue capable.
[   21.158558] qla2xxx [0000:d8:00.0]-2122:2: Failed to allocate qpair
[   21.164824] nvme nvme0: NVME-FC{0}: reset: Reconnect attempt failed (-22)
[   21.171612] nvme nvme0: NVME-FC{0}: Reconnect attempt in 2 seconds

Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
---
 drivers/scsi/qla2xxx/qla_def.h  |  1 -
 drivers/scsi/qla2xxx/qla_isr.c  |  2 ++
 drivers/scsi/qla2xxx/qla_nvme.c | 40 +++++++++++++++------------------
 3 files changed, 20 insertions(+), 23 deletions(-)

Comments

Himanshu Madhani Aug. 5, 2021, 3:52 p.m. UTC | #1
> On Aug 5, 2021, at 5:20 AM, Nilesh Javali <njavali@marvell.com> wrote:
> 
> From: Saurav Kashyap <skashyap@marvell.com>
> 
> The MSI-X and MSI calls fails in kdump kernel, because of this
> qla2xxx_create_qpair fails leading to .create_queue callback failure.
> The fix is to return existing qpair instead of allocating new one and
> allocate single hw queue.
> 
> [   19.975838] qla2xxx [0000:d8:00.1]-00c7:11: MSI-X: Failed to enable support,
> giving   up -- 16/-28.
> [   19.984885] qla2xxx [0000:d8:00.1]-0037:11: Falling back-to MSI mode --
> ret=-28.
> [   19.992278] qla2xxx [0000:d8:00.1]-0039:11: Falling back-to INTa mode --
> ret=-28.
> ..
> ..
> ..
> [   21.141518] qla2xxx [0000:d8:00.0]-2104:2: qla_nvme_alloc_queue: handle
> 00000000e7ee499d, idx =1, qsize 32
> [   21.151166] qla2xxx [0000:d8:00.0]-0181:2: FW/Driver is not multi-queue capable.
> [   21.158558] qla2xxx [0000:d8:00.0]-2122:2: Failed to allocate qpair
> [   21.164824] nvme nvme0: NVME-FC{0}: reset: Reconnect attempt failed (-22)
> [   21.171612] nvme nvme0: NVME-FC{0}: Reconnect attempt in 2 seconds
> 
> Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
> Signed-off-by: Nilesh Javali <njavali@marvell.com>
> ---
> drivers/scsi/qla2xxx/qla_def.h  |  1 -
> drivers/scsi/qla2xxx/qla_isr.c  |  2 ++
> drivers/scsi/qla2xxx/qla_nvme.c | 40 +++++++++++++++------------------
> 3 files changed, 20 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
> index 60702d066ed9..55175e8a0749 100644
> --- a/drivers/scsi/qla2xxx/qla_def.h
> +++ b/drivers/scsi/qla2xxx/qla_def.h
> @@ -4022,7 +4022,6 @@ struct qla_hw_data {
> 				/* Enabled in Driver */
> 		uint32_t	scm_enabled:1;
> 		uint32_t	edif_enabled:1;
> -		uint32_t	max_req_queue_warned:1;
> 		uint32_t	plogi_template_valid:1;
> 		uint32_t	port_isolated:1;
> 	} flags;
> diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
> index b0b5af21781a..ba4a5bf5600a 100644
> --- a/drivers/scsi/qla2xxx/qla_isr.c
> +++ b/drivers/scsi/qla2xxx/qla_isr.c
> @@ -4508,6 +4508,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
> 		ql_dbg(ql_dbg_init, vha, 0x0125,
> 		    "INTa mode: Enabled.\n");
> 		ha->flags.mr_intr_valid = 1;
> +		/* Set max_qpair to 0, as MSI-X and MSI in not enabled */
> +		ha->max_qpairs = 0;
> 	}
> 
> clear_risc_ints:
> diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
> index 6f3c0a506509..94e350ef3028 100644
> --- a/drivers/scsi/qla2xxx/qla_nvme.c
> +++ b/drivers/scsi/qla2xxx/qla_nvme.c
> @@ -108,19 +108,24 @@ static int qla_nvme_alloc_queue(struct nvme_fc_local_port *lport,
> 		return -EINVAL;
> 	}
> 
> -	if (ha->queue_pair_map[qidx]) {
> -		*handle = ha->queue_pair_map[qidx];
> -		ql_log(ql_log_info, vha, 0x2121,
> -		    "Returning existing qpair of %px for idx=%x\n",
> -		    *handle, qidx);
> -		return 0;
> -	}
> +	/* Use base qpair if max_qpairs is 0 */
> +	if (!ha->max_qpairs) {
> +		qpair = ha->base_qpair;
> +	} else {
> +		if (ha->queue_pair_map[qidx]) {
> +			*handle = ha->queue_pair_map[qidx];
> +			ql_log(ql_log_info, vha, 0x2121,
> +			       "Returning existing qpair of %px for idx=%x\n",
> +			       *handle, qidx);
> +			return 0;
> +		}
> 
> -	qpair = qla2xxx_create_qpair(vha, 5, vha->vp_idx, true);
> -	if (qpair == NULL) {
> -		ql_log(ql_log_warn, vha, 0x2122,
> -		    "Failed to allocate qpair\n");
> -		return -EINVAL;
> +		qpair = qla2xxx_create_qpair(vha, 5, vha->vp_idx, true);
> +		if (!qpair) {
> +			ql_log(ql_log_warn, vha, 0x2122,
> +			       "Failed to allocate qpair\n");
> +			return -EINVAL;
> +		}
> 	}
> 	*handle = qpair;
> 
> @@ -731,18 +736,9 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)
> 
> 	WARN_ON(vha->nvme_local_port);
> 
> -	if (ha->max_req_queues < 3) {
> -		if (!ha->flags.max_req_queue_warned)
> -			ql_log(ql_log_info, vha, 0x2120,
> -			       "%s: Disabling FC-NVME due to lack of free queue pairs (%d).\n",
> -			       __func__, ha->max_req_queues);
> -		ha->flags.max_req_queue_warned = 1;
> -		return ret;
> -	}
> -
> 	qla_nvme_fc_transport.max_hw_queues =
> 	    min((uint8_t)(qla_nvme_fc_transport.max_hw_queues),
> -		(uint8_t)(ha->max_req_queues - 2));
> +		(uint8_t)(ha->max_qpairs ? ha->max_qpairs : 1));
> 
> 	pinfo.node_name = wwn_to_u64(vha->node_name);
> 	pinfo.port_name = wwn_to_u64(vha->port_name);
> -- 
> 2.19.0.rc0
> 

Same for this.. I would encourage to add stable for this patch? 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	 Oracle Linux Engineering
diff mbox series

Patch

diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 60702d066ed9..55175e8a0749 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -4022,7 +4022,6 @@  struct qla_hw_data {
 				/* Enabled in Driver */
 		uint32_t	scm_enabled:1;
 		uint32_t	edif_enabled:1;
-		uint32_t	max_req_queue_warned:1;
 		uint32_t	plogi_template_valid:1;
 		uint32_t	port_isolated:1;
 	} flags;
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index b0b5af21781a..ba4a5bf5600a 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -4508,6 +4508,8 @@  qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
 		ql_dbg(ql_dbg_init, vha, 0x0125,
 		    "INTa mode: Enabled.\n");
 		ha->flags.mr_intr_valid = 1;
+		/* Set max_qpair to 0, as MSI-X and MSI in not enabled */
+		ha->max_qpairs = 0;
 	}
 
 clear_risc_ints:
diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c
index 6f3c0a506509..94e350ef3028 100644
--- a/drivers/scsi/qla2xxx/qla_nvme.c
+++ b/drivers/scsi/qla2xxx/qla_nvme.c
@@ -108,19 +108,24 @@  static int qla_nvme_alloc_queue(struct nvme_fc_local_port *lport,
 		return -EINVAL;
 	}
 
-	if (ha->queue_pair_map[qidx]) {
-		*handle = ha->queue_pair_map[qidx];
-		ql_log(ql_log_info, vha, 0x2121,
-		    "Returning existing qpair of %px for idx=%x\n",
-		    *handle, qidx);
-		return 0;
-	}
+	/* Use base qpair if max_qpairs is 0 */
+	if (!ha->max_qpairs) {
+		qpair = ha->base_qpair;
+	} else {
+		if (ha->queue_pair_map[qidx]) {
+			*handle = ha->queue_pair_map[qidx];
+			ql_log(ql_log_info, vha, 0x2121,
+			       "Returning existing qpair of %px for idx=%x\n",
+			       *handle, qidx);
+			return 0;
+		}
 
-	qpair = qla2xxx_create_qpair(vha, 5, vha->vp_idx, true);
-	if (qpair == NULL) {
-		ql_log(ql_log_warn, vha, 0x2122,
-		    "Failed to allocate qpair\n");
-		return -EINVAL;
+		qpair = qla2xxx_create_qpair(vha, 5, vha->vp_idx, true);
+		if (!qpair) {
+			ql_log(ql_log_warn, vha, 0x2122,
+			       "Failed to allocate qpair\n");
+			return -EINVAL;
+		}
 	}
 	*handle = qpair;
 
@@ -731,18 +736,9 @@  int qla_nvme_register_hba(struct scsi_qla_host *vha)
 
 	WARN_ON(vha->nvme_local_port);
 
-	if (ha->max_req_queues < 3) {
-		if (!ha->flags.max_req_queue_warned)
-			ql_log(ql_log_info, vha, 0x2120,
-			       "%s: Disabling FC-NVME due to lack of free queue pairs (%d).\n",
-			       __func__, ha->max_req_queues);
-		ha->flags.max_req_queue_warned = 1;
-		return ret;
-	}
-
 	qla_nvme_fc_transport.max_hw_queues =
 	    min((uint8_t)(qla_nvme_fc_transport.max_hw_queues),
-		(uint8_t)(ha->max_req_queues - 2));
+		(uint8_t)(ha->max_qpairs ? ha->max_qpairs : 1));
 
 	pinfo.node_name = wwn_to_u64(vha->node_name);
 	pinfo.port_name = wwn_to_u64(vha->port_name);