lpfc 8.3.39: Fix driver issues with large s/g lists for BlockGuard
Subsystems (2)
PATCH 6/22 lpfc 8.3.39: Fix driver issues with large s/g lists for BlockGuard
Fix driver issues with large s/g lists for BlockGuard
Signed-off-by James Smart <[email protected]>
---
lpfc.h | 7 + lpfc_attr.c | 15 ++- lpfc_init.c | 132 ++++++++++++++++++++++++---------- lpfc_mem.c | 14 ++- lpfc_scsi.c | 229 +++++++++++++++++++++++++++++++++++++----------------------- lpfc_sli4.h | 5 - 6 files changed, 265 insertions(+), 137 deletions(-)
drivers/scsi/lpfc/lpfc_attr.c +11 -4
@@ -4073,16 +4073,23 @@ MODULE_PARM_DESC(lpfc_delay_discovery,/* * lpfc_sg_seg_cnt - Initial Maximum DMA Segment Count -* This value can be set to values between 64 and 256. The default value is +* This value can be set to values between 64 and 4096. The default value is * 64, but may be increased to allow for larger Max I/O sizes. The scsi layer * will be allowed to request I/Os of sizes up to (MAX_SEG_COUNT * SEG_SIZE). +* Because of the additional overhead involved in setting up T10-DIF, +* this parameter will be limited to 128 if BlockGuard is enabled under SLI4 +* and will be limited to 512 if BlockGuard is enabled under SLI3. */ LPFC_ATTR_R (sg_seg_cnt,LPFC_DEFAULT_SG_SEG_CNT ,LPFC_DEFAULT_SG_SEG_CNT ,LPFC_MAX_SG_SEG_CNT ,"Max Scatter Gather Segment Count" ); -LPFC_ATTR_R (prot_sg_seg_cnt,LPFC_DEFAULT_PROT_SG_SEG_CNT , -LPFC_DEFAULT_PROT_SG_SEG_CNT ,LPFC_MAX_PROT_SG_SEG_CNT , -"Max Protection Scatter Gather Segment Count" ); +/* +* This parameter will be depricated, the driver cannot limit the +* protection data s/g list. +*/ +LPFC_ATTR_R (prot_sg_seg_cnt,LPFC_DEFAULT_SG_SEG_CNT , +LPFC_DEFAULT_SG_SEG_CNT ,LPFC_MAX_SG_SEG_CNT , +"Max Protection Scatter Gather Segment Count" );struct device_attribute *lpfc_hba_attrs[] = { &dev_attr_bg_info,
drivers/scsi/lpfc/lpfc.h +5 -2
@@ -46,13 +46,15 @@ struct lpfc_sli2_slim;#define LPFC_DEFAULT_MENLO_SG_SEG_CNT 128/* sg element count per scsi cmnd for menlo needs nearly twice as for firmware downloads using bsg */ -#define LPFC_DEFAULT_PROT_SG_SEG_CNT 4096/* sg protection elements count */ + +#define LPFC_MIN_SG_SLI4_BUF_SZ 0x800/* based on LPFC_DEFAULT_SG_SEG_CNT */ +#define LPFC_MAX_SG_SLI4_SEG_CNT_DIF 128/* sg element count per scsi cmnd */ +#define LPFC_MAX_SG_SEG_CNT_DIF 512/* sg element count per scsi cmnd */ #define LPFC_MAX_SG_SEG_CNT 4096/* sg element count per scsi cmnd */ #define LPFC_MAX_SGL_SEG_CNT 512/* SGL element count per scsi cmnd */ #define LPFC_MAX_BPL_SEG_CNT 4096/* BPL element count per scsi cmnd */ #define LPFC_MAX_SGE_SIZE 0x80000000/* Maximum data allowed in a SGE */ -#define LPFC_MAX_PROT_SG_SEG_CNT 4096/* prot sg element count per scsi cmd*/ #define LPFC_IOCB_LIST_CNT 2250/* list of IOCBs for fast-path usage. */ #define LPFC_Q_RAMP_UP_INTERVAL 120/* lun q_depth ramp up interval */ #define LPFC_VNAME_LEN 100/* vport symbolic name length */
@@ -710,6 +712,7 @@ struct lpfc_hba {uint32_t cfg_fcp_wq_count;uint32_t cfg_fcp_eq_count;uint32_t cfg_fcp_io_channel; +uint32_t cfg_total_seg_cnt;uint32_t cfg_sg_seg_cnt;uint32_t cfg_prot_sg_seg_cnt;uint32_t cfg_sg_dma_buf_size;
drivers/scsi/lpfc/lpfc_init.c +94 -38
168 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_mem.c +11 -3
@@ -64,18 +64,26 @@ lpfc_mem_alloc(struct lpfc_hba *phba, instruct lpfc_dma_pool *pool = &phba->lpfc_mbuf_safety_pool;int i; -if (phba->sli_rev ==LPFC_SLI_REV4 ) +if (phba->sli_rev ==LPFC_SLI_REV4 ) { +/* Calculate alignment */ +if (phba->cfg_sg_dma_buf_size <SLI4_PAGE_SIZE ) + i = phba->cfg_sg_dma_buf_size; +else + i =SLI4_PAGE_SIZE ; + phba->lpfc_scsi_dma_buf_pool =pci_pool_create ("lpfc_scsi_dma_buf_pool" , phba->pcidev, phba->cfg_sg_dma_buf_size, - phba->cfg_sg_dma_buf_size, + i,0 ); -else + }else { phba->lpfc_scsi_dma_buf_pool =pci_pool_create ("lpfc_scsi_dma_buf_pool" , phba->pcidev, phba->cfg_sg_dma_buf_size, align,0 ); + } +if (!phba->lpfc_scsi_dma_buf_pool) goto fail;
drivers/scsi/lpfc/lpfc_scsi.c +144 -85
416 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_sli4.h +0 -5
@@ -346,11 +346,6 @@ struct lpfc_bmbx {#define SLI4_CT_VFI 2#define SLI4_CT_FCFI 3 -#define LPFC_SLI4_FL1_MAX_SEGMENT_SIZE 0x10000 -#define LPFC_SLI4_FL1_MAX_BUF_SIZE 0X2000 -#define LPFC_SLI4_MIN_BUF_SIZE 0x400 -#define LPFC_SLI4_MAX_BUF_SIZE 0x20000 -/* * SLI4 specific data structures */