Message ID | 1604895845-2587-11-git-send-email-muneendra.kumar@broadcom.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | blkcg:Support to track FC storage blk io traffic | expand |
On 11/9/20 5:23 AM, Muneendra wrote: > From: Gaurav Srivastava <gaurav.srivastava@broadcom.com> > > This patch allocates the resource for vmid and checks if the firmware > supports the feature or not. > > Signed-off-by: Gaurav Srivastava <gaurav.srivastava@broadcom.com> > Signed-off-by: James Smart <jsmart2021@gmail.com> > > --- > v4: > No change > > v3: > No change > > v2: > Ported the patch on top of 5.10/scsi-queue > --- > drivers/scsi/lpfc/lpfc_init.c | 64 +++++++++++++++++++++++++++++++++++ > drivers/scsi/lpfc/lpfc_mbox.c | 6 ++++ > drivers/scsi/lpfc/lpfc_sli.c | 9 +++++ > 3 files changed, 79 insertions(+) > > diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c > index ca25e54bb782..e32d69515586 100644 > --- a/drivers/scsi/lpfc/lpfc_init.c > +++ b/drivers/scsi/lpfc/lpfc_init.c > @@ -4284,6 +4284,62 @@ lpfc_get_wwpn(struct lpfc_hba *phba) > return rol64(wwn, 32); > } > > +/** > + * lpfc_vmid_res_alloc - Allocates resources for VMID > + * @phba: pointer to lpfc hba data structure. > + * @vport: pointer to vport data structure > + * > + * This routine allocated the resources needed for the vmid. > + * > + * Return codes > + * 0 on Succeess > + * Non-0 on Failure > + */ > +u8 > +lpfc_vmid_res_alloc(struct lpfc_hba *phba, struct lpfc_vport *vport) > +{ > + u16 i; > + > + /* vmid feature is supported only on SLI4 */ > + if (phba->sli_rev == LPFC_SLI_REV3) { > + phba->cfg_vmid_app_header = 0; > + phba->cfg_vmid_priority_tagging = 0; > + } > + > + /* if enabled, then allocated the resources */ > + if (lpfc_is_vmid_enabled(phba)) { > + vport->vmid = > + kmalloc_array(phba->cfg_max_vmid, sizeof(struct lpfc_vmid), > + GFP_KERNEL); > + if (!vport->vmid) > + return 1; > + > + memset(vport->vmid, 0, > + phba->cfg_max_vmid * sizeof(struct lpfc_vmid)); > + > + rwlock_init(&vport->vmid_lock); > + > + /* setting the VMID parameters for the vport */ > + vport->vmid_priority_tagging = phba->cfg_vmid_priority_tagging; > + vport->vmid_inactivity_timeout = > + phba->cfg_vmid_inactivity_timeout; > + vport->max_vmid = phba->cfg_max_vmid; > + vport->cur_vmid_cnt = 0; > + > + for (i = 0; i < LPFC_VMID_HASH_SIZE; i++) > + vport->hash_table[i] = NULL; > + > + vport->vmid_priority_range = bitmap_zalloc > + (LPFC_VMID_MAX_PRIORITY_RANGE, GFP_KERNEL); > + > + if (!vport->vmid_priority_range) { > + kfree(vport->vmid); > + return 1; > + } > + } > + return 0; > +} > + > /** > * lpfc_create_port - Create an FC port > * @phba: pointer to lpfc hba data structure. > @@ -4439,6 +4495,12 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) > vport->port_type, shost->sg_tablesize, > phba->cfg_scsi_seg_cnt, phba->cfg_sg_seg_cnt); > > + /* allocate the resources for vmid */ > + rc = lpfc_vmid_res_alloc(phba, vport); > + > + if (rc) > + goto out; > + > /* Initialize all internally managed lists. */ > INIT_LIST_HEAD(&vport->fc_nodes); > INIT_LIST_HEAD(&vport->rcv_buffer_list); > @@ -4463,6 +4525,8 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) > return vport; > > out_put_shost: > + kfree(vport->vmid); > + bitmap_free(vport->vmid_priority_range); > scsi_host_put(shost); > out: > return NULL; > diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c > index 3414ffcb26fe..78a9b9baecf3 100644 > --- a/drivers/scsi/lpfc/lpfc_mbox.c > +++ b/drivers/scsi/lpfc/lpfc_mbox.c > @@ -2100,6 +2100,12 @@ lpfc_request_features(struct lpfc_hba *phba, struct lpfcMboxq *mboxq) > bf_set(lpfc_mbx_rq_ftr_rq_iaab, &mboxq->u.mqe.un.req_ftrs, 0); > bf_set(lpfc_mbx_rq_ftr_rq_iaar, &mboxq->u.mqe.un.req_ftrs, 0); > } > + > + /* Enable Application Services Header for apphedr VMID */ > + if (phba->cfg_vmid_app_header) { > + bf_set(lpfc_mbx_rq_ftr_rq_ashdr, &mboxq->u.mqe.un.req_ftrs, 1); > + bf_set(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags, 1); > + } > return; > } > > diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c > index 4cd7ded656b7..51b99b7beaf9 100644 > --- a/drivers/scsi/lpfc/lpfc_sli.c > +++ b/drivers/scsi/lpfc/lpfc_sli.c > @@ -7558,6 +7558,15 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) > goto out_free_mbox; > } > > + /* Disable vmid if app header is not supported */ > + if (phba->cfg_vmid_app_header && !(bf_get(lpfc_mbx_rq_ftr_rsp_ashdr, > + &mqe->un.req_ftrs))) { > + bf_set(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags, 0); > + phba->cfg_vmid_app_header = 0; > + lpfc_printf_log(phba, KERN_DEBUG, LOG_SLI, > + "1242 vmid feature not supported"); > + } > + > /* > * The port must support FCP initiator mode as this is the > * only mode running in the host. > I would have expected the corresponding sysfs attributes (as introduced in patch 9) would return an error code if the app header is not supported; it's probably okay to ignore it when reading the sysfs attribute, but for writing the sysfs attribute we really should be getting an error if the app header is not supported. Yet I can't make out from the previous patch that this is taken into account. Can you please clarify? Cheers, Hannes
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index ca25e54bb782..e32d69515586 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -4284,6 +4284,62 @@ lpfc_get_wwpn(struct lpfc_hba *phba) return rol64(wwn, 32); } +/** + * lpfc_vmid_res_alloc - Allocates resources for VMID + * @phba: pointer to lpfc hba data structure. + * @vport: pointer to vport data structure + * + * This routine allocated the resources needed for the vmid. + * + * Return codes + * 0 on Succeess + * Non-0 on Failure + */ +u8 +lpfc_vmid_res_alloc(struct lpfc_hba *phba, struct lpfc_vport *vport) +{ + u16 i; + + /* vmid feature is supported only on SLI4 */ + if (phba->sli_rev == LPFC_SLI_REV3) { + phba->cfg_vmid_app_header = 0; + phba->cfg_vmid_priority_tagging = 0; + } + + /* if enabled, then allocated the resources */ + if (lpfc_is_vmid_enabled(phba)) { + vport->vmid = + kmalloc_array(phba->cfg_max_vmid, sizeof(struct lpfc_vmid), + GFP_KERNEL); + if (!vport->vmid) + return 1; + + memset(vport->vmid, 0, + phba->cfg_max_vmid * sizeof(struct lpfc_vmid)); + + rwlock_init(&vport->vmid_lock); + + /* setting the VMID parameters for the vport */ + vport->vmid_priority_tagging = phba->cfg_vmid_priority_tagging; + vport->vmid_inactivity_timeout = + phba->cfg_vmid_inactivity_timeout; + vport->max_vmid = phba->cfg_max_vmid; + vport->cur_vmid_cnt = 0; + + for (i = 0; i < LPFC_VMID_HASH_SIZE; i++) + vport->hash_table[i] = NULL; + + vport->vmid_priority_range = bitmap_zalloc + (LPFC_VMID_MAX_PRIORITY_RANGE, GFP_KERNEL); + + if (!vport->vmid_priority_range) { + kfree(vport->vmid); + return 1; + } + } + return 0; +} + /** * lpfc_create_port - Create an FC port * @phba: pointer to lpfc hba data structure. @@ -4439,6 +4495,12 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) vport->port_type, shost->sg_tablesize, phba->cfg_scsi_seg_cnt, phba->cfg_sg_seg_cnt); + /* allocate the resources for vmid */ + rc = lpfc_vmid_res_alloc(phba, vport); + + if (rc) + goto out; + /* Initialize all internally managed lists. */ INIT_LIST_HEAD(&vport->fc_nodes); INIT_LIST_HEAD(&vport->rcv_buffer_list); @@ -4463,6 +4525,8 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) return vport; out_put_shost: + kfree(vport->vmid); + bitmap_free(vport->vmid_priority_range); scsi_host_put(shost); out: return NULL; diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c index 3414ffcb26fe..78a9b9baecf3 100644 --- a/drivers/scsi/lpfc/lpfc_mbox.c +++ b/drivers/scsi/lpfc/lpfc_mbox.c @@ -2100,6 +2100,12 @@ lpfc_request_features(struct lpfc_hba *phba, struct lpfcMboxq *mboxq) bf_set(lpfc_mbx_rq_ftr_rq_iaab, &mboxq->u.mqe.un.req_ftrs, 0); bf_set(lpfc_mbx_rq_ftr_rq_iaar, &mboxq->u.mqe.un.req_ftrs, 0); } + + /* Enable Application Services Header for apphedr VMID */ + if (phba->cfg_vmid_app_header) { + bf_set(lpfc_mbx_rq_ftr_rq_ashdr, &mboxq->u.mqe.un.req_ftrs, 1); + bf_set(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags, 1); + } return; } diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 4cd7ded656b7..51b99b7beaf9 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -7558,6 +7558,15 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) goto out_free_mbox; } + /* Disable vmid if app header is not supported */ + if (phba->cfg_vmid_app_header && !(bf_get(lpfc_mbx_rq_ftr_rsp_ashdr, + &mqe->un.req_ftrs))) { + bf_set(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags, 0); + phba->cfg_vmid_app_header = 0; + lpfc_printf_log(phba, KERN_DEBUG, LOG_SLI, + "1242 vmid feature not supported"); + } + /* * The port must support FCP initiator mode as this is the * only mode running in the host.