Message ID | 20181127230455.259829-3-bvanassche@acm.org (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | Two refactoring patches for the qla2xxx driver | expand |
> On Nov 27, 2018, at 3:04 PM, Bart Van Assche <bvanassche@acm.org> wrote: > > External Email > > Nesting in __qla2x00_abort_all_cmds() is way too deep. Reduce the nesting > level by introducing a helper function. This patch does not change any > functionality. > > Cc: Himanshu Madhani <himanshu.madhani@cavium.com> > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > --- > drivers/scsi/qla2xxx/qla_os.c | 89 +++++++++++++++++------------------ > 1 file changed, 44 insertions(+), 45 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c > index b658b9a5eb1e..247f16969f0f 100644 > --- a/drivers/scsi/qla2xxx/qla_os.c > +++ b/drivers/scsi/qla2xxx/qla_os.c > @@ -1746,10 +1746,52 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) > return QLA_SUCCESS; > } > > +static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, > + unsigned long *flags) > + __releases(qp->qp_lock_ptr) > + __acquires(qp->qp_lock_ptr) > +{ > + scsi_qla_host_t *vha = qp->vha; > + struct qla_hw_data *ha = vha->hw; > + int status; > + > + if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS) { > + if (!sp_get(sp)) { > + /* got sp */ > + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); > + qla_nvme_abort(ha, sp, res); > + spin_lock_irqsave(qp->qp_lock_ptr, *flags); > + } > + } else if (GET_CMD_SP(sp) && !ha->flags.eeh_busy && > + !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && > + !qla2x00_isp_reg_stat(ha) && sp->type == SRB_SCSI_CMD) { > + /* > + * Don't abort commands in adapter during EEH recovery as it's > + * not accessible/responding. > + * > + * Get a reference to the sp and drop the lock. The reference > + * ensures this sp->done() call and not the call in > + * qla2xxx_eh_abort() ends the SCSI cmd (with result 'res'). > + */ > + if (!sp_get(sp)) { > + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); > + status = qla2xxx_eh_abort(GET_CMD_SP(sp)); > + spin_lock_irqsave(qp->qp_lock_ptr, *flags); > + /* > + * Get rid of extra reference caused by early exit > + * from qla2xxx_eh_abort(). > + */ > + if (status == FAST_IO_FAIL) > + atomic_dec(&sp->ref_count); > + } > + } > + sp->done(sp, res); > +} > + > static void > __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) > { > - int cnt, status; > + int cnt; > unsigned long flags; > srb_t *sp; > scsi_qla_host_t *vha = qp->vha; > @@ -1768,50 +1810,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) > req->outstanding_cmds[cnt] = NULL; > switch (sp->cmd_type) { > case TYPE_SRB: > - if (sp->type == SRB_NVME_CMD || > - sp->type == SRB_NVME_LS) { > - if (!sp_get(sp)) { > - /* got sp */ > - spin_unlock_irqrestore > - (qp->qp_lock_ptr, > - flags); > - qla_nvme_abort(ha, sp, res); > - spin_lock_irqsave > - (qp->qp_lock_ptr, flags); > - } > - } else if (GET_CMD_SP(sp) && > - !ha->flags.eeh_busy && > - (!test_bit(ABORT_ISP_ACTIVE, > - &vha->dpc_flags)) && > - !qla2x00_isp_reg_stat(ha) && > - (sp->type == SRB_SCSI_CMD)) { > - /* > - * Don't abort commands in adapter > - * during EEH recovery as it's not > - * accessible/responding. > - * > - * Get a reference to the sp and drop > - * the lock. The reference ensures this > - * sp->done() call and not the call in > - * qla2xxx_eh_abort() ends the SCSI cmd > - * (with result 'res'). > - */ > - if (!sp_get(sp)) { > - spin_unlock_irqrestore > - (qp->qp_lock_ptr, flags); > - status = qla2xxx_eh_abort( > - GET_CMD_SP(sp)); > - spin_lock_irqsave > - (qp->qp_lock_ptr, flags); > - /* > - * Get rid of extra reference caused > - * by early exit from qla2xxx_eh_abort > - */ > - if (status == FAST_IO_FAIL) > - atomic_dec(&sp->ref_count); > - } > - } > - sp->done(sp, res); > + qla2x00_abort_srb(qp, sp, res, &flags); > break; > case TYPE_TGT_CMD: > if (!vha->hw->tgt.tgt_ops || !tgt || > -- > 2.20.0.rc0.387.gc7a69e6b6c-goog > Looks Good. Acked-by: Himanshu Madhani <himanshu.madhani@cavium.com> Thanks, - Himanshu
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index b658b9a5eb1e..247f16969f0f 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -1746,10 +1746,52 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) return QLA_SUCCESS; } +static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, + unsigned long *flags) + __releases(qp->qp_lock_ptr) + __acquires(qp->qp_lock_ptr) +{ + scsi_qla_host_t *vha = qp->vha; + struct qla_hw_data *ha = vha->hw; + int status; + + if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS) { + if (!sp_get(sp)) { + /* got sp */ + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); + qla_nvme_abort(ha, sp, res); + spin_lock_irqsave(qp->qp_lock_ptr, *flags); + } + } else if (GET_CMD_SP(sp) && !ha->flags.eeh_busy && + !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && + !qla2x00_isp_reg_stat(ha) && sp->type == SRB_SCSI_CMD) { + /* + * Don't abort commands in adapter during EEH recovery as it's + * not accessible/responding. + * + * Get a reference to the sp and drop the lock. The reference + * ensures this sp->done() call and not the call in + * qla2xxx_eh_abort() ends the SCSI cmd (with result 'res'). + */ + if (!sp_get(sp)) { + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); + status = qla2xxx_eh_abort(GET_CMD_SP(sp)); + spin_lock_irqsave(qp->qp_lock_ptr, *flags); + /* + * Get rid of extra reference caused by early exit + * from qla2xxx_eh_abort(). + */ + if (status == FAST_IO_FAIL) + atomic_dec(&sp->ref_count); + } + } + sp->done(sp, res); +} + static void __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) { - int cnt, status; + int cnt; unsigned long flags; srb_t *sp; scsi_qla_host_t *vha = qp->vha; @@ -1768,50 +1810,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) req->outstanding_cmds[cnt] = NULL; switch (sp->cmd_type) { case TYPE_SRB: - if (sp->type == SRB_NVME_CMD || - sp->type == SRB_NVME_LS) { - if (!sp_get(sp)) { - /* got sp */ - spin_unlock_irqrestore - (qp->qp_lock_ptr, - flags); - qla_nvme_abort(ha, sp, res); - spin_lock_irqsave - (qp->qp_lock_ptr, flags); - } - } else if (GET_CMD_SP(sp) && - !ha->flags.eeh_busy && - (!test_bit(ABORT_ISP_ACTIVE, - &vha->dpc_flags)) && - !qla2x00_isp_reg_stat(ha) && - (sp->type == SRB_SCSI_CMD)) { - /* - * Don't abort commands in adapter - * during EEH recovery as it's not - * accessible/responding. - * - * Get a reference to the sp and drop - * the lock. The reference ensures this - * sp->done() call and not the call in - * qla2xxx_eh_abort() ends the SCSI cmd - * (with result 'res'). - */ - if (!sp_get(sp)) { - spin_unlock_irqrestore - (qp->qp_lock_ptr, flags); - status = qla2xxx_eh_abort( - GET_CMD_SP(sp)); - spin_lock_irqsave - (qp->qp_lock_ptr, flags); - /* - * Get rid of extra reference caused - * by early exit from qla2xxx_eh_abort - */ - if (status == FAST_IO_FAIL) - atomic_dec(&sp->ref_count); - } - } - sp->done(sp, res); + qla2x00_abort_srb(qp, sp, res, &flags); break; case TYPE_TGT_CMD: if (!vha->hw->tgt.tgt_ops || !tgt ||
Nesting in __qla2x00_abort_all_cmds() is way too deep. Reduce the nesting level by introducing a helper function. This patch does not change any functionality. Cc: Himanshu Madhani <himanshu.madhani@cavium.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- drivers/scsi/qla2xxx/qla_os.c | 89 +++++++++++++++++------------------ 1 file changed, 44 insertions(+), 45 deletions(-)