Message ID | 20210410184016.21603-7-michael.christie@oracle.com |
---|---|
State | Superseded |
Headers | show |
Series | : qedi tmf fixes | expand |
> -----Original Message----- > From: Mike Christie <michael.christie@oracle.com> > Sent: Sunday, April 11, 2021 12:10 AM > To: lduncan@suse.com; martin.petersen@oracle.com; Manish Rangankar > <mrangankar@marvell.com>; Santosh Vernekar <svernekar@marvell.com>; > linux-scsi@vger.kernel.org; jejb@linux.ibm.com > Cc: Mike Christie <michael.christie@oracle.com> > Subject: [EXT] [PATCH 06/13] scsi: qedi: fix tmf tid allocation > > External Email > > ---------------------------------------------------------------------- > qedi_iscsi_abort_work and qedi_tmf_work allocates a tid then calls > qedi_send_iscsi_tmf which also allcoates a tid. This removes the tid allocation > from the callers. > > Signed-off-by: Mike Christie <michael.christie@oracle.com> > --- > drivers/scsi/qedi/qedi_fw.c | 76 ++++++++++------------------------ > drivers/scsi/qedi/qedi_gbl.h | 3 +- > drivers/scsi/qedi/qedi_iscsi.c | 2 +- > 3 files changed, 25 insertions(+), 56 deletions(-) > > diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c index > c5699421ec37..542255c94d96 100644 > --- a/drivers/scsi/qedi/qedi_fw.c > +++ b/drivers/scsi/qedi/qedi_fw.c > @@ -14,8 +14,8 @@ > #include "qedi_fw_iscsi.h" > #include "qedi_fw_scsi.h" > > -static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask); > +static int send_iscsi_tmf(struct qedi_conn *qedi_conn, > + struct iscsi_task *mtask); > > void qedi_iscsi_unmap_sg_list(struct qedi_cmd *cmd) { @@ -1350,7 +1350,7 > @@ static int qedi_wait_for_cleanup_request(struct qedi_ctx *qedi, > return 0; > } > > -static void qedi_tmf_work(struct work_struct *work) > +static void qedi_abort_work(struct work_struct *work) > { > struct qedi_cmd *qedi_cmd = > container_of(work, struct qedi_cmd, tmf_work); @@ -1363,7 > +1363,6 @@ static void qedi_tmf_work(struct work_struct *work) > struct iscsi_task *ctask; > struct iscsi_tm *tmf_hdr; > s16 rval = 0; > - s16 tid = 0; > > mtask = qedi_cmd->task; > tmf_hdr = (struct iscsi_tm *)mtask->hdr; @@ -1404,6 +1403,7 @@ > static void qedi_tmf_work(struct work_struct *work) > } > > qedi_cmd->type = TYPEIO; > + qedi_cmd->state = CLEANUP_WAIT; > list_work->qedi_cmd = qedi_cmd; > list_work->rtid = cmd->task_id; > list_work->state = QEDI_WORK_SCHEDULED; @@ -1430,15 +1430,7 > @@ static void qedi_tmf_work(struct work_struct *work) > goto ldel_exit; > } > > - tid = qedi_get_task_idx(qedi); > - if (tid == -1) { > - QEDI_ERR(&qedi->dbg_ctx, "Invalid tid, cid=0x%x\n", > - qedi_conn->iscsi_conn_id); > - goto ldel_exit; > - } > - > - qedi_cmd->task_id = tid; > - qedi_send_iscsi_tmf(qedi_conn, qedi_cmd->task); > + send_iscsi_tmf(qedi_conn, qedi_cmd->task); > > put_task: > iscsi_put_task(ctask); > @@ -1468,8 +1460,7 @@ static void qedi_tmf_work(struct work_struct *work) > clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags); } > > -static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask) > +static int send_iscsi_tmf(struct qedi_conn *qedi_conn, struct > +iscsi_task *mtask) > { > struct iscsi_tmf_request_hdr tmf_pdu_header; > struct iscsi_task_params task_params; > @@ -1484,7 +1475,6 @@ static int qedi_send_iscsi_tmf(struct qedi_conn > *qedi_conn, > u32 scsi_lun[2]; > s16 tid = 0; > u16 sq_idx = 0; > - int rval = 0; > > tmf_hdr = (struct iscsi_tm *)mtask->hdr; > qedi_cmd = (struct qedi_cmd *)mtask->dd_data; @@ -1548,10 +1538,7 > @@ static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, > task_params.sqe = &ep->sq[sq_idx]; > > memset(task_params.sqe, 0, sizeof(struct iscsi_wqe)); > - rval = init_initiator_tmf_request_task(&task_params, > - &tmf_pdu_header); > - if (rval) > - return -1; > + init_initiator_tmf_request_task(&task_params, &tmf_pdu_header); > > spin_lock(&qedi_conn->list_lock); > list_add_tail(&qedi_cmd->io_cmd, &qedi_conn->active_cmd_list); @@ - > 1563,47 +1550,30 @@ static int qedi_send_iscsi_tmf(struct qedi_conn > *qedi_conn, > return 0; > } > > -int qedi_iscsi_abort_work(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask) > +int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, struct iscsi_task > +*mtask) > { > + struct iscsi_tm *tmf_hdr = (struct iscsi_tm *)mtask->hdr; > + struct qedi_cmd *qedi_cmd = mtask->dd_data; > struct qedi_ctx *qedi = qedi_conn->qedi; > - struct iscsi_tm *tmf_hdr; > - struct qedi_cmd *qedi_cmd = (struct qedi_cmd *)mtask->dd_data; > - s16 tid = 0; > + int rc = 0; > > - tmf_hdr = (struct iscsi_tm *)mtask->hdr; > - qedi_cmd->task = mtask; > - > - /* If abort task then schedule the work and return */ > - if ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_ABORT_TASK) { > - qedi_cmd->state = CLEANUP_WAIT; > - INIT_WORK(&qedi_cmd->tmf_work, qedi_tmf_work); > + switch (tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) { > + case ISCSI_TM_FUNC_ABORT_TASK: > + INIT_WORK(&qedi_cmd->tmf_work, qedi_abort_work); > queue_work(qedi->tmf_thread, &qedi_cmd->tmf_work); > - > - } else if (((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) || > - ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_TARGET_WARM_RESET) || > - ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_TARGET_COLD_RESET)) { > - tid = qedi_get_task_idx(qedi); > - if (tid == -1) { > - QEDI_ERR(&qedi->dbg_ctx, "Invalid tid, cid=0x%x\n", > - qedi_conn->iscsi_conn_id); > - return -1; > - } > - qedi_cmd->task_id = tid; > - > - qedi_send_iscsi_tmf(qedi_conn, qedi_cmd->task); > - > - } else { > + break; > + case ISCSI_TM_FUNC_LOGICAL_UNIT_RESET: > + case ISCSI_TM_FUNC_TARGET_WARM_RESET: > + case ISCSI_TM_FUNC_TARGET_COLD_RESET: > + rc = send_iscsi_tmf(qedi_conn, mtask); > + break; > + default: > QEDI_ERR(&qedi->dbg_ctx, "Invalid tmf, cid=0x%x\n", > qedi_conn->iscsi_conn_id); > - return -1; > + return -EINVAL; > } > > - return 0; > + return rc; > } > > int qedi_send_iscsi_text(struct qedi_conn *qedi_conn, diff --git > a/drivers/scsi/qedi/qedi_gbl.h b/drivers/scsi/qedi/qedi_gbl.h index > 116645c08c71..fb44a282613e 100644 > --- a/drivers/scsi/qedi/qedi_gbl.h > +++ b/drivers/scsi/qedi/qedi_gbl.h > @@ -31,8 +31,7 @@ int qedi_send_iscsi_login(struct qedi_conn *qedi_conn, > struct iscsi_task *task); > int qedi_send_iscsi_logout(struct qedi_conn *qedi_conn, > struct iscsi_task *task); > -int qedi_iscsi_abort_work(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask); > +int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, struct iscsi_task > +*mtask); > int qedi_send_iscsi_text(struct qedi_conn *qedi_conn, > struct iscsi_task *task); > int qedi_send_iscsi_nopout(struct qedi_conn *qedi_conn, diff --git > a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c index > d1da34a938da..821225f9beb0 100644 > --- a/drivers/scsi/qedi/qedi_iscsi.c > +++ b/drivers/scsi/qedi/qedi_iscsi.c > @@ -742,7 +742,7 @@ static int qedi_iscsi_send_generic_request(struct > iscsi_task *task) > rc = qedi_send_iscsi_logout(qedi_conn, task); > break; > case ISCSI_OP_SCSI_TMFUNC: > - rc = qedi_iscsi_abort_work(qedi_conn, task); > + rc = qedi_send_iscsi_tmf(qedi_conn, task); > break; > case ISCSI_OP_TEXT: > rc = qedi_send_iscsi_text(qedi_conn, task); > -- > 2.25.1 Thanks, Reviewed-by: Manish Rangankar <mrangankar@marvell.com>
diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c index c5699421ec37..542255c94d96 100644 --- a/drivers/scsi/qedi/qedi_fw.c +++ b/drivers/scsi/qedi/qedi_fw.c @@ -14,8 +14,8 @@ #include "qedi_fw_iscsi.h" #include "qedi_fw_scsi.h" -static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, - struct iscsi_task *mtask); +static int send_iscsi_tmf(struct qedi_conn *qedi_conn, + struct iscsi_task *mtask); void qedi_iscsi_unmap_sg_list(struct qedi_cmd *cmd) { @@ -1350,7 +1350,7 @@ static int qedi_wait_for_cleanup_request(struct qedi_ctx *qedi, return 0; } -static void qedi_tmf_work(struct work_struct *work) +static void qedi_abort_work(struct work_struct *work) { struct qedi_cmd *qedi_cmd = container_of(work, struct qedi_cmd, tmf_work); @@ -1363,7 +1363,6 @@ static void qedi_tmf_work(struct work_struct *work) struct iscsi_task *ctask; struct iscsi_tm *tmf_hdr; s16 rval = 0; - s16 tid = 0; mtask = qedi_cmd->task; tmf_hdr = (struct iscsi_tm *)mtask->hdr; @@ -1404,6 +1403,7 @@ static void qedi_tmf_work(struct work_struct *work) } qedi_cmd->type = TYPEIO; + qedi_cmd->state = CLEANUP_WAIT; list_work->qedi_cmd = qedi_cmd; list_work->rtid = cmd->task_id; list_work->state = QEDI_WORK_SCHEDULED; @@ -1430,15 +1430,7 @@ static void qedi_tmf_work(struct work_struct *work) goto ldel_exit; } - tid = qedi_get_task_idx(qedi); - if (tid == -1) { - QEDI_ERR(&qedi->dbg_ctx, "Invalid tid, cid=0x%x\n", - qedi_conn->iscsi_conn_id); - goto ldel_exit; - } - - qedi_cmd->task_id = tid; - qedi_send_iscsi_tmf(qedi_conn, qedi_cmd->task); + send_iscsi_tmf(qedi_conn, qedi_cmd->task); put_task: iscsi_put_task(ctask); @@ -1468,8 +1460,7 @@ static void qedi_tmf_work(struct work_struct *work) clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags); } -static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, - struct iscsi_task *mtask) +static int send_iscsi_tmf(struct qedi_conn *qedi_conn, struct iscsi_task *mtask) { struct iscsi_tmf_request_hdr tmf_pdu_header; struct iscsi_task_params task_params; @@ -1484,7 +1475,6 @@ static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, u32 scsi_lun[2]; s16 tid = 0; u16 sq_idx = 0; - int rval = 0; tmf_hdr = (struct iscsi_tm *)mtask->hdr; qedi_cmd = (struct qedi_cmd *)mtask->dd_data; @@ -1548,10 +1538,7 @@ static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, task_params.sqe = &ep->sq[sq_idx]; memset(task_params.sqe, 0, sizeof(struct iscsi_wqe)); - rval = init_initiator_tmf_request_task(&task_params, - &tmf_pdu_header); - if (rval) - return -1; + init_initiator_tmf_request_task(&task_params, &tmf_pdu_header); spin_lock(&qedi_conn->list_lock); list_add_tail(&qedi_cmd->io_cmd, &qedi_conn->active_cmd_list); @@ -1563,47 +1550,30 @@ static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, return 0; } -int qedi_iscsi_abort_work(struct qedi_conn *qedi_conn, - struct iscsi_task *mtask) +int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, struct iscsi_task *mtask) { + struct iscsi_tm *tmf_hdr = (struct iscsi_tm *)mtask->hdr; + struct qedi_cmd *qedi_cmd = mtask->dd_data; struct qedi_ctx *qedi = qedi_conn->qedi; - struct iscsi_tm *tmf_hdr; - struct qedi_cmd *qedi_cmd = (struct qedi_cmd *)mtask->dd_data; - s16 tid = 0; + int rc = 0; - tmf_hdr = (struct iscsi_tm *)mtask->hdr; - qedi_cmd->task = mtask; - - /* If abort task then schedule the work and return */ - if ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == - ISCSI_TM_FUNC_ABORT_TASK) { - qedi_cmd->state = CLEANUP_WAIT; - INIT_WORK(&qedi_cmd->tmf_work, qedi_tmf_work); + switch (tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) { + case ISCSI_TM_FUNC_ABORT_TASK: + INIT_WORK(&qedi_cmd->tmf_work, qedi_abort_work); queue_work(qedi->tmf_thread, &qedi_cmd->tmf_work); - - } else if (((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == - ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) || - ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == - ISCSI_TM_FUNC_TARGET_WARM_RESET) || - ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == - ISCSI_TM_FUNC_TARGET_COLD_RESET)) { - tid = qedi_get_task_idx(qedi); - if (tid == -1) { - QEDI_ERR(&qedi->dbg_ctx, "Invalid tid, cid=0x%x\n", - qedi_conn->iscsi_conn_id); - return -1; - } - qedi_cmd->task_id = tid; - - qedi_send_iscsi_tmf(qedi_conn, qedi_cmd->task); - - } else { + break; + case ISCSI_TM_FUNC_LOGICAL_UNIT_RESET: + case ISCSI_TM_FUNC_TARGET_WARM_RESET: + case ISCSI_TM_FUNC_TARGET_COLD_RESET: + rc = send_iscsi_tmf(qedi_conn, mtask); + break; + default: QEDI_ERR(&qedi->dbg_ctx, "Invalid tmf, cid=0x%x\n", qedi_conn->iscsi_conn_id); - return -1; + return -EINVAL; } - return 0; + return rc; } int qedi_send_iscsi_text(struct qedi_conn *qedi_conn, diff --git a/drivers/scsi/qedi/qedi_gbl.h b/drivers/scsi/qedi/qedi_gbl.h index 116645c08c71..fb44a282613e 100644 --- a/drivers/scsi/qedi/qedi_gbl.h +++ b/drivers/scsi/qedi/qedi_gbl.h @@ -31,8 +31,7 @@ int qedi_send_iscsi_login(struct qedi_conn *qedi_conn, struct iscsi_task *task); int qedi_send_iscsi_logout(struct qedi_conn *qedi_conn, struct iscsi_task *task); -int qedi_iscsi_abort_work(struct qedi_conn *qedi_conn, - struct iscsi_task *mtask); +int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, struct iscsi_task *mtask); int qedi_send_iscsi_text(struct qedi_conn *qedi_conn, struct iscsi_task *task); int qedi_send_iscsi_nopout(struct qedi_conn *qedi_conn, diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c index d1da34a938da..821225f9beb0 100644 --- a/drivers/scsi/qedi/qedi_iscsi.c +++ b/drivers/scsi/qedi/qedi_iscsi.c @@ -742,7 +742,7 @@ static int qedi_iscsi_send_generic_request(struct iscsi_task *task) rc = qedi_send_iscsi_logout(qedi_conn, task); break; case ISCSI_OP_SCSI_TMFUNC: - rc = qedi_iscsi_abort_work(qedi_conn, task); + rc = qedi_send_iscsi_tmf(qedi_conn, task); break; case ISCSI_OP_TEXT: rc = qedi_send_iscsi_text(qedi_conn, task);
qedi_iscsi_abort_work and qedi_tmf_work allocates a tid then calls qedi_send_iscsi_tmf which also allcoates a tid. This removes the tid allocation from the callers. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/scsi/qedi/qedi_fw.c | 76 ++++++++++------------------------ drivers/scsi/qedi/qedi_gbl.h | 3 +- drivers/scsi/qedi/qedi_iscsi.c | 2 +- 3 files changed, 25 insertions(+), 56 deletions(-)