Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 11e644e2 authored by James Smart's avatar James Smart Committed by Martin K. Petersen
Browse files

scsi: lpfc: Fix crash doing IO with resets



During every reset, IOCBs are allocated. So, at one point, number of
allocated IOCBs reaches maximum limit and lpfc_sli_next_iotag fails.

Allocate IOCBs only during initialization. Reuse them after every reset
instead of allocating new set of IOCBs.

Signed-off-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: default avatarJames Smart <james.smart@broadcom.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 569dbe84
Loading
Loading
Loading
Loading
+8 −14
Original line number Original line Diff line number Diff line
@@ -6927,18 +6927,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
		cnt = phba->cfg_iocb_cnt * 1024;
		cnt = phba->cfg_iocb_cnt * 1024;
		/* We need 1 iocbq for every SGL, for IO processing */
		/* We need 1 iocbq for every SGL, for IO processing */
		cnt += phba->sli4_hba.nvmet_xri_cnt;
		cnt += phba->sli4_hba.nvmet_xri_cnt;
		/* Initialize and populate the iocb list per host */
		lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
				"2821 initialize iocb list %d total %d\n",
				phba->cfg_iocb_cnt, cnt);
		rc = lpfc_init_iocb_list(phba, cnt);
		if (rc) {
			lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
					"1413 Failed to init iocb list.\n");
			goto out_destroy_queue;
		}
		lpfc_nvmet_create_targetport(phba);
	} else {
	} else {
		/* update host scsi xri-sgl sizes and mappings */
		/* update host scsi xri-sgl sizes and mappings */
		rc = lpfc_sli4_scsi_sgl_update(phba);
		rc = lpfc_sli4_scsi_sgl_update(phba);
@@ -6959,18 +6947,24 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
		}
		}
		cnt = phba->cfg_iocb_cnt * 1024;
		cnt = phba->cfg_iocb_cnt * 1024;
	}
	if (!phba->sli.iocbq_lookup) {
		/* Initialize and populate the iocb list per host */
		/* Initialize and populate the iocb list per host */
		lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
		lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
				"2820 initialize iocb list %d total %d\n",
				"2821 initialize iocb list %d total %d\n",
				phba->cfg_iocb_cnt, cnt);
				phba->cfg_iocb_cnt, cnt);
		rc = lpfc_init_iocb_list(phba, cnt);
		rc = lpfc_init_iocb_list(phba, cnt);
		if (rc) {
		if (rc) {
			lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
			lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
					"6301 Failed to init iocb list.\n");
					"1413 Failed to init iocb list.\n");
			goto out_destroy_queue;
			goto out_destroy_queue;
		}
		}
	}
	}
	if (phba->nvmet_support)
		lpfc_nvmet_create_targetport(phba);
	if (phba->nvmet_support && phba->cfg_nvmet_mrq) {
	if (phba->nvmet_support && phba->cfg_nvmet_mrq) {
		/* Post initial buffers to all RQs created */
		/* Post initial buffers to all RQs created */
		for (i = 0; i < phba->cfg_nvmet_mrq; i++) {
		for (i = 0; i < phba->cfg_nvmet_mrq; i++) {