mirror of https://gitee.com/openkylin/linux.git
lpfc: Fix ABORTs WQ selection in terminate_rport_io
Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com> Signed-off-by: James Smart <james.smart@avagotech.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
parent
7aafb6e75e
commit
a1efe16310
|
@ -8792,30 +8792,40 @@ lpfc_sli_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_sli_calc_ring - Calculates which ring to use
|
||||
* @phba: Pointer to HBA context object.
|
||||
* @ring_number: Initial ring
|
||||
* @piocb: Pointer to command iocb.
|
||||
*
|
||||
* For SLI4, FCP IO can deferred to one fo many WQs, based on
|
||||
* fcp_wqidx, thus we need to calculate the corresponding ring.
|
||||
* Since ABORTS must go on the same WQ of the command they are
|
||||
* aborting, we use command's fcp_wqidx.
|
||||
*/
|
||||
int
|
||||
lpfc_sli_calc_ring(struct lpfc_hba *phba, uint32_t ring_number,
|
||||
struct lpfc_iocbq *piocb)
|
||||
{
|
||||
uint32_t idx;
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
if (piocb->iocb_flag & (LPFC_IO_FCP | LPFC_USE_FCPWQIDX)) {
|
||||
/*
|
||||
* fcp_wqidx should already be setup based on what
|
||||
* completion queue we want to use.
|
||||
*/
|
||||
if (!(phba->cfg_fof) ||
|
||||
(!(piocb->iocb_flag & LPFC_IO_FOF))) {
|
||||
if (unlikely(!phba->sli4_hba.fcp_wq))
|
||||
return LPFC_HBA_ERROR;
|
||||
idx = lpfc_sli4_scmd_to_wqidx_distr(phba);
|
||||
piocb->fcp_wqidx = idx;
|
||||
ring_number = MAX_SLI3_CONFIGURED_RINGS + idx;
|
||||
/*
|
||||
* 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;
|
||||
idx = 0;
|
||||
piocb->fcp_wqidx = idx;
|
||||
piocb->fcp_wqidx = 0;
|
||||
ring_number = LPFC_FCP_OAS_RING;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue