This is a follow-on from the series to factor out the TMF code shared
between libsas LLDDs.
The hisi_sas and pm8001 have an internal abort feature to abort pending
commands in the host controller, prior to being sent to the target. The
driver support implementation is naturally quite similar, so factor it
out.
Again, testing and review would be appreciated.
This is based on mkp-scsi 5.18 staging queue @ commit f2ddbbea7780
John Garry (4):
scsi: libsas: Add sas_execute_internal_abort_single()
scsi: libsas: Add sas_execute_internal_abort_dev()
scsi: pm8001: Use libsas internal abort support
scsi: hisi_sas: Use libsas internal abort support
drivers/scsi/hisi_sas/hisi_sas.h | 8 +-
drivers/scsi/hisi_sas/hisi_sas_main.c | 453 +++++++++----------------
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 11 +-
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 18 +-
drivers/scsi/libsas/sas_scsi_host.c | 89 +++++
drivers/scsi/pm8001/pm8001_hwi.c | 27 +-
drivers/scsi/pm8001/pm8001_hwi.h | 5 -
drivers/scsi/pm8001/pm8001_sas.c | 186 ++++------
drivers/scsi/pm8001/pm8001_sas.h | 6 +-
drivers/scsi/pm8001/pm80xx_hwi.h | 5 -
include/scsi/libsas.h | 24 ++
include/scsi/sas.h | 2 +
12 files changed, 368 insertions(+), 466 deletions(-)
--
2.26.2
On 2022/03/03 14:18, John Garry wrote:
> This is a follow-on from the series to factor out the TMF code shared
> between libsas LLDDs.
>
> The hisi_sas and pm8001 have an internal abort feature to abort pending
> commands in the host controller, prior to being sent to the target. The
> driver support implementation is naturally quite similar, so factor it
> out.
>
> Again, testing and review would be appreciated.
John,
Traveling this week so testing will be difficult. I will try this first thing
Monday next week.
>
> This is based on mkp-scsi 5.18 staging queue @ commit f2ddbbea7780
>
> John Garry (4):
> scsi: libsas: Add sas_execute_internal_abort_single()
> scsi: libsas: Add sas_execute_internal_abort_dev()
> scsi: pm8001: Use libsas internal abort support
> scsi: hisi_sas: Use libsas internal abort support
>
> drivers/scsi/hisi_sas/hisi_sas.h | 8 +-
> drivers/scsi/hisi_sas/hisi_sas_main.c | 453 +++++++++----------------
> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 11 +-
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 18 +-
> drivers/scsi/libsas/sas_scsi_host.c | 89 +++++
> drivers/scsi/pm8001/pm8001_hwi.c | 27 +-
> drivers/scsi/pm8001/pm8001_hwi.h | 5 -
> drivers/scsi/pm8001/pm8001_sas.c | 186 ++++------
> drivers/scsi/pm8001/pm8001_sas.h | 6 +-
> drivers/scsi/pm8001/pm80xx_hwi.h | 5 -
> include/scsi/libsas.h | 24 ++
> include/scsi/sas.h | 2 +
> 12 files changed, 368 insertions(+), 466 deletions(-)
>
--
Damien Le Moal
Western Digital Research
Add support for a "device" variant of internal abort, which will abort all
pending IOs for a specific device.
Signed-off-by: John Garry <[email protected]>
---
drivers/scsi/libsas/sas_scsi_host.c | 8 ++++++++
include/scsi/libsas.h | 8 ++++++++
2 files changed, 16 insertions(+)
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 0d05826e6e8c..8d6c83d15148 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -995,6 +995,14 @@ int sas_execute_internal_abort_single(struct domain_device *device, u16 tag,
}
EXPORT_SYMBOL_GPL(sas_execute_internal_abort_single);
+int sas_execute_internal_abort_dev(struct domain_device *device,
+ unsigned int qid, void *data)
+{
+ return sas_execute_internal_abort(device, SAS_INTERNAL_ABORT_DEV,
+ SCSI_NO_TAG, qid, data);
+}
+EXPORT_SYMBOL_GPL(sas_execute_internal_abort_dev);
+
int sas_execute_tmf(struct domain_device *device, void *parameter,
int para_len, int force_phy_id,
struct sas_tmf_task *tmf)
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
index 2d30d57916e5..71f632b2d2bd 100644
--- a/include/scsi/libsas.h
+++ b/include/scsi/libsas.h
@@ -560,6 +560,7 @@ struct sas_ata_task {
/* LLDDs rely on these values */
enum sas_internal_abort {
SAS_INTERNAL_ABORT_SINGLE = 0,
+ SAS_INTERNAL_ABORT_DEV = 1,
};
struct sas_internal_abort_task {
@@ -641,6 +642,11 @@ extern struct sas_task *sas_alloc_task(gfp_t flags);
extern struct sas_task *sas_alloc_slow_task(gfp_t flags);
extern void sas_free_task(struct sas_task *task);
+static inline bool sas_is_internal_abort(struct sas_task *task)
+{
+ return task->task_proto == SAS_PROTOCOL_INTERNAL_ABORT;
+}
+
struct sas_domain_function_template {
/* The class calls these to notify the LLDD of an event. */
void (*lldd_port_formed)(struct asd_sas_phy *);
@@ -697,6 +703,8 @@ extern int sas_bios_param(struct scsi_device *, struct block_device *,
int sas_execute_internal_abort_single(struct domain_device *device,
u16 tag, unsigned int qid,
void *data);
+int sas_execute_internal_abort_dev(struct domain_device *device,
+ unsigned int qid, void *data);
extern struct scsi_transport_template *
sas_domain_attach_transport(struct sas_domain_function_template *);
extern struct device_attribute dev_attr_phy_event_threshold;
--
2.26.2
On 03/03/2022 16:29, Damien Le Moal wrote:
> Traveling this week so testing will be difficult. I will try this first thing
> Monday next week.
>
>> This is based on mkp-scsi 5.18 staging queue @ commit f2ddbbea7780
Much appreciated!
Thanks,
john
On 3/3/22 21:18, John Garry wrote:
> This is a follow-on from the series to factor out the TMF code shared
> between libsas LLDDs.
>
> The hisi_sas and pm8001 have an internal abort feature to abort pending
> commands in the host controller, prior to being sent to the target. The
> driver support implementation is naturally quite similar, so factor it
> out.
>
> Again, testing and review would be appreciated.
I ran my usual set of tests with fio and also libzbc tests to exercise
the failure/abort path. No problems detected. All good to me.
Feel free to add:
Tested-by: Damien Le Moal <[email protected]>
To your V2 with the cosmetic fixes.
>
> This is based on mkp-scsi 5.18 staging queue @ commit f2ddbbea7780
>
> John Garry (4):
> scsi: libsas: Add sas_execute_internal_abort_single()
> scsi: libsas: Add sas_execute_internal_abort_dev()
> scsi: pm8001: Use libsas internal abort support
> scsi: hisi_sas: Use libsas internal abort support
>
> drivers/scsi/hisi_sas/hisi_sas.h | 8 +-
> drivers/scsi/hisi_sas/hisi_sas_main.c | 453 +++++++++----------------
> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 11 +-
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 18 +-
> drivers/scsi/libsas/sas_scsi_host.c | 89 +++++
> drivers/scsi/pm8001/pm8001_hwi.c | 27 +-
> drivers/scsi/pm8001/pm8001_hwi.h | 5 -
> drivers/scsi/pm8001/pm8001_sas.c | 186 ++++------
> drivers/scsi/pm8001/pm8001_sas.h | 6 +-
> drivers/scsi/pm8001/pm80xx_hwi.h | 5 -
> include/scsi/libsas.h | 24 ++
> include/scsi/sas.h | 2 +
> 12 files changed, 368 insertions(+), 466 deletions(-)
>
--
Damien Le Moal
Western Digital Research
On 3/3/22 13:18, John Garry wrote:
> Add support for a "device" variant of internal abort, which will abort all
> pending IOs for a specific device.
>
> Signed-off-by: John Garry <[email protected]>
> ---
> drivers/scsi/libsas/sas_scsi_host.c | 8 ++++++++
> include/scsi/libsas.h | 8 ++++++++
> 2 files changed, 16 insertions(+)
>
> diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
> index 0d05826e6e8c..8d6c83d15148 100644
> --- a/drivers/scsi/libsas/sas_scsi_host.c
> +++ b/drivers/scsi/libsas/sas_scsi_host.c
> @@ -995,6 +995,14 @@ int sas_execute_internal_abort_single(struct domain_device *device, u16 tag,
> }
> EXPORT_SYMBOL_GPL(sas_execute_internal_abort_single);
>
> +int sas_execute_internal_abort_dev(struct domain_device *device,
> + unsigned int qid, void *data)
> +{
> + return sas_execute_internal_abort(device, SAS_INTERNAL_ABORT_DEV,
> + SCSI_NO_TAG, qid, data);
> +}
> +EXPORT_SYMBOL_GPL(sas_execute_internal_abort_dev);
> +
> int sas_execute_tmf(struct domain_device *device, void *parameter,
> int para_len, int force_phy_id,
> struct sas_tmf_task *tmf)
> diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
> index 2d30d57916e5..71f632b2d2bd 100644
> --- a/include/scsi/libsas.h
> +++ b/include/scsi/libsas.h
> @@ -560,6 +560,7 @@ struct sas_ata_task {
> /* LLDDs rely on these values */
> enum sas_internal_abort {
> SAS_INTERNAL_ABORT_SINGLE = 0,
> + SAS_INTERNAL_ABORT_DEV = 1,
> };
>
> struct sas_internal_abort_task {
> @@ -641,6 +642,11 @@ extern struct sas_task *sas_alloc_task(gfp_t flags);
> extern struct sas_task *sas_alloc_slow_task(gfp_t flags);
> extern void sas_free_task(struct sas_task *task);
>
> +static inline bool sas_is_internal_abort(struct sas_task *task)
> +{
> + return task->task_proto == SAS_PROTOCOL_INTERNAL_ABORT;
> +}
> +
> struct sas_domain_function_template {
> /* The class calls these to notify the LLDD of an event. */
> void (*lldd_port_formed)(struct asd_sas_phy *);
> @@ -697,6 +703,8 @@ extern int sas_bios_param(struct scsi_device *, struct block_device *,
> int sas_execute_internal_abort_single(struct domain_device *device,
> u16 tag, unsigned int qid,
> void *data);
> +int sas_execute_internal_abort_dev(struct domain_device *device,
> + unsigned int qid, void *data);
> extern struct scsi_transport_template *
> sas_domain_attach_transport(struct sas_domain_function_template *);
> extern struct device_attribute dev_attr_phy_event_threshold;
Same comment as in the previous patch: Please use the existing TMF_XXX
values.
Cheers,
Hannes
--
Dr. Hannes Reinecke Kernel Storage Architect
[email protected] +49 911 74053 688
SUSE Software Solutions Germany GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), GF: Felix Imendörffer