2022-12-16 04:29:16

by Xingui Yang

[permalink] [raw]
Subject: [PATCH] scsi: libsas: Directly kick-off EH when ATA device fell off

If the ATA device fell off, call sas_ata_device_link_abort() directly and
mark all outstanding QCs as failed and kick-off EH Immediately. This avoids
having to wait for block layer timeouts.

Signed-off-by: Xingui Yang <[email protected]>
---
drivers/scsi/libsas/sas_discover.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
index d5bc1314c341..bd22741daa99 100644
--- a/drivers/scsi/libsas/sas_discover.c
+++ b/drivers/scsi/libsas/sas_discover.c
@@ -362,6 +362,11 @@ static void sas_destruct_ports(struct asd_sas_port *port)

void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
{
+ if (test_bit(SAS_DEV_GONE, &dev->state) &&
+ (dev->dev_type == SAS_SATA_DEV ||
+ (dev->tproto & SAS_PROTOCOL_STP)))
+ sas_ata_device_link_abort(dev, false);
+
if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
!list_empty(&dev->disco_list_node)) {
/* this rphy never saw sas_rphy_add */
--
2.17.1


2022-12-16 04:56:25

by Jason Yan

[permalink] [raw]
Subject: Re: [PATCH] scsi: libsas: Directly kick-off EH when ATA device fell off

Hi Xingui,

On 2022/12/16 11:29, Xingui Yang wrote:
> If the ATA device fell off, call sas_ata_device_link_abort() directly and
> mark all outstanding QCs as failed and kick-off EH Immediately. This avoids
> having to wait for block layer timeouts.
>

Why does ATA device need this special operation? SAS device does not
have to wait for block layer timeouts?

Thanks,
Jason

> Signed-off-by: Xingui Yang <[email protected]>
> ---
> drivers/scsi/libsas/sas_discover.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
> index d5bc1314c341..bd22741daa99 100644
> --- a/drivers/scsi/libsas/sas_discover.c
> +++ b/drivers/scsi/libsas/sas_discover.c
> @@ -362,6 +362,11 @@ static void sas_destruct_ports(struct asd_sas_port *port)
>
> void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
> {
> + if (test_bit(SAS_DEV_GONE, &dev->state) &&
> + (dev->dev_type == SAS_SATA_DEV ||
> + (dev->tproto & SAS_PROTOCOL_STP)))
> + sas_ata_device_link_abort(dev, false);
> +
> if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
> !list_empty(&dev->disco_list_node)) {
> /* this rphy never saw sas_rphy_add */
>

2022-12-16 08:34:36

by Xingui Yang

[permalink] [raw]
Subject: Re: [PATCH] scsi: libsas: Directly kick-off EH when ATA device fell off



On 2022/12/16 11:53, Jason Yan wrote:
> Hi Xingui,
>
> On 2022/12/16 11:29, Xingui Yang wrote:
>> If the ATA device fell off, call sas_ata_device_link_abort() directly and
>> mark all outstanding QCs as failed and kick-off EH Immediately. This
>> avoids
>> having to wait for block layer timeouts.
>>
>
> Why does ATA device need this special operation? SAS device does not
> have to wait for block layer timeouts?
Hi Jason,
Applications that depend on I/O return may be blocked for 30 seconds,
and this can be optimized for SATA disks.

Different from SATA disks, I/Os on SAS disks can still be returned if
they are quickly plugged in after the SAS disks fall off. So I'm not
sure if this is appropriate for a sas disk.
BTW, I wish the sas disk did the same.

Thanks,
Xingui
>
> Thanks,
> Jason
>
>> Signed-off-by: Xingui Yang <[email protected]>
>> ---
>>   drivers/scsi/libsas/sas_discover.c | 5 +++++
>>   1 file changed, 5 insertions(+)
>>
>> diff --git a/drivers/scsi/libsas/sas_discover.c
>> b/drivers/scsi/libsas/sas_discover.c
>> index d5bc1314c341..bd22741daa99 100644
>> --- a/drivers/scsi/libsas/sas_discover.c
>> +++ b/drivers/scsi/libsas/sas_discover.c
>> @@ -362,6 +362,11 @@ static void sas_destruct_ports(struct
>> asd_sas_port *port)
>>   void sas_unregister_dev(struct asd_sas_port *port, struct
>> domain_device *dev)
>>   {
>> +    if (test_bit(SAS_DEV_GONE, &dev->state) &&
>> +        (dev->dev_type == SAS_SATA_DEV ||
>> +        (dev->tproto & SAS_PROTOCOL_STP)))
>> +        sas_ata_device_link_abort(dev, false);
>> +
>>       if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
>>           !list_empty(&dev->disco_list_node)) {
>>           /* this rphy never saw sas_rphy_add */
>>
> .

2022-12-16 10:18:13

by Jason Yan

[permalink] [raw]
Subject: Re: [PATCH] scsi: libsas: Directly kick-off EH when ATA device fell off

On 2022/12/16 11:29, Xingui Yang wrote:
> If the ATA device fell off, call sas_ata_device_link_abort() directly and
> mark all outstanding QCs as failed and kick-off EH Immediately. This avoids
> having to wait for block layer timeouts.
>
> Signed-off-by: Xingui Yang <[email protected]>
> ---
> drivers/scsi/libsas/sas_discover.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
> index d5bc1314c341..bd22741daa99 100644
> --- a/drivers/scsi/libsas/sas_discover.c
> +++ b/drivers/scsi/libsas/sas_discover.c
> @@ -362,6 +362,11 @@ static void sas_destruct_ports(struct asd_sas_port *port)
>
> void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
> {
> + if (test_bit(SAS_DEV_GONE, &dev->state) &&
> + (dev->dev_type == SAS_SATA_DEV ||
> + (dev->tproto & SAS_PROTOCOL_STP)))

dev_is_sata() would be better here.

Thanks,
Jason

> + sas_ata_device_link_abort(dev, false);
> +
> if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
> !list_empty(&dev->disco_list_node)) {
> /* this rphy never saw sas_rphy_add */
>

2022-12-16 10:22:19

by Xingui Yang

[permalink] [raw]
Subject: Re: [PATCH] scsi: libsas: Directly kick-off EH when ATA device fell off



On 2022/12/16 17:29, Jason Yan wrote:
> On 2022/12/16 11:29, Xingui Yang wrote:
>> If the ATA device fell off, call sas_ata_device_link_abort() directly and
>> mark all outstanding QCs as failed and kick-off EH Immediately. This
>> avoids
>> having to wait for block layer timeouts.
>>
>> Signed-off-by: Xingui Yang <[email protected]>
>> ---
>>   drivers/scsi/libsas/sas_discover.c | 5 +++++
>>   1 file changed, 5 insertions(+)
>>
>> diff --git a/drivers/scsi/libsas/sas_discover.c
>> b/drivers/scsi/libsas/sas_discover.c
>> index d5bc1314c341..bd22741daa99 100644
>> --- a/drivers/scsi/libsas/sas_discover.c
>> +++ b/drivers/scsi/libsas/sas_discover.c
>> @@ -362,6 +362,11 @@ static void sas_destruct_ports(struct
>> asd_sas_port *port)
>>   void sas_unregister_dev(struct asd_sas_port *port, struct
>> domain_device *dev)
>>   {
>> +    if (test_bit(SAS_DEV_GONE, &dev->state) &&
>> +        (dev->dev_type == SAS_SATA_DEV ||
>> +        (dev->tproto & SAS_PROTOCOL_STP)))
>
> dev_is_sata() would be better here.

ok, Thanks for your advice.

Thanks,
Xingui
>
> Thanks,
> Jason
>
>> +        sas_ata_device_link_abort(dev, false);
>> +
>>       if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
>>           !list_empty(&dev->disco_list_node)) {
>>           /* this rphy never saw sas_rphy_add */
>>
> .