Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1343029 > unrolled thread
| Started by | John Garry <john.garry@huawei.com> |
|---|---|
| First post | 2016-02-25 10:40 +0100 |
| Last post | 2016-03-01 03:10 +0100 |
| Articles | 4 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH v2 0/6] hisi_sas: add abort and retry feature John Garry <john.garry@huawei.com> - 2016-02-25 10:40 +0100
[PATCH v2 2/6] hisi_sas: add hisi_sas_slot_abort() John Garry <john.garry@huawei.com> - 2016-02-25 10:40 +0100
[PATCH v2 6/6] hisi_sas: update driver version to 1.3 John Garry <john.garry@huawei.com> - 2016-02-25 10:40 +0100
Re: [PATCH v2 0/6] hisi_sas: add abort and retry feature "Martin K. Petersen" <martin.petersen@oracle.com> - 2016-03-01 03:10 +0100
| From | John Garry <john.garry@huawei.com> |
|---|---|
| Date | 2016-02-25 10:40 +0100 |
| Subject | [PATCH v2 0/6] hisi_sas: add abort and retry feature |
| Message-ID | <r60pc-1Hh-19@gated-at.bofh.it> |
This patchset introduces support to abort certain commands which have failed and retry. Certain errors require that the command be retried, like TRANS_TX_CREDIT_TIMEOUT_ERR in v1 hw. However, when these errors occur the IO may still be in the device, so the IO must first be aborted, and then retried. The HiSilicon SAS controller has no FW to do this work, so it needs to be done manually. Differences to v1: - check for tmf success result removed - remove query for task prior to abort - add flag to slot structure for task abort - add removal of superflous debug statement John Garry (6): hisi_sas: change tmf func complete check hisi_sas: add hisi_sas_slot_abort() hisi_sas: use slot abort in v1 hw hisi_sas: use slot abort in v2 hw hisi_sas: add hisi_sas_slave_configure() hisi_sas: update driver version to 1.3 drivers/scsi/hisi_sas/hisi_sas.h | 4 ++- drivers/scsi/hisi_sas/hisi_sas_main.c | 59 ++++++++++++++++++++++++++++++++-- drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 13 ++++++++ drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 15 +++++++-- 4 files changed, 85 insertions(+), 6 deletions(-) -- 1.9.1
[toc] | [next] | [standalone]
| From | John Garry <john.garry@huawei.com> |
|---|---|
| Date | 2016-02-25 10:40 +0100 |
| Subject | [PATCH v2 2/6] hisi_sas: add hisi_sas_slot_abort() |
| Message-ID | <r60yS-1KA-25@gated-at.bofh.it> |
| In reply to | #1343029 |
Add a function to abort a slot (task) in the target
device and then cleanup and complete the task.
The function is called from work queue context as
it cannot be called from the context where it is
triggered (interrupt).
Flag hisi_sas_slot.abort is added as the flag used
in the slot error handler to indicate whether the
slot needs to be aborted in the sdev prior to
cleanup and finish.
Signed-off-by: John Garry <john.garry@huawei.com>
---
drivers/scsi/hisi_sas/hisi_sas.h | 2 ++
drivers/scsi/hisi_sas/hisi_sas_main.c | 42 +++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
index 02da7e4..c92e65b 100644
--- a/drivers/scsi/hisi_sas/hisi_sas.h
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
@@ -112,6 +112,7 @@ struct hisi_sas_slot {
int cmplt_queue;
int cmplt_queue_slot;
int idx;
+ int abort;
void *cmd_hdr;
dma_addr_t cmd_hdr_dma;
void *status_buffer;
@@ -120,6 +121,7 @@ struct hisi_sas_slot {
dma_addr_t command_table_dma;
struct hisi_sas_sge_page *sge_page;
dma_addr_t sge_page_dma;
+ struct work_struct abort_slot;
};
struct hisi_sas_tmf_task {
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index 58ca336..e51612f 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -15,6 +15,9 @@
#define DEV_IS_GONE(dev) \
((!dev) || (dev->dev_type == SAS_PHY_UNUSED))
+static int hisi_sas_debug_issue_ssp_tmf(struct domain_device *device,
+ u8 *lun, struct hisi_sas_tmf_task *tmf);
+
static struct hisi_hba *dev_to_hisi_hba(struct domain_device *device)
{
return device->port->ha->lldd_ha;
@@ -113,6 +116,44 @@ static int hisi_sas_task_prep_ata(struct hisi_hba *hisi_hba,
return hisi_hba->hw->prep_stp(hisi_hba, slot);
}
+/*
+ * This function will issue an abort TMF regardless of whether the
+ * task is in the sdev or not. Then it will do the task complete
+ * cleanup and callbacks.
+ */
+static void hisi_sas_slot_abort(struct work_struct *work)
+{
+ struct hisi_sas_slot *abort_slot =
+ container_of(work, struct hisi_sas_slot, abort_slot);
+ struct sas_task *task = abort_slot->task;
+ struct hisi_hba *hisi_hba = dev_to_hisi_hba(task->dev);
+ struct scsi_cmnd *cmnd = task->uldd_task;
+ struct hisi_sas_tmf_task tmf_task;
+ struct domain_device *device = task->dev;
+ struct hisi_sas_device *sas_dev = device->lldd_dev;
+ struct scsi_lun lun;
+ struct device *dev = &hisi_hba->pdev->dev;
+ int tag = abort_slot->idx;
+
+ if (!(task->task_proto & SAS_PROTOCOL_SSP)) {
+ dev_err(dev, "cannot abort slot for non-ssp task\n");
+ goto out;
+ }
+
+ int_to_scsilun(cmnd->device->lun, &lun);
+ tmf_task.tmf = TMF_ABORT_TASK;
+ tmf_task.tag_of_task_to_be_managed = cpu_to_le16(tag);
+
+ hisi_sas_debug_issue_ssp_tmf(task->dev, lun.scsi_lun, &tmf_task);
+out:
+ /* Do cleanup for this task */
+ hisi_sas_slot_task_free(hisi_hba, task, abort_slot);
+ if (task->task_done)
+ task->task_done(task);
+ if (sas_dev && sas_dev->running_req)
+ sas_dev->running_req--;
+}
+
static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
int is_tmf, struct hisi_sas_tmf_task *tmf,
int *pass)
@@ -206,6 +247,7 @@ static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
slot->task = task;
slot->port = port;
task->lldd_task = slot;
+ INIT_WORK(&slot->abort_slot, hisi_sas_slot_abort);
slot->status_buffer = dma_pool_alloc(hisi_hba->status_buffer_pool,
GFP_ATOMIC,
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | John Garry <john.garry@huawei.com> |
|---|---|
| Date | 2016-02-25 10:40 +0100 |
| Subject | [PATCH v2 6/6] hisi_sas: update driver version to 1.3 |
| Message-ID | <r60yS-1KA-27@gated-at.bofh.it> |
| In reply to | #1343029 |
Signed-off-by: John Garry <john.garry@huawei.com> --- drivers/scsi/hisi_sas/hisi_sas.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h index c92e65b..29e89f3 100644 --- a/drivers/scsi/hisi_sas/hisi_sas.h +++ b/drivers/scsi/hisi_sas/hisi_sas.h @@ -23,7 +23,7 @@ #include <scsi/sas_ata.h> #include <scsi/libsas.h> -#define DRV_VERSION "v1.2" +#define DRV_VERSION "v1.3" #define HISI_SAS_MAX_PHYS 9 #define HISI_SAS_MAX_QUEUES 32 -- 1.9.1
[toc] | [prev] | [next] | [standalone]
| From | "Martin K. Petersen" <martin.petersen@oracle.com> |
|---|---|
| Date | 2016-03-01 03:10 +0100 |
| Message-ID | <r7HV7-2Mh-1@gated-at.bofh.it> |
| In reply to | #1343029 |
>>>>> "John" == John Garry <john.garry@huawei.com> writes: John> This patchset introduces support to abort certain commands which John> have failed and retry. Certain errors require that the command be John> retried, like TRANS_TX_CREDIT_TIMEOUT_ERR in v1 hw. However, when John> these errors occur the IO may still be in the device, so the IO John> must first be aborted, and then retried. The HiSilicon SAS John> controller has no FW to do this work, so it needs to be done John> manually. Applied to 4.6/scsi-queue. -- Martin K. Petersen Oracle Linux Engineering
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web