lpfc 8.3.0 : Fix multiple NPIV issues
Subsystems (2)
PATCH 5/14 lpfc 8.3.0 : Fix multiple NPIV issues
lpfc 8.3.0 : Fix multiple NPIV issues
- Fix lock up on rmmod with vports defined by having lpfc_pci_remove_one() invoke fc_vport_terminate() to remove all the vports before invoking fc_remove_host() for the physical port
- Fix echotest failure when NPIV is enabled
- Add the vport_disable function to the physical port's transport template to make the vport disable attribute visible
- Set the vport state to DISABLE on create if the disable flag is true
- Call lpfc_alloc_sysfs_attr() for vports so that statistical data collection works on them
- Support setting a vport's symbolic name via sysfs by writing to /sys/class/fc_vport/vportX/symbolic_name
- Fix create vport fails when link is down or in loop mode. Should be able to be create vports any time NPIV is enabled
- Fix slow vport deletes when deleting multiple vports at once
---
drivers/scsi/lpfc/lpfc.h | 2 -- drivers/scsi/lpfc/lpfc_attr.c | 47 +++++++++++++++++++++++++++++++++------- drivers/scsi/lpfc/lpfc_ct.c | 17 ++++++++++++-- drivers/scsi/lpfc/lpfc_els.c | 6 ++++- drivers/scsi/lpfc/lpfc_init.c | 13 +++++++++-- drivers/scsi/lpfc/lpfc_vport.c | 28 +++++++++--------------- 6 files changed, 78 insertions(+), 35 deletions(-)
drivers/scsi/lpfc/lpfc.h +0 -2
@@ -354,8 +354,6 @@ struct lpfc_vport {uint8_t load_flag;#define FC_LOADING 0x1/* HBA in process of loading drvr */ #define FC_UNLOADING 0x2/* HBA in process of unloading drvr */ -char *vname;/* Application assigned name */ -/* Vport Config Parameters */ uint32_t cfg_scan_down;uint32_t cfg_lun_queue_depth;
drivers/scsi/lpfc/lpfc_attr.c +39 -8
100 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_ct.c +14 -3
@@ -560,18 +560,25 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, irsp->ulpStatus, irsp->un.ulpWord[4], vport->fc_ns_retry);/* Don't bother processing response if vport is being torn down. */ -if (vport->load_flag &FC_UNLOADING ) +if (vport->load_flag &FC_UNLOADING ) { +if (vport->fc_flag &FC_RSCN_MODE ) +lpfc_els_flush_rscn (vport); goto out; + }if (lpfc_els_chk_latt (vport)) {lpfc_printf_vlog (vport,KERN_INFO ,LOG_DISCOVERY ,"0216 Link event during NS query\n" ); +if (vport->fc_flag &FC_RSCN_MODE ) +lpfc_els_flush_rscn (vport);lpfc_vport_set_state (vport,FC_VPORT_FAILED ); goto out; }if (lpfc_error_lost_link (irsp)) {lpfc_printf_vlog (vport,KERN_INFO ,LOG_DISCOVERY ,"0226 NS query failed due to link event\n" ); +if (vport->fc_flag &FC_RSCN_MODE ) +lpfc_els_flush_rscn (vport); goto out; }if (irsp->ulpStatus) {
@@ -587,6 +594,8 @@ lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,if (rc ==0 ) goto out; } +if (vport->fc_flag &FC_RSCN_MODE ) +lpfc_els_flush_rscn (vport);lpfc_vport_set_state (vport,FC_VPORT_FAILED ); lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, "0257 GID_FT Query error: 0x%x 0x%x\n",
@@ -1008,8 +1017,10 @@ lpfc_vport_symbolic_port_name(struct lpfc_vport *vport, char *symbol,if (n < size) n +=snprintf (symbol + n, size - n," VPort-%d" , vport->vpi); -if (n < size && vport->vname) - n +=snprintf (symbol + n, size - n," VName-%s" , vport->vname); +if (n < size && +strlen (vport->fc_vport->symbolic_name)) + n +=snprintf (symbol + n, size - n," VName-%s" , + vport->fc_vport->symbolic_name);return n; }
drivers/scsi/lpfc/lpfc_els.c +5 -1
@@ -221,7 +221,11 @@ lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp,/* For ELS_REQUEST64_CR, use the VPI by default */ icmd->ulpContext = vport->vpi; icmd->ulpCt_h =0 ; - icmd->ulpCt_l =1 ; +/* The CT field must be 0=INVALID_RPI for the ECHO cmd */ +if (elscmd ==ELS_CMD_ECHO ) + icmd->ulpCt_l =0 ;/* context = invalid RPI */ +else + icmd->ulpCt_l =1 ;/* context = VPI */ } bpl = (struct ulp_bde64 *) pbuflist->virt;
drivers/scsi/lpfc/lpfc_init.c +10 -3
@@ -2041,8 +2041,6 @@ destroy_port(struct lpfc_vport *vport)struct Scsi_Host *shost =lpfc_shost_from_vport (vport);struct lpfc_hba *phba = vport->phba; -kfree (vport->vname); -lpfc_debugfs_terminate (vport);fc_remove_host (shost);scsi_remove_host (shost);
@@ -2716,18 +2714,27 @@ lpfc_pci_remove_one(struct pci_dev *pdev) {struct Scsi_Host *shost =pci_get_drvdata (pdev);struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; +struct lpfc_vport **vports;struct lpfc_hba *phba = vport->phba; +int i;int bars =pci_select_bars (pdev,IORESOURCE_MEM );spin_lock_irq (&phba->hbalock); vport->load_flag |=FC_UNLOADING ;spin_unlock_irq (&phba->hbalock); -kfree (vport->vname);lpfc_free_sysfs_attr (vport);kthread_stop (phba->worker_thread); +/* Release all the vports against this physical port */ + vports =lpfc_create_vport_work_array (phba); +if (vports !=NULL ) +for (i =1 ; i <= phba->max_vpi && vports[i] !=NULL ; i++) +fc_vport_terminate (vports[i]->fc_vport); +lpfc_destroy_vport_work_array (phba, vports); + +/* Remove FC host and then SCSI host with the physical port */ fc_remove_host (shost);scsi_remove_host (shost);lpfc_cleanup (vport);
drivers/scsi/lpfc/lpfc_vport.c +10 -18
@@ -288,10 +288,8 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable)int vpi;int rc =VPORT_ERROR ;int status; -int size; -if ((phba->sli_rev <3 ) || - !(phba->sli3_options &LPFC_SLI3_NPIV_ENABLED )) { +if ((phba->sli_rev <3 ) || !(phba->cfg_enable_npiv)) { lpfc_printf_log(phba, KERN_ERR, LOG_VPORT, "1808 Create VPORT failed: " "NPIV is not enabled: SLImode:%d\n",
@@ -351,20 +349,6 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable)memcpy (vport->fc_portname.u.wwn, vport->fc_sparam.portName.u.wwn,8 );memcpy (vport->fc_nodename.u.wwn, vport->fc_sparam.nodeName.u.wwn,8 ); - size =strnlen (fc_vport->symbolic_name,LPFC_VNAME_LEN ); -if (size) { - vport->vname =kzalloc (size+1 ,GFP_KERNEL ); -if (!vport->vname) { -lpfc_printf_vlog (vport,KERN_ERR ,LOG_VPORT , -"1814 Create VPORT failed. " -"vname allocation failed.\n" ); - rc =VPORT_ERROR ; -lpfc_free_vpi (phba, vpi); -destroy_port (vport); - goto error_out; - } -memcpy (vport->vname, fc_vport->symbolic_name, size+1 ); - }if (fc_vport->node_name !=0 )u64_to_wwn (fc_vport->node_name, vport->fc_nodename.u.wwn);if (fc_vport->port_name !=0 )
@@ -394,6 +378,9 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable) goto error_out; } +/* Create binary sysfs attribute for vport */ +lpfc_alloc_sysfs_attr (vport); + *(struct lpfc_vport **)fc_vport->dd_data = vport; vport->fc_vport = fc_vport;
@@ -405,6 +392,7 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable) }if (disable) { +lpfc_vport_set_state (vport,FC_VPORT_DISABLED ); rc =VPORT_OK ; goto out; }
@@ -587,8 +575,12 @@ lpfc_vport_delete(struct fc_vport *fc_vport)spin_lock_irq (&phba->hbalock); vport->load_flag |=FC_UNLOADING ;spin_unlock_irq (&phba->hbalock); -kfree (vport->vname); + +lpfc_free_sysfs_attr (vport); +lpfc_debugfs_terminate (vport); + +/* Remove FC host and then SCSI host with the vport */ fc_remove_host (lpfc_shost_from_vport (vport));scsi_remove_host (lpfc_shost_from_vport (vport));