[PATCH 04/17] lpfc: NVME Initiator: Base modifications Part C

Johannes Thumshirn jthumshirn at suse.de
Wed Jan 18 03:03:04 PST 2017


On Tue, Jan 17, 2017 at 05:20:47PM -0800, James Smart wrote:
> 
> NVME Initiator: Base modifications
> 
> This is part C of parts A..F.
> 
> Part C is the 1st half of the mods to lpfc_init.c. This is the location
> of most of changes for the following:
> - sli3 ring vs sli4 wq splits
> - buffer pools are allocated/freed
> - sgl pools allocated/freed
> - adapter resources split up
> - queue config decided and enacted
> - receive buffer management
> 
> *********
> 
> Refer to Part A for a description of base modifications
> 
> Signed-off-by: Dick Kennedy <dick.kennedy at broadcom.com>
> Signed-off-by: James Smart <james.smart at broadcom.com>
> ---

[...]

> @@ -925,32 +926,43 @@ static void
>  lpfc_hba_clean_txcmplq(struct lpfc_hba *phba)
>  {
>  	struct lpfc_sli *psli = &phba->sli;
> +	struct lpfc_queue *qp = NULL;
>  	struct lpfc_sli_ring *pring;
>  	LIST_HEAD(completions);
>  	int i;
>  
> -	for (i = 0; i < psli->num_rings; i++) {
> -		pring = &psli->ring[i];
> -		if (phba->sli_rev >= LPFC_SLI_REV4)
> -			spin_lock_irq(&pring->ring_lock);
> -		else
> +	if (phba->sli_rev != LPFC_SLI_REV4) {
> +		for (i = 0; i < psli->num_rings; i++) {
> +			pring = &psli->sli3_ring[i];
>  			spin_lock_irq(&phba->hbalock);
> -		/* At this point in time the HBA is either reset or DOA. Either
> -		 * way, nothing should be on txcmplq as it will NEVER complete.
> -		 */
> -		list_splice_init(&pring->txcmplq, &completions);
> -		pring->txcmplq_cnt = 0;
> -
> -		if (phba->sli_rev >= LPFC_SLI_REV4)
> -			spin_unlock_irq(&pring->ring_lock);
> -		else
> +			/* At this point in time the HBA is either reset or DOA
> +			 * Nothing should be on txcmplq as it will
> +			 * NEVER complete.
> +			 */
> +			list_splice_init(&pring->txcmplq, &completions);
> +			pring->txcmplq_cnt = 0;
>  			spin_unlock_irq(&phba->hbalock);
>  
> +			lpfc_sli_abort_iocb_ring(phba, pring);
> +		}

>  		/* Cancel all the IOCBs from the completions list */
> -		lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
> -				      IOERR_SLI_ABORTED);
> +		lpfc_sli_cancel_iocbs(phba, &completions,
> +				      IOSTAT_LOCAL_REJECT, IOERR_SLI_ABORTED);
> +		return;
> +	}

And another great opportunity to factor a block into a helper function.

[...]

>  /**
> + * lpfc_sli4_nvme_sgl_update - update xri-sgl sizing and mapping
> + * @phba: pointer to lpfc hba data structure.
> + *
> + * This routine first calculates the sizes of the current els and allocated
> + * scsi sgl lists, and then goes through all sgls to updates the physical
> + * XRIs assigned due to port function reset. During port initialization, the
> + * current els and allocated scsi sgl lists are 0s.
> + *
> + * Return codes
> + *   0 - successful (for now, it always returns 0)
> + **/
> +int
> +lpfc_sli4_nvme_sgl_update(struct lpfc_hba *phba)
> +{
> +	struct lpfc_nvme_buf *lpfc_ncmd = NULL, *lpfc_ncmd_next = NULL;
> +	uint16_t i, lxri, els_xri_cnt;
> +	uint16_t nvme_xri_cnt;
> +	LIST_HEAD(nvme_sgl_list);
> +	int rc;
> +
> +	phba->total_nvme_bufs = 0;
> +
> +	if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME))
> +		return 0;
> +	/*
> +	 * update on pci function's allocated nvme xri-sgl list
> +	 */
> +
> +	/* maximum number of xris available for nvme buffers */
> +	els_xri_cnt = lpfc_sli4_get_els_iocb_cnt(phba);
> +	phba->sli4_hba.nvme_xri_max = phba->sli4_hba.max_cfg_param.max_xri -
> +				      els_xri_cnt;
> +	phba->sli4_hba.nvme_xri_max -= phba->sli4_hba.scsi_xri_max;

	nvme_xri_max = phba->sli4_hba.max_cfg_param.max_xri - els_xri_cnt;
	nvme_xri_max -= phba->sli4_hba.scsi_xri_max;
	phba->sli4_hba.nvme_xri_max = nvme_xri_max; 

Low hanging anti line-break fruit.

[...]

> @@ -4240,9 +4456,9 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli)
>  			break;
>  		default:
>  			lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
> -					"3296 "
> -					"LPFC_SLI_EVENT_TYPE_MISCONFIGURED "
> -					"event: Invalid link %d",
> +					"3296 LPFC_SLI_EVENT_TYPE_"
> +					"MISCONFIGURED  event: "
> +					"Invalid link %d\n",
>  					phba->sli4_hba.lnk_info.lnk_no);
>  			return;
>  		}
> @@ -4273,13 +4489,13 @@ lpfc_sli4_async_sli_evt(struct lpfc_hba *phba, struct lpfc_acqe_sli *acqe_sli)
>  			sprintf(message, "Unqualified optics - Replace with "
>  				"Avago optics for Warranty and Technical "

Is Avago still correct, or should it read Broadcom?

>  				"Support - Link is%s operational",
> -				(operational) ? "" : " not");
> +				(operational) ? " not" : "");
>  			break;

[...]


> @@ -4854,17 +5070,20 @@ static int
>  lpfc_enable_pci_dev(struct lpfc_hba *phba)
>  {
>  	struct pci_dev *pdev;
> +	int bars = 0;
>  
>  	/* Obtain PCI device reference */
>  	if (!phba->pcidev)
>  		goto out_error;
>  	else
>  		pdev = phba->pcidev;
> +	/* Select PCI BARs */
> +	bars = pci_select_bars(pdev, IORESOURCE_MEM);
>  	/* Enable PCI device */
>  	if (pci_enable_device_mem(pdev))
>  		goto out_error;
>  	/* Request PCI resource for the device */
> -	if (pci_request_mem_regions(pdev, LPFC_DRIVER_NAME))
> +	if (pci_request_selected_regions(pdev, bars, LPFC_DRIVER_NAME))
>  		goto out_disable_device;
>  	/* Set up device as PCI master and save state for EEH */
>  	pci_set_master(pdev);
> @@ -4881,7 +5100,7 @@ lpfc_enable_pci_dev(struct lpfc_hba *phba)
>  	pci_disable_device(pdev);
>  out_error:
>  	lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
> -			"1401 Failed to enable pci device\n");
> +			"1401 Failed to enable pci device, bars:x%x\n", bars);
>  	return -ENODEV;
>  }

I don't get this change. pci_request_mem_regions does

pci_request_selected_regions(pdev, 
		pci_select_bars(pdev, IORESOURCE_MEM), name);

if you want to have the bars in the error log please do:
  	lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
			"1401 Failed to enable pci device, bars:x%x\n",
			pci_select_regions(pdev, IORESOURCE_MEM));
>  
> @@ -4896,14 +5115,17 @@ static void
>  lpfc_disable_pci_dev(struct lpfc_hba *phba)
>  {
>  	struct pci_dev *pdev;
> +	int bars;
>  
>  	/* Obtain PCI device reference */
>  	if (!phba->pcidev)
>  		return;
>  	else
>  		pdev = phba->pcidev;
> +	/* Select PCI BARs */
> +	bars = pci_select_bars(pdev, IORESOURCE_MEM);
>  	/* Release PCI resource and disable PCI device */
> -	pci_release_mem_regions(pdev);
> +	pci_release_selected_regions(pdev, bars);
>  	pci_disable_device(pdev);
>  

Ditto.

[...]

> +	for_each_present_cpu(cpu) {
> +		if (cpu_online(cpu))
> +			i++;
> +	}

I'm sure you want for_each_online_cpu(cpu)

[...]

> +	for (idx = 0; idx < phba->sli4_hba.num_present_cpu; idx++) {
> +		if (phba->cfg_nvme_io_channel && (idx < numwq)) {
> +			/* Create Fast Path NVME WQs. */
>  
> +			/* For NVME, every posted buffer potentially
> +			 * represents 1 IO and IOs are spread across
> +			 * cfg_nvme_max_hw_queue NVME hardware queues.
> +			 *
> +			 * Thus we need to ensure we have
> +			 * enough WQE slots in the WQs to address all IOs.
> +			 */
> +			cnt = phba->cfg_nvme_posted_buf /
> +				phba->cfg_nvme_max_hw_queue;
> +			if (cnt < LPFC_WQE128_DEF_COUNT)
> +				cnt = LPFC_WQE128_DEF_COUNT;
> +			qdesc = lpfc_sli4_queue_alloc(phba,
> +						      LPFC_WQE128_SIZE,
> +						      cnt);
> +			if (!qdesc) {
> +				lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
> +						"0509 Failed allocate "
> +						"fast-path NVME WQ (%d)\n",
> +						idx);
> +				goto out_error;
> +			}
> +			phba->sli4_hba.nvme_wq[idx] = qdesc;
> +			list_add_tail(&qdesc->wq_list,
> +				      &phba->sli4_hba.lpfc_wq_list);
> +		}
> +		if ((phba->cfg_fcp_io_channel) &&
> +		    (idx < phba->cfg_fcp_max_hw_queue)) {
> +			/* Create Fast Path FCP WQs */
> +			if (phba->fcp_embed_io) {
> +				qdesc = lpfc_sli4_queue_alloc(phba,
> +							LPFC_WQE128_SIZE,
> +							LPFC_WQE128_DEF_COUNT);
> +			} else {
> +				qdesc = lpfc_sli4_queue_alloc(phba,
> +						phba->sli4_hba.wq_esize,
> +						phba->sli4_hba.wq_ecount);
> +			}
> +			if (!qdesc) {
> +				lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
> +						"0503 Failed allocate "
> +						"fast-path FCP WQ (%d)\n",
> +						idx);
> +				goto out_error;
> +			}
> +			phba->sli4_hba.fcp_wq[idx] = qdesc;
> +			list_add_tail(&qdesc->wq_list,
> +				      &phba->sli4_hba.lpfc_wq_list);
> +		}
> +	}

Please try to factor out the body of the for loop or the bodies of the if
statements. Just don't let it shift so far to the right.

Thanks,
	Johannes
-- 
Johannes Thumshirn                                          Storage
jthumshirn at suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850



More information about the Linux-nvme mailing list