From: Muneendra <muneendra.kumar@broadcom.com>
To: linux-scsi@vger.kernel.org, hare@suse.de
Cc: jsmart2021@gmail.com, emilne@redhat.com, mkumar@redhat.com,
Muneendra <muneendra.kumar@broadcom.com>
Subject: [PATCH v2 5/8] scsi: Added routine to set/clear SCMD_NORETRIES_ABORT bit for outstanding io on scsi_dev
Date: Mon, 28 Sep 2020 10:20:54 +0530 [thread overview]
Message-ID: <1601268657-940-6-git-send-email-muneendra.kumar@broadcom.com> (raw)
In-Reply-To: <1601268657-940-1-git-send-email-muneendra.kumar@broadcom.com>
[-- Attachment #1: Type: text/plain, Size: 4102 bytes --]
Added a new routine scsi_chg_noretries_abort_io_device().
This functions accepts two arguments Scsi_device and an integer(set).
When set is passed as 1
this routine will set SCMD_NORETRIES_ABORT bit in
scmd->state for all the pending io's on the scsi device associated
with target port.
When set is passed as 0
This routine will clear SCMD_NORETRIES_ABORT bit in
scmd->state for all the pending io's on the scsi device associated
with target port.
Export the symbol so the routine can be called by scsi_transport_fc.c
Added new function declaration scsi_chg_noretries_abort_io_device in
scsi_priv.h
Signed-off-by: Muneendra <muneendra.kumar@broadcom.com>
---
v2:
Renamed the below functions as
scsi_set_noretries_abort_io_device ->scsi_chg_noretries_abort_io_device
__scsi_set_noretries_abort_io_device->__scsi_set_noretries_abort_io_device
which accepts the value as an arg to set/clear the SCMD_NORETRIES_ABORT bit
---
drivers/scsi/scsi_error.c | 76 +++++++++++++++++++++++++++++++++++++++
drivers/scsi/scsi_priv.h | 2 ++
2 files changed, 78 insertions(+)
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 3f14ea10d5da..c0943f08b469 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -271,6 +271,82 @@ void scsi_eh_scmd_add(struct scsi_cmnd *scmd)
call_rcu(&scmd->rcu, scsi_eh_inc_host_failed);
}
+static bool
+scsi_clear_noretries_abort_io(struct request *rq, void *priv, bool reserved)
+{
+ struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
+ struct scsi_device *sdev = scmd->device;
+
+ /* only clear SCMD_NORETRIES_ABORT on ios on a specific sdev */
+ if (sdev != priv)
+ return true;
+
+ /*Clear the SCMD_NORETRIES_ABORT bit*/
+ if (READ_ONCE(rq->state) == MQ_RQ_IN_FLIGHT)
+ clear_bit(SCMD_NORETRIES_ABORT, &scmd->state);
+ return true;
+}
+
+static bool
+scsi_set_noretries_abort_io(struct request *rq, void *priv, bool reserved)
+{
+ struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
+ struct scsi_device *sdev = scmd->device;
+
+ /* only set SCMD_NORETRIES_ABORT on ios on a specific sdev */
+ if (sdev != priv)
+ return true;
+ /* we don't want this command reissued on abort success
+ * so set SCMD_NORETRIES_ABORT bit to ensure it
+ * won't get reissued
+ */
+ if (READ_ONCE(rq->state) == MQ_RQ_IN_FLIGHT)
+ set_bit(SCMD_NORETRIES_ABORT, &scmd->state);
+ return true;
+}
+
+static int
+__scsi_chg_noretries_abort_io_device(struct scsi_device *sdev, int set)
+{
+
+ if (sdev->sdev_state != SDEV_RUNNING)
+ return -EINVAL;
+
+ if (blk_queue_init_done(sdev->request_queue)) {
+
+ blk_mq_quiesce_queue(sdev->request_queue);
+
+ if (set)
+ blk_mq_tagset_busy_iter(&sdev->host->tag_set,
+ scsi_set_noretries_abort_io, sdev);
+ else
+ blk_mq_tagset_busy_iter(&sdev->host->tag_set,
+ scsi_clear_noretries_abort_io, sdev);
+
+ blk_mq_unquiesce_queue(sdev->request_queue);
+ }
+ return 0;
+}
+
+/*
+ * scsi_chg_noretries_abort_io_device - set/clear the SCMD_NORETRIES_ABORT
+ * bit for all the pending io's on a device
+ * @sdev: scsi_device
+ * @set: indicates to clear (0) or set (1) the SCMD_NORETRIES_ABORT flag
+ */
+int
+scsi_chg_noretries_abort_io_device(struct scsi_device *sdev, int set)
+{
+ struct Scsi_Host *shost = sdev->host;
+ int ret = -EINVAL;
+
+ mutex_lock(&shost->scan_mutex);
+ ret = __scsi_chg_noretries_abort_io_device(sdev, set);
+ mutex_unlock(&shost->scan_mutex);
+ return ret;
+}
+EXPORT_SYMBOL(scsi_chg_noretries_abort_io_device);
+
/**
* scsi_times_out - Timeout function for normal scsi commands.
* @req: request that is timing out.
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
index d12ada035961..aba98a3294ce 100644
--- a/drivers/scsi/scsi_priv.h
+++ b/drivers/scsi/scsi_priv.h
@@ -81,6 +81,8 @@ void scsi_eh_ready_devs(struct Scsi_Host *shost,
int scsi_eh_get_sense(struct list_head *work_q,
struct list_head *done_q);
int scsi_noretry_cmd(struct scsi_cmnd *scmd);
+extern int scsi_chg_noretries_abort_io_device(struct scsi_device *sdev,
+ int set);
/* scsi_lib.c */
extern int scsi_maybe_unblock_host(struct scsi_device *sdev);
--
2.26.2
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4177 bytes --]
next prev parent reply other threads:[~2020-09-28 11:44 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-28 4:50 [PATCH v2 0/8] scsi: Support to handle Intermittent errors Muneendra
2020-09-28 4:50 ` [PATCH v2 1/8] scsi: Added a new definition in scsi_cmnd.h Muneendra
2020-09-30 9:17 ` Hannes Reinecke
2020-09-28 4:50 ` [PATCH v2 2/8] scsi: Added a new error code in scsi.h Muneendra
2020-09-30 9:17 ` Hannes Reinecke
2020-09-28 4:50 ` [PATCH v2 3/8] scsi: Clear state bit SCMD_NORETRIES_ABORT of scsi_cmd before start request Muneendra
2020-09-30 9:19 ` Hannes Reinecke
2020-09-28 4:50 ` [PATCH v2 4/8] scsi: No retries on abort success Muneendra
2020-09-30 9:27 ` Hannes Reinecke
2020-09-28 4:50 ` Muneendra [this message]
2020-09-30 9:26 ` [PATCH v2 5/8] scsi: Added routine to set/clear SCMD_NORETRIES_ABORT bit for outstanding io on scsi_dev Hannes Reinecke
2020-09-28 4:50 ` [PATCH v2 6/8] scsi_transport_fc: Added a new rport state FC_PORTSTATE_MARGINAL Muneendra
2020-09-30 9:30 ` Hannes Reinecke
2020-09-28 4:50 ` [PATCH v2 7/8] scsi_transport_fc: Added a new sysfs attribute port_state Muneendra
2020-09-30 9:33 ` Hannes Reinecke
2020-10-01 13:13 ` Muneendra Kumar M
2020-10-05 9:18 ` Muneendra Kumar M
2020-10-05 9:29 ` Hannes Reinecke
2020-10-07 7:14 ` Muneendra Kumar M
2020-10-02 16:26 ` Benjamin Block
2020-10-05 6:49 ` Hannes Reinecke
2020-10-05 8:41 ` Benjamin Block
2020-09-28 4:50 ` [PATCH v2 8/8] lpfc: Added support to handle marginal state Muneendra
2020-09-30 9:36 ` Hannes Reinecke
2020-09-30 11:33 ` Muneendra Kumar M
2020-09-30 11:50 ` Hannes Reinecke
2020-10-01 8:59 ` Muneendra Kumar M
2020-10-02 17:01 ` [PATCH v2 0/8] scsi: Support to handle Intermittent errors Mike Christie
2020-10-02 17:27 ` James Smart
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1601268657-940-6-git-send-email-muneendra.kumar@broadcom.com \
--to=muneendra.kumar@broadcom.com \
--cc=emilne@redhat.com \
--cc=hare@suse.de \
--cc=jsmart2021@gmail.com \
--cc=linux-scsi@vger.kernel.org \
--cc=mkumar@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox