lpfc 8.3.12: Critical fixes
Subsystems (2)
PATCH 4/7 lpfc 8.3.12: Critical fixes
- Move the code to increase the sg seg count for LP21000 adapters.
- Check pcmd on command completion before dereferencing it.
- Clear queue memory when creating firmware queues to prevent stale entries.
- Replace the use of PAGE_SIZE in many areas that assumed it was always 4k.
- Add an else clause to a conditional that needed to unlock the hba_lock.
Signed-off-by Alex Iannicelli <[email protected]>
Signed-off-by James Smart <[email protected]>
---
lpfc_bsg.c | 9 ++++----- lpfc_bsg.h | 1 + lpfc_els.c | 2 +- lpfc_init.c | 16 +++++++--------- lpfc_mbox.c | 16 ++++++++-------- lpfc_sli.c | 47 +++++++++++++++++++++++++++++++++++------------ 6 files changed, 56 insertions(+), 35 deletions(-)
drivers/scsi/lpfc/lpfc_bsg.c +4 -5
@@ -2590,7 +2590,7 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phb goto job_done; } - mb =kzalloc (PAGE_SIZE ,GFP_KERNEL ); + mb =kzalloc (BSG_MBOX_SIZE ,GFP_KERNEL );if (!mb) { rc = -ENOMEM ; goto job_done;
@@ -2664,13 +2664,12 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phb rxbmp->virt =lpfc_mbuf_alloc (phba,0 , &rxbmp->phys);INIT_LIST_HEAD (&rxbmp->list); rxbpl = (struct ulp_bde64 *) rxbmp->virt; - dmp =diag_cmd_data_alloc (phba, rxbpl,PAGE_SIZE ,0 ); + dmp =diag_cmd_data_alloc (phba, rxbpl,BSG_MBOX_SIZE ,0 );if (!dmp) { rc = -ENOMEM ; goto job_done; } - dmp->size =PAGE_SIZE ;INIT_LIST_HEAD (&dmp->dma.list); pmb->un.varBIUdiag.un.s2.xmit_bde64.addrHigh =putPaddrHigh (dmp->dma.phys);
@@ -2773,12 +2772,12 @@ lpfc_bsg_mbox_cmd(struct fc_bsg_job *job goto job_error; } -if (job->request_payload.payload_len !=PAGE_SIZE ) { +if (job->request_payload.payload_len !=BSG_MBOX_SIZE ) { rc = -EINVAL ; goto job_error; } -if (job->reply_payload.payload_len !=PAGE_SIZE ) { +if (job->reply_payload.payload_len !=BSG_MBOX_SIZE ) { rc = -EINVAL ; goto job_error; }
drivers/scsi/lpfc/lpfc_bsg.h +1 -0
@@ -91,6 +91,7 @@ struct get_mgmt_rev_reply {struct MgmtRevInfo info; }; +#define BSG_MBOX_SIZE 4096/* mailbox command plus extended data */ struct dfc_mbox_req {uint32_t command;uint32_t mbOffset;
drivers/scsi/lpfc/lpfc_els.c +1 -1
@@ -5369,7 +5369,7 @@ lpfc_send_els_failure_event(struct lpfc_ sizeof(struct lpfc_name)); pcmd = (uint32_t *) (((struct lpfc_dmabuf *) cmdiocbp->context2)->virt); - lsrjt_event.command = *pcmd; + lsrjt_event.command = (pcmd !=NULL ) ? *pcmd :0 ; stat.un.lsRjtError =be32_to_cpu (rspiocbp->iocb.un.ulpWord[4 ]); lsrjt_event.reason_code = stat.un.b.lsRjtRsnCode; lsrjt_event.explanation = stat.un.b.lsRjtRsnCodeExp;
drivers/scsi/lpfc/lpfc_init.c +7 -9
@@ -2599,15 +2599,6 @@ lpfc_create_port(struct lpfc_hba *phba,init_timer (&vport->els_tmofunc); vport->els_tmofunc.function = lpfc_els_timeout; vport->els_tmofunc.data = (unsigned long )vport; -if (phba->pcidev->device ==PCI_DEVICE_ID_HORNET ) { - phba->menlo_flag |=HBA_MENLO_SUPPORT ; -/* check for menlo minimum sg count */ -if (phba->cfg_sg_seg_cnt <LPFC_DEFAULT_MENLO_SG_SEG_CNT ) { - phba->cfg_sg_seg_cnt =LPFC_DEFAULT_MENLO_SG_SEG_CNT ; - shost->sg_tablesize = phba->cfg_sg_seg_cnt; - } - } - error =scsi_add_host_with_dma (shost, dev, &phba->pcidev->dev);if (error) goto out_put_shost;
@@ -3851,6 +3842,13 @@ lpfc_sli_driver_resource_setup(struct lp/* Get all the module params for configuring this host */ lpfc_get_cfgparam (phba); +if (phba->pcidev->device ==PCI_DEVICE_ID_HORNET ) { + phba->menlo_flag |=HBA_MENLO_SUPPORT ; +/* check for menlo minimum sg count */ +if (phba->cfg_sg_seg_cnt <LPFC_DEFAULT_MENLO_SG_SEG_CNT ) + phba->cfg_sg_seg_cnt =LPFC_DEFAULT_MENLO_SG_SEG_CNT ; + } +/* * Since the sg_tablesize is module parameter, the sg_dma_buf_size * used to create the sg_dma_buf_pool must be dynamically calculated.
drivers/scsi/lpfc/lpfc_mbox.c +8 -8
@@ -1610,7 +1610,7 @@ lpfc_sli4_mbox_cmd_free(struct lpfc_hbafor (sgentry =0 ; sgentry < sgecount; sgentry++) {lpfc_sli4_mbx_sge_get (mbox, sgentry, &sge); phyaddr =getPaddr (sge.pa_hi, sge.pa_lo); -dma_free_coherent (&phba->pcidev->dev,PAGE_SIZE , +dma_free_coherent (&phba->pcidev->dev,SLI4_PAGE_SIZE , mbox->sge_array->addr[sgentry], phyaddr); }/* Free the sge address array memory */
@@ -1668,7 +1668,7 @@ lpfc_sli4_config(struct lpfc_hba *phba, }/* Setup for the none-embedded mbox command */ - pcount = (PAGE_ALIGN (length))/PAGE_SIZE ; + pcount = (PAGE_ALIGN (length))/SLI4_PAGE_SIZE ; pcount = (pcount >LPFC_SLI4_MBX_SGE_MAX_PAGES ) ?LPFC_SLI4_MBX_SGE_MAX_PAGES : pcount;/* Allocate record for keeping SGE virtual addresses */
@@ -1683,24 +1683,24 @@ lpfc_sli4_config(struct lpfc_hba *phba,for (pagen =0 , alloc_len =0 ; pagen < pcount; pagen++) {/* The DMA memory is always allocated in the length of a * page even though the last SGE might not fill up to a -* page, this is used as a priori size of PAGE_SIZE for +* page, this is used as a priori size of SLI4_PAGE_SIZE for * the later DMA memory free. */ - viraddr =dma_alloc_coherent (&phba->pcidev->dev,PAGE_SIZE , + viraddr =dma_alloc_coherent (&phba->pcidev->dev,SLI4_PAGE_SIZE , &phyaddr,GFP_KERNEL );/* In case of malloc fails, proceed with whatever we have */ if (!viraddr)break ; -memset (viraddr,0 ,PAGE_SIZE ); +memset (viraddr,0 ,SLI4_PAGE_SIZE ); mbox->sge_array->addr[pagen] = viraddr;/* Keep the first page for later sub-header construction */ if (pagen ==0 ) cfg_shdr = (union lpfc_sli4_cfg_shdr *)viraddr; resid_len = length - alloc_len; -if (resid_len >PAGE_SIZE ) { +if (resid_len >SLI4_PAGE_SIZE ) {lpfc_sli4_mbx_sge_set (mbox, pagen, phyaddr, -PAGE_SIZE ); - alloc_len +=PAGE_SIZE ; +SLI4_PAGE_SIZE ); + alloc_len +=SLI4_PAGE_SIZE ; }else {lpfc_sli4_mbx_sge_set (mbox, pagen, phyaddr, resid_len);
drivers/scsi/lpfc/lpfc_sli.c +35 -12
167 lines not on this page · raw message