scsi: qla2xxx: Changes to support kdump kernel for NVMe BFS
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 a 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 Link: https://lore.kernel.org/r/20210810043720.1137-13-njavali@marvell.com Cc: stable@vger.kernel.org Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Saurav Kashyap <skashyap@marvell.com> Signed-off-by: Nilesh Javali <njavali@marvell.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
62e0dec59c
commit
4a0a542fe5
|
@ -4022,7 +4022,6 @@ struct qla_hw_data {
|
||||||
/* Enabled in Driver */
|
/* Enabled in Driver */
|
||||||
uint32_t scm_enabled:1;
|
uint32_t scm_enabled:1;
|
||||||
uint32_t edif_enabled:1;
|
uint32_t edif_enabled:1;
|
||||||
uint32_t max_req_queue_warned:1;
|
|
||||||
uint32_t plogi_template_valid:1;
|
uint32_t plogi_template_valid:1;
|
||||||
uint32_t port_isolated:1;
|
uint32_t port_isolated:1;
|
||||||
} flags;
|
} flags;
|
||||||
|
|
|
@ -4508,6 +4508,8 @@ skip_msi:
|
||||||
ql_dbg(ql_dbg_init, vha, 0x0125,
|
ql_dbg(ql_dbg_init, vha, 0x0125,
|
||||||
"INTa mode: Enabled.\n");
|
"INTa mode: Enabled.\n");
|
||||||
ha->flags.mr_intr_valid = 1;
|
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:
|
clear_risc_ints:
|
||||||
|
|
|
@ -108,19 +108,24 @@ static int qla_nvme_alloc_queue(struct nvme_fc_local_port *lport,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ha->queue_pair_map[qidx]) {
|
/* Use base qpair if max_qpairs is 0 */
|
||||||
*handle = ha->queue_pair_map[qidx];
|
if (!ha->max_qpairs) {
|
||||||
ql_log(ql_log_info, vha, 0x2121,
|
qpair = ha->base_qpair;
|
||||||
"Returning existing qpair of %p for idx=%x\n",
|
} else {
|
||||||
*handle, qidx);
|
if (ha->queue_pair_map[qidx]) {
|
||||||
return 0;
|
*handle = ha->queue_pair_map[qidx];
|
||||||
}
|
ql_log(ql_log_info, vha, 0x2121,
|
||||||
|
"Returning existing qpair of %p for idx=%x\n",
|
||||||
|
*handle, qidx);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
qpair = qla2xxx_create_qpair(vha, 5, vha->vp_idx, true);
|
qpair = qla2xxx_create_qpair(vha, 5, vha->vp_idx, true);
|
||||||
if (qpair == NULL) {
|
if (!qpair) {
|
||||||
ql_log(ql_log_warn, vha, 0x2122,
|
ql_log(ql_log_warn, vha, 0x2122,
|
||||||
"Failed to allocate qpair\n");
|
"Failed to allocate qpair\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*handle = qpair;
|
*handle = qpair;
|
||||||
|
|
||||||
|
@ -731,18 +736,9 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)
|
||||||
|
|
||||||
WARN_ON(vha->nvme_local_port);
|
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 =
|
qla_nvme_fc_transport.max_hw_queues =
|
||||||
min((uint8_t)(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.node_name = wwn_to_u64(vha->node_name);
|
||||||
pinfo.port_name = wwn_to_u64(vha->port_name);
|
pinfo.port_name = wwn_to_u64(vha->port_name);
|
||||||
|
|
Loading…
Reference in New Issue