From: Hannes Reinecke <hare@suse.de>
To: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>,
James Bottomley <james.bottomley@hansenpartnership.com>,
Bart van Assche <bvanassche@acm.org>,
Don Brace <don.brace@microchip.com>,
John Garry <john.garry@huawei.com>,
linux-scsi@vger.kernel.org, Hannes Reinecke <hare@suse.de>
Subject: [PATCH 22/22] aacraid: use scsi_host_busy_iter() to traverse outstanding commands
Date: Mon, 29 Jun 2020 09:20:21 +0200 [thread overview]
Message-ID: <20200629072021.9864-23-hare@suse.de> (raw)
In-Reply-To: <20200629072021.9864-1-hare@suse.de>
Instead of walking the array of potential commands and trying to figure out
which one might be pending the driver should be using
scsi_host_busy_iter() to traverse all outstanding commands.
And for command abort we can now lookup the fibs directly as we now have
a 1:1 mapping between request tags and fibs.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
drivers/scsi/aacraid/commsup.c | 49 ++++++++-------
drivers/scsi/aacraid/linit.c | 131 ++++++++++++++++++-----------------------
2 files changed, 84 insertions(+), 96 deletions(-)
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index f177b4d2565b..8ef3973ab0d5 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -1459,6 +1459,32 @@ static void aac_schedule_bus_scan(struct aac_dev *aac)
aac_schedule_src_reinit_aif_worker(aac);
}
+static bool aac_close_sync_fib_iter(struct scsi_cmnd *command, void *data,
+ bool reserved)
+{
+ struct Scsi_Host *host = command->device->host;
+ struct aac_dev *aac = (struct aac_dev *)host->hostdata;
+ struct fib *fib = &aac->fibs[command->request->tag];
+ int *retval = data;
+ __le32 XferState = fib->hw_fib_va->header.XferState;
+ bool is_response_expected = false;
+
+ if (!(XferState & cpu_to_le32(NoResponseExpected | Async)) &&
+ (XferState & cpu_to_le32(ResponseExpected)))
+ is_response_expected = true;
+
+ if (is_response_expected
+ || fib->flags & FIB_CONTEXT_FLAG_WAIT) {
+ unsigned long flagv;
+ spin_lock_irqsave(&fib->event_lock, flagv);
+ complete(&fib->event_wait);
+ spin_unlock_irqrestore(&fib->event_lock, flagv);
+ schedule();
+ *retval = 0;
+ }
+ return true;
+}
+
static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
{
int index, quirks;
@@ -1467,7 +1493,6 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
int jafo = 0;
int bled;
u64 dmamask;
- int num_of_fibs = 0;
/*
* Assumptions:
@@ -1501,27 +1526,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
* Loop through the fibs, close the synchronous FIBS
*/
retval = 1;
- num_of_fibs = aac->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB;
- for (index = 0; index < num_of_fibs; index++) {
-
- struct fib *fib = &aac->fibs[index];
- __le32 XferState = fib->hw_fib_va->header.XferState;
- bool is_response_expected = false;
-
- if (!(XferState & cpu_to_le32(NoResponseExpected | Async)) &&
- (XferState & cpu_to_le32(ResponseExpected)))
- is_response_expected = true;
-
- if (is_response_expected
- || fib->flags & FIB_CONTEXT_FLAG_WAIT) {
- unsigned long flagv;
- spin_lock_irqsave(&fib->event_lock, flagv);
- complete(&fib->event_wait);
- spin_unlock_irqrestore(&fib->event_lock, flagv);
- schedule();
- retval = 0;
- }
- }
+ scsi_host_busy_iter(host, aac_close_sync_fib_iter, &retval);
/* Give some extra time for ioctls to complete. */
if (retval == 0)
ssleep(2);
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 9b3d8016e8ef..9c9465476d4d 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -680,7 +680,8 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
struct scsi_device * dev = cmd->device;
struct Scsi_Host * host = dev->host;
struct aac_dev * aac = (struct aac_dev *)host->hostdata;
- int count, found;
+ struct fib *fib;
+ int count;
u32 bus, cid;
int ret = FAILED;
@@ -690,26 +691,20 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd);
if (aac->hba_map[bus][cid].devtype == AAC_DEVTYPE_NATIVE_RAW) {
- struct fib *fib;
struct aac_hba_tm_req *tmf;
int status;
u64 address;
pr_err("%s: Host adapter abort request (%d,%d,%d,%d)\n",
- AAC_DRIVERNAME,
- host->host_no, sdev_channel(dev), sdev_id(dev), (int)dev->lun);
-
- found = 0;
- for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
- fib = &aac->fibs[count];
- if (*(u8 *)fib->hw_fib_va != 0 &&
- (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) &&
- (fib->callback_data == cmd)) {
- found = 1;
- break;
- }
- }
- if (!found)
+ AAC_DRIVERNAME, host->host_no,
+ sdev_channel(dev), sdev_id(dev), (int)dev->lun);
+
+ fib = &aac->fibs[cmd->request->tag];
+ if (*(u8 *)fib->hw_fib_va != 0 &&
+ (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) &&
+ (fib->callback_data == cmd))
+ ret = SUCCESS;
+ if (ret == FAILED)
return ret;
/* start a HBA_TMF_ABORT_TASK TMF request */
@@ -771,20 +766,13 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
* Mark associated FIB to not complete,
* eh handler does this
*/
- for (count = 0;
- count < (host->can_queue + AAC_NUM_MGT_FIB);
- ++count) {
- struct fib *fib = &aac->fibs[count];
-
- if (fib->hw_fib_va->header.XferState &&
- (fib->flags & FIB_CONTEXT_FLAG) &&
- (fib->callback_data == cmd)) {
- fib->flags |=
- FIB_CONTEXT_FLAG_TIMED_OUT;
- cmd->SCp.phase =
- AAC_OWNER_ERROR_HANDLER;
- ret = SUCCESS;
- }
+ fib = &aac->fibs[cmd->request->tag];
+ if (fib->hw_fib_va->header.XferState &&
+ (fib->flags & FIB_CONTEXT_FLAG) &&
+ (fib->callback_data == cmd)) {
+ fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
+ cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
+ ret = SUCCESS;
}
break;
case TEST_UNIT_READY:
@@ -792,27 +780,14 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
* Mark associated FIB to not complete,
* eh handler does this
*/
- for (count = 0;
- count < (host->can_queue + AAC_NUM_MGT_FIB);
- ++count) {
- struct scsi_cmnd *command;
- struct fib *fib = &aac->fibs[count];
-
- command = fib->callback_data;
-
- if ((fib->hw_fib_va->header.XferState &
- cpu_to_le32
- (Async | NoResponseExpected)) &&
- (fib->flags & FIB_CONTEXT_FLAG) &&
- ((command)) &&
- (command->device == cmd->device)) {
- fib->flags |=
- FIB_CONTEXT_FLAG_TIMED_OUT;
- command->SCp.phase =
- AAC_OWNER_ERROR_HANDLER;
- if (command == cmd)
- ret = SUCCESS;
- }
+ fib = &aac->fibs[cmd->request->tag];
+ if ((fib->hw_fib_va->header.XferState &
+ cpu_to_le32(Async | NoResponseExpected)) &&
+ (fib->flags & FIB_CONTEXT_FLAG) &&
+ (fib->callback_data == cmd)) {
+ fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
+ cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
+ ret = SUCCESS;
}
break;
}
@@ -1020,6 +995,36 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
return ret;
}
+static bool aac_eh_bus_reset_iter(struct scsi_cmnd *cmd, void *data,
+ bool reserved)
+{
+ struct Scsi_Host *host = cmd->device->host;
+ struct aac_dev *aac = (struct aac_dev *)host->hostdata;
+ struct fib *fib = &aac->fibs[cmd->request->tag];
+ int *cmd_bus = data;
+
+ if (fib->hw_fib_va->header.XferState &&
+ (fib->flags & FIB_CONTEXT_FLAG) &&
+ (fib->flags & FIB_CONTEXT_FLAG_SCSI_CMD)) {
+ struct aac_hba_map_info *info;
+ u32 bus, cid;
+
+ if (cmd != (struct scsi_cmnd *)fib->callback_data)
+ return true;
+ bus = aac_logical_to_phys(scmd_channel(cmd));
+ if (bus != *cmd_bus)
+ return true;
+ cid = scmd_id(cmd);
+ info = &aac->hba_map[bus][cid];
+ if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||
+ info->devtype != AAC_DEVTYPE_NATIVE_RAW) {
+ fib->flags |= FIB_CONTEXT_FLAG_EH_RESET;
+ cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
+ }
+ }
+ return true;
+}
+
/*
* aac_eh_bus_reset - Bus reset command handling
* @scsi_cmd: SCSI command block causing the reset
@@ -1037,29 +1042,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd)
cmd_bus = aac_logical_to_phys(scmd_channel(cmd));
/* Mark the assoc. FIB to not complete, eh handler does this */
- for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
- struct fib *fib = &aac->fibs[count];
-
- if (fib->hw_fib_va->header.XferState &&
- (fib->flags & FIB_CONTEXT_FLAG) &&
- (fib->flags & FIB_CONTEXT_FLAG_SCSI_CMD)) {
- struct aac_hba_map_info *info;
- u32 bus, cid;
-
- cmd = (struct scsi_cmnd *)fib->callback_data;
- bus = aac_logical_to_phys(scmd_channel(cmd));
- if (bus != cmd_bus)
- continue;
- cid = scmd_id(cmd);
- info = &aac->hba_map[bus][cid];
- if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||
- info->devtype != AAC_DEVTYPE_NATIVE_RAW) {
- fib->flags |= FIB_CONTEXT_FLAG_EH_RESET;
- cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
- }
- }
- }
-
+ scsi_host_busy_iter(host, aac_eh_bus_reset_iter, &cmd_bus);
pr_err("%s: Host bus reset request. SCSI hang ?\n", AAC_DRIVERNAME);
/*
--
2.16.4
next prev parent reply other threads:[~2020-06-29 19:22 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-29 7:19 [PATCHv5 00/22] scsi: enable reserved commands for LLDDs Hannes Reinecke
2020-06-29 7:20 ` [PATCH 01/22] scsi: drop gdth driver Hannes Reinecke
2020-06-29 7:20 ` [PATCH 02/22] block: add flag for internal commands Hannes Reinecke
2020-06-29 7:20 ` [PATCH 03/22] scsi: add scsi_{get,put}_internal_cmd() helper Hannes Reinecke
2020-06-29 12:48 ` John Garry
2020-07-02 7:59 ` Hannes Reinecke
2020-07-02 8:21 ` Johannes Thumshirn
2020-07-06 7:51 ` John Garry
2020-06-29 7:20 ` [PATCH 04/22] fnic: use internal commands Hannes Reinecke
2020-06-29 7:20 ` [PATCH 05/22] fnic: use scsi_host_busy_iter() to traverse commands Hannes Reinecke
2020-06-29 7:20 ` [PATCH 06/22] fnic: check for started requests in fnic_wq_copy_cleanup_handler() Hannes Reinecke
2020-06-29 7:20 ` [PATCH 07/22] csiostor: use internal command for LUN reset Hannes Reinecke
2020-06-29 13:51 ` John Garry
2020-06-29 14:59 ` Hannes Reinecke
2020-06-29 7:20 ` [PATCH 08/22] scsi: implement reserved command handling Hannes Reinecke
2020-06-29 14:11 ` John Garry
2020-06-29 7:20 ` [PATCH 09/22] scsi: use real inquiry data when initialising devices Hannes Reinecke
2020-06-29 7:20 ` [PATCH 10/22] scsi: Use dummy inquiry data for the host device Hannes Reinecke
2020-06-29 7:20 ` [PATCH 11/22] scsi: revamp host device handling Hannes Reinecke
2020-06-29 7:20 ` [PATCH 12/22] snic: use reserved commands Hannes Reinecke
2020-06-29 7:20 ` [PATCH 13/22] snic: use tagset iter for traversing commands Hannes Reinecke
2020-06-29 7:20 ` [PATCH 14/22] snic: check for started requests in snic_hba_reset_cmpl_handler() Hannes Reinecke
2020-06-29 7:20 ` [PATCH 15/22] hpsa: move hpsa_hba_inquiry after scsi_add_host() Hannes Reinecke
2020-06-29 7:20 ` [PATCH 16/22] hpsa: use reserved commands Hannes Reinecke
2020-06-29 7:20 ` [PATCH 17/22] hpsa: use scsi_host_busy_iter() to traverse outstanding commands Hannes Reinecke
2020-06-29 7:20 ` [PATCH 18/22] hpsa: drop refcount field from CommandList Hannes Reinecke
2020-06-29 7:20 ` [PATCH 19/22] aacraid: move scsi_add_host() Hannes Reinecke
2020-06-29 7:20 ` [PATCH 20/22] aacraid: store target id in host_scribble Hannes Reinecke
2020-06-29 7:20 ` [PATCH 21/22] aacraid: use scsi_get_internal_cmd() Hannes Reinecke
2020-06-29 13:08 ` John Garry
2020-06-29 14:51 ` Hannes Reinecke
2020-06-29 7:20 ` Hannes Reinecke [this message]
-- strict thread matches above, loose matches on Subject: below --
2020-06-25 14:01 [PATCHv4 00/22] scsi: enable reserved commands for LLDDs Hannes Reinecke
2020-06-25 14:01 ` [PATCH 22/22] aacraid: use scsi_host_busy_iter() to traverse outstanding commands Hannes Reinecke
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=20200629072021.9864-23-hare@suse.de \
--to=hare@suse.de \
--cc=bvanassche@acm.org \
--cc=don.brace@microchip.com \
--cc=hch@lst.de \
--cc=james.bottomley@hansenpartnership.com \
--cc=john.garry@huawei.com \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.