mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
scsi: lpfc: Memory allocation error during driver start-up on power8
The driver fails to allocate command buffers in the routine lpfc_new_scsi_buf_s4 There is an inconsistency between lpfc_mem_alloc(), where the phba->lpfc_sg_dma_buf_pool is created, and lpfc_new_scsi_buf_s4(), when we allocate a buffer from the pool and check the alignment. The alignment should be on a page boundary, based on LPFC_SLI3_BG_ENABLED in sli3_options, for both cases. Fix by explicitly tracking sli4 vs sli3 and BG options. The result is that phba->cfg_sg_dma_buf_size is now set correctly for SLI-4. Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
e29d74f8eb
commit
f44ac12f1d
@ -6344,6 +6344,10 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
|
||||
phba->cfg_poll = 0;
|
||||
else
|
||||
phba->cfg_poll = lpfc_poll;
|
||||
|
||||
if (phba->cfg_enable_bg)
|
||||
phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
|
||||
|
||||
lpfc_suppress_rsp_init(phba, lpfc_suppress_rsp);
|
||||
|
||||
lpfc_enable_fc4_type_init(phba, lpfc_enable_fc4_type);
|
||||
|
@ -5912,7 +5912,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
|
||||
* Since lpfc_sg_seg_cnt is module param, the sg_dma_buf_size
|
||||
* used to create the sg_dma_buf_pool must be calculated.
|
||||
*/
|
||||
if (phba->cfg_enable_bg) {
|
||||
if (phba->sli3_options & LPFC_SLI3_BG_ENABLED) {
|
||||
/*
|
||||
* The scsi_buf for a T10-DIF I/O holds the FCP cmnd,
|
||||
* the FCP rsp, and a SGE. Sice we have no control
|
||||
|
@ -837,8 +837,13 @@ lpfc_new_scsi_buf_s4(struct lpfc_vport *vport, int num_to_alloc)
|
||||
* 4K Page alignment is CRITICAL to BlockGuard, double check
|
||||
* to be sure.
|
||||
*/
|
||||
if (phba->cfg_enable_bg && (((unsigned long)(psb->data) &
|
||||
if ((phba->sli3_options & LPFC_SLI3_BG_ENABLED) &&
|
||||
(((unsigned long)(psb->data) &
|
||||
(unsigned long)(SLI4_PAGE_SIZE - 1)) != 0)) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
|
||||
"3369 Memory alignment error "
|
||||
"addr=%lx\n",
|
||||
(unsigned long)psb->data);
|
||||
dma_pool_free(phba->lpfc_sg_dma_buf_pool,
|
||||
psb->data, psb->dma_handle);
|
||||
kfree(psb);
|
||||
|
@ -4993,13 +4993,14 @@ lpfc_sli_config_port(struct lpfc_hba *phba, int sli_mode)
|
||||
phba->hbq_get = phba->mbox->us.s3_pgp.hbq_get;
|
||||
phba->port_gp = phba->mbox->us.s3_pgp.port;
|
||||
|
||||
if (phba->cfg_enable_bg) {
|
||||
if (pmb->u.mb.un.varCfgPort.gbg)
|
||||
phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
|
||||
else
|
||||
if (phba->sli3_options & LPFC_SLI3_BG_ENABLED) {
|
||||
if (pmb->u.mb.un.varCfgPort.gbg == 0) {
|
||||
phba->cfg_enable_bg = 0;
|
||||
phba->sli3_options &= ~LPFC_SLI3_BG_ENABLED;
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"0443 Adapter did not grant "
|
||||
"BlockGuard\n");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
phba->hbq_get = NULL;
|
||||
@ -6991,12 +6992,12 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
|
||||
* then turn off the global config parameters to disable the
|
||||
* feature in the driver. This is not a fatal error.
|
||||
*/
|
||||
phba->sli3_options &= ~LPFC_SLI3_BG_ENABLED;
|
||||
if (phba->cfg_enable_bg) {
|
||||
if (bf_get(lpfc_mbx_rq_ftr_rsp_dif, &mqe->un.req_ftrs))
|
||||
phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
|
||||
else
|
||||
if (phba->sli3_options & LPFC_SLI3_BG_ENABLED) {
|
||||
if (!(bf_get(lpfc_mbx_rq_ftr_rsp_dif, &mqe->un.req_ftrs))) {
|
||||
phba->cfg_enable_bg = 0;
|
||||
phba->sli3_options &= ~LPFC_SLI3_BG_ENABLED;
|
||||
ftr_rsp++;
|
||||
}
|
||||
}
|
||||
|
||||
if (phba->max_vpi && phba->cfg_enable_npiv &&
|
||||
|
Loading…
Reference in New Issue
Block a user