Re: [PATCH 4/9] lpfc: Add support for using block multi-queue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



James Smart wrote:
> 
> Add support for using block multi-queue
> 
> With blk-mq support in the mid-layer, lpfc can do IO steering based
> on the information in the request tag.  This patch allows lpfc to use

two spaces

> blk-mq if enabled. If not enabled, we fall back into the emulex-internal
> affinity mappings.
> 
> This feature can be turned on via CONFIG_SCSI_MQ_DEFAULT or passing
> scsi_mod.use_blk_mq=Y as a parameter to the kernel.
> 
> Signed-off-by: Dick Kennedy <dick.kennedy@xxxxxxxxxxxxx>
> Signed-off-by: James Smart <james.smart@xxxxxxxxxxxxx>
> ---
>  drivers/scsi/lpfc/lpfc_init.c |  4 ++-
>  drivers/scsi/lpfc/lpfc_scsi.c | 43 +++++++++++++++++++++++++
>  drivers/scsi/lpfc/lpfc_scsi.h |  3 ++
>  drivers/scsi/lpfc/lpfc_sli.c  | 74 ++++++++++++++-----------------------------
>  4 files changed, 72 insertions(+), 52 deletions(-)

snip

> diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
> index 116df9c..4a2a818 100644
> --- a/drivers/scsi/lpfc/lpfc_scsi.c
> +++ b/drivers/scsi/lpfc/lpfc_scsi.c
> @@ -3846,6 +3846,49 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
>  }
>  
>  /**
> + * lpfc_sli4_scmd_to_wqidx_distr - scsi command to SLI4 WQ index distribution
> + * @phba: Pointer to HBA context object.

@lpfc_cmd is missing

> + *
> + * This routine performs a roundrobin SCSI command to SLI4 FCP WQ index
> + * distribution.  This is called by __lpfc_sli_issue_iocb_s4() with the hbalock

two spaces

> + * held.
> + * If scsi-mq is enabled, get the default block layer mapping of software queues
> + * to hardware queues. This information is saved in request tag.
> + *
> + * Return: index into SLI4 fast-path FCP queue index.
> + **/
> +int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba,
> +				  struct lpfc_scsi_buf *lpfc_cmd)
> +{
> +	struct scsi_cmnd *cmnd = lpfc_cmd->pCmd;
> +	struct lpfc_vector_map_info *cpup;
> +	int chann, cpu;
> +	uint32_t tag;
> +	uint16_t hwq;
> +
> +	if (shost_use_blk_mq(cmnd->device->host)) {
> +		tag = blk_mq_unique_tag(cmnd->request);
> +		hwq = blk_mq_unique_tag_to_hwq(tag);
> +

remove new line?

> +		return hwq;
> +	}
> +
> +	if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_CPU
> +	    && phba->cfg_fcp_io_channel > 1) {
> +		cpu = smp_processor_id();
> +		if (cpu < phba->sli4_hba.num_present_cpu) {
> +			cpup = phba->sli4_hba.cpu_map;
> +			cpup += cpu;
> +			return cpup->channel_id;
> +		}
> +	}

maybe add new line?

> +	chann = atomic_add_return(1, &phba->fcp_qidx);
> +	chann = (chann % phba->cfg_fcp_io_channel);
> +	return chann;
> +}
> +
> +
> +/**
>   * lpfc_scsi_cmd_iocb_cmpl - Scsi cmnd IOCB completion routine
>   * @phba: The Hba for which this call is being executed.
>   * @pIocbIn: The command IOCBQ for the scsi cmnd.
> diff --git a/drivers/scsi/lpfc/lpfc_scsi.h b/drivers/scsi/lpfc/lpfc_scsi.h
> index 474e30c..18b9260 100644
> --- a/drivers/scsi/lpfc/lpfc_scsi.h
> +++ b/drivers/scsi/lpfc/lpfc_scsi.h
> @@ -184,3 +184,6 @@ struct lpfc_scsi_buf {
>  #define FIND_FIRST_OAS_LUN		 0
>  #define NO_MORE_OAS_LUN			-1
>  #define NOT_OAS_ENABLED_LUN		NO_MORE_OAS_LUN
> +
> +int lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba,
> +				  struct lpfc_scsi_buf *lpfc_cmd);
> diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
> index 41d3370..07df296 100644
> --- a/drivers/scsi/lpfc/lpfc_sli.c
> +++ b/drivers/scsi/lpfc/lpfc_sli.c

snip

> @@ -8807,27 +8777,29 @@ int
>  lpfc_sli_calc_ring(struct lpfc_hba *phba, uint32_t ring_number,
>  		    struct lpfc_iocbq *piocb)
>  {
> -	if (phba->sli_rev == LPFC_SLI_REV4) {
> -		if (piocb->iocb_flag &  (LPFC_IO_FCP | LPFC_USE_FCPWQIDX)) {
> -			if (!(phba->cfg_fof) ||
> -			    (!(piocb->iocb_flag & LPFC_IO_FOF))) {
> -				if (unlikely(!phba->sli4_hba.fcp_wq))
> -					return LPFC_HBA_ERROR;
> -				/*
> -				 * for abort iocb fcp_wqidx should already
> -				 * be setup based on what work queue we used.
> -				 */
> -				if (!(piocb->iocb_flag & LPFC_USE_FCPWQIDX))
> -					piocb->fcp_wqidx =
> -					    lpfc_sli4_scmd_to_wqidx_distr(phba);
> -				ring_number = MAX_SLI3_CONFIGURED_RINGS +
> -						piocb->fcp_wqidx;
> -			} else {
> -				if (unlikely(!phba->sli4_hba.oas_wq))
> -					return LPFC_HBA_ERROR;
> -				piocb->fcp_wqidx = 0;
> -				ring_number =  LPFC_FCP_OAS_RING;
> -			}
> +	if (phba->sli_rev < LPFC_SLI_REV4)
> +		return ring_number;
> +
> +	if (piocb->iocb_flag &  (LPFC_IO_FCP | LPFC_USE_FCPWQIDX)) {

two spaces

> +		if (!(phba->cfg_fof) ||
> +				(!(piocb->iocb_flag & LPFC_IO_FOF))) {
> +			if (unlikely(!phba->sli4_hba.fcp_wq))
> +				return LPFC_HBA_ERROR;
> +			/*
> +			 * for abort iocb fcp_wqidx should already
> +			 * be setup based on what work queue we used.
> +			 */
> +			if (!(piocb->iocb_flag & LPFC_USE_FCPWQIDX))
> +				piocb->fcp_wqidx =
> +					lpfc_sli4_scmd_to_wqidx_distr(phba,
> +							      piocb->context1);
> +			ring_number = MAX_SLI3_CONFIGURED_RINGS +
> +				piocb->fcp_wqidx;
> +		} else {
> +			if (unlikely(!phba->sli4_hba.oas_wq))
> +				return LPFC_HBA_ERROR;
> +			piocb->fcp_wqidx = 0;
> +			ring_number =  LPFC_FCP_OAS_RING;

two spaces

>  		}
>  	}
>  	return ring_number;

Sebastian
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux