On 01/24/2018 11:45 PM, James Smart wrote:
> Increased CQ and WQ sizes for SCSI FCP, matching those used
> for NVMe development.
>
> Signed-off-by: Dick Kennedy <[email protected]>
> Signed-off-by: James Smart <[email protected]>
> ---
> drivers/scsi/lpfc/lpfc.h | 1 +
> drivers/scsi/lpfc/lpfc_hw4.h | 3 +++
> drivers/scsi/lpfc/lpfc_init.c | 30 ++++++++++++++++++++++--------
> drivers/scsi/lpfc/lpfc_sli.c | 3 ++-
> drivers/scsi/lpfc/lpfc_sli4.h | 5 +++++
> 5 files changed, 33 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
> index 61fb46da05d4..d042f9118e3b 100644
> --- a/drivers/scsi/lpfc/lpfc.h
> +++ b/drivers/scsi/lpfc/lpfc.h
> @@ -760,6 +760,7 @@ struct lpfc_hba {
> uint8_t mds_diags_support;
> uint32_t initial_imax;
> uint8_t bbcredit_support;
> + uint8_t enab_exp_wqcq_pages;
>
> /* HBA Config Parameters */
> uint32_t cfg_ack0;
> diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
> index 73c2f6971d2b..ef469129fb71 100644
> --- a/drivers/scsi/lpfc/lpfc_hw4.h
> +++ b/drivers/scsi/lpfc/lpfc_hw4.h
> @@ -3212,6 +3212,9 @@ struct lpfc_sli4_parameters {
> #define cfg_cqv_SHIFT 14
> #define cfg_cqv_MASK 0x00000003
> #define cfg_cqv_WORD word4
> +#define cfg_cqpsize_SHIFT 16
> +#define cfg_cqpsize_MASK 0x000000ff
> +#define cfg_cqpsize_WORD word4
> uint32_t word5;
> uint32_t word6;
> #define cfg_mqv_SHIFT 14
> diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
> index f539c554588c..5b96bf0d3331 100644
> --- a/drivers/scsi/lpfc/lpfc_init.c
> +++ b/drivers/scsi/lpfc/lpfc_init.c
> @@ -8011,9 +8011,10 @@ static int
> lpfc_alloc_fcp_wq_cq(struct lpfc_hba *phba, int wqidx)
> {
> struct lpfc_queue *qdesc;
> + uint32_t wqesize;
>
> /* Create Fast Path FCP CQs */
> - if (phba->fcp_embed_io)
> + if (phba->enab_exp_wqcq_pages)
> /* Increase the CQ size when WQEs contain an embedded cdb */
> qdesc = lpfc_sli4_queue_alloc(phba, LPFC_EXPANDED_PAGE_SIZE,
> phba->sli4_hba.cq_esize,
> @@ -8031,15 +8032,18 @@ lpfc_alloc_fcp_wq_cq(struct lpfc_hba *phba, int wqidx)
> phba->sli4_hba.fcp_cq[wqidx] = qdesc;
>
> /* Create Fast Path FCP WQs */
> - if (phba->fcp_embed_io)
> /* Increase the WQ size when WQEs contain an embedded cdb */
Wrong indentation after patching.
> + if (phba->enab_exp_wqcq_pages) {
> + wqesize = (phba->fcp_embed_io) ?
> + LPFC_WQE128_SIZE : phba->sli4_hba.wq_esize;
> qdesc = lpfc_sli4_queue_alloc(phba, LPFC_EXPANDED_PAGE_SIZE,
> - LPFC_WQE128_SIZE,
> + wqesize,
> LPFC_WQE_EXP_COUNT);
> - else
> + } else {
> qdesc = lpfc_sli4_queue_alloc(phba, LPFC_DEFAULT_PAGE_SIZE,
> phba->sli4_hba.wq_esize,
> phba->sli4_hba.wq_ecount);
> + }
No need for braces here.
> if (!qdesc) {
> lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
> "0503 Failed allocate fast-path FCP WQ (%d)\n",
> @@ -10485,6 +10489,12 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba,
> LPFC_MBOXQ_t *mboxq)
> else
> phba->fcp_embed_io = 0;
>
> + if ((bf_get(cfg_cqpsize, mbx_sli4_parameters) & LPFC_CQ_16K_PAGE_SZ) &&
> + (bf_get(cfg_wqpsize, mbx_sli4_parameters) & LPFC_WQ_16K_PAGE_SZ) &&
> + (sli4_params->wqsize & LPFC_WQ_SZ128_SUPPORT))
> + phba->enab_exp_wqcq_pages = 1;
> + else
> + phba->enab_exp_wqcq_pages = 0;
> /*
> * Check if the SLI port supports MDS Diagnostics
> */
> @@ -12227,6 +12237,7 @@ int
> lpfc_fof_queue_create(struct lpfc_hba *phba)
> {
> struct lpfc_queue *qdesc;
> + uint32_t wqesize;
>
> /* Create FOF EQ */
> qdesc = lpfc_sli4_queue_alloc(phba, LPFC_DEFAULT_PAGE_SIZE,
> @@ -12240,7 +12251,7 @@ lpfc_fof_queue_create(struct lpfc_hba *phba)
> if (phba->cfg_fof) {
>
> /* Create OAS CQ */
> - if (phba->fcp_embed_io)
> + if (phba->enab_exp_wqcq_pages)
> qdesc = lpfc_sli4_queue_alloc(phba,
> LPFC_EXPANDED_PAGE_SIZE,
> phba->sli4_hba.cq_esize,
> @@ -12256,16 +12267,19 @@ lpfc_fof_queue_create(struct lpfc_hba *phba)
> phba->sli4_hba.oas_cq = qdesc;
>
> /* Create OAS WQ */
> - if (phba->fcp_embed_io)
> + if (phba->enab_exp_wqcq_pages) {
> + wqesize = (phba->fcp_embed_io) ?
> + LPFC_WQE128_SIZE : phba->sli4_hba.wq_esize;
> qdesc = lpfc_sli4_queue_alloc(phba,
> LPFC_EXPANDED_PAGE_SIZE,
> - LPFC_WQE128_SIZE,
> + wqesize,
> LPFC_WQE_EXP_COUNT);
> - else
> + } else {
> qdesc = lpfc_sli4_queue_alloc(phba,
> LPFC_DEFAULT_PAGE_SIZE,
> phba->sli4_hba.wq_esize,
> phba->sli4_hba.wq_ecount);
> + }
> if (!qdesc)
> goto out_error;
>
> diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
> index 149f21f53b13..d08d9b48f6b1 100644
> --- a/drivers/scsi/lpfc/lpfc_sli.c
> +++ b/drivers/scsi/lpfc/lpfc_sli.c
> @@ -14910,7 +14910,8 @@ lpfc_wq_create(struct lpfc_hba *phba, struct
> lpfc_queue *wq,
> bf_set(lpfc_mbox_hdr_version, &shdr->request,
> phba->sli4_hba.pc_sli4_params.wqv);
>
> - if (phba->sli4_hba.pc_sli4_params.wqsize & LPFC_WQ_SZ128_SUPPORT)
> + if ((phba->sli4_hba.pc_sli4_params.wqsize & LPFC_WQ_SZ128_SUPPORT) ||
> + (wq->page_size > SLI4_PAGE_SIZE))
> wq_create_version = LPFC_Q_CREATE_VERSION_1;
> else
> wq_create_version = LPFC_Q_CREATE_VERSION_0;
> diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h
> index 81fb58e59e60..a9af9980fc43 100644
> --- a/drivers/scsi/lpfc/lpfc_sli4.h
> +++ b/drivers/scsi/lpfc/lpfc_sli4.h
> @@ -485,6 +485,11 @@ struct lpfc_pc_sli4_params {
> uint8_t wqpcnt;
> };
>
> +#define LPFC_CQ_4K_PAGE_SZ 0x1
> +#define LPFC_CQ_16K_PAGE_SZ 0x4
> +#define LPFC_WQ_4K_PAGE_SZ 0x1
> +#define LPFC_WQ_16K_PAGE_SZ 0x4
> +
> struct lpfc_iov {
> uint32_t pf_number;
> uint32_t vf_number;
>
Please fix up also the comment in lpfc_init.c:
/*
* Issue IOs with CDB embedded in WQE to minimized the number
* of DMAs the firmware has to do. Setting this to 1 also forces
* the driver to use 128 bytes WQEs for FCP IOs.
*/
Which isn't true anymore.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
[email protected] +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)