2022-02-24 12:40:32

by John Garry

[permalink] [raw]
Subject: [PATCH 1/2] scsi: libsas: Make sas_notify_{phy,port}_event() return void

Nobody checks the return codes, so make them return void. Indeed, if the
LLDD cannot send an event, nothing much can be done in the LLDD about it.

Also remove prototype for sas_notify_phy_event() in sas_internal.h, which
should not be there.

Signed-off-by: John Garry <[email protected]>
Reviewed-by: Xiang Chen <[email protected]>
---
drivers/scsi/libsas/sas_event.c | 20 ++++++++------------
drivers/scsi/libsas/sas_internal.h | 2 --
include/scsi/libsas.h | 8 ++++----
3 files changed, 12 insertions(+), 18 deletions(-)

diff --git a/drivers/scsi/libsas/sas_event.c b/drivers/scsi/libsas/sas_event.c
index 3613b9b315bc..8ff58fd97837 100644
--- a/drivers/scsi/libsas/sas_event.c
+++ b/drivers/scsi/libsas/sas_event.c
@@ -165,8 +165,8 @@ static bool sas_defer_event(struct asd_sas_phy *phy, struct asd_sas_event *ev)
return deferred;
}

-int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
- gfp_t gfp_flags)
+void sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
+ gfp_t gfp_flags)
{
struct sas_ha_struct *ha = phy->ha;
struct asd_sas_event *ev;
@@ -176,7 +176,7 @@ int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,

ev = sas_alloc_event(phy, gfp_flags);
if (!ev)
- return -ENOMEM;
+ return;

/* Call pm_runtime_put() with pairs in sas_port_event_worker() */
pm_runtime_get_noresume(ha->dev);
@@ -184,20 +184,18 @@ int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
INIT_SAS_EVENT(ev, sas_port_event_worker, phy, event);

if (sas_defer_event(phy, ev))
- return 0;
+ return;

ret = sas_queue_event(event, &ev->work, ha);
if (ret != 1) {
pm_runtime_put(ha->dev);
sas_free_event(ev);
}
-
- return ret;
}
EXPORT_SYMBOL_GPL(sas_notify_port_event);

-int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
- gfp_t gfp_flags)
+void sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
+ gfp_t gfp_flags)
{
struct sas_ha_struct *ha = phy->ha;
struct asd_sas_event *ev;
@@ -207,7 +205,7 @@ int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,

ev = sas_alloc_event(phy, gfp_flags);
if (!ev)
- return -ENOMEM;
+ return;

/* Call pm_runtime_put() with pairs in sas_phy_event_worker() */
pm_runtime_get_noresume(ha->dev);
@@ -215,14 +213,12 @@ int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
INIT_SAS_EVENT(ev, sas_phy_event_worker, phy, event);

if (sas_defer_event(phy, ev))
- return 0;
+ return;

ret = sas_queue_event(event, &ev->work, ha);
if (ret != 1) {
pm_runtime_put(ha->dev);
sas_free_event(ev);
}
-
- return ret;
}
EXPORT_SYMBOL_GPL(sas_notify_phy_event);
diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h
index b60f0bf612cf..24843db2cb65 100644
--- a/drivers/scsi/libsas/sas_internal.h
+++ b/drivers/scsi/libsas/sas_internal.h
@@ -78,8 +78,6 @@ int sas_smp_phy_control(struct domain_device *dev, int phy_id,
enum phy_func phy_func, struct sas_phy_linkrates *);
int sas_smp_get_phy_events(struct sas_phy *phy);

-int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
- gfp_t flags);
void sas_device_set_phy(struct domain_device *dev, struct sas_port *port);
struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy);
struct domain_device *sas_ex_to_ata(struct domain_device *ex_dev, int phy_id);
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
index dc529cc92d65..df2c8fc43429 100644
--- a/include/scsi/libsas.h
+++ b/include/scsi/libsas.h
@@ -727,9 +727,9 @@ int sas_lu_reset(struct domain_device *dev, u8 *lun);
int sas_query_task(struct sas_task *task, u16 tag);
int sas_abort_task(struct sas_task *task, u16 tag);

-int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
- gfp_t gfp_flags);
-int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
- gfp_t gfp_flags);
+void sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
+ gfp_t gfp_flags);
+void sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
+ gfp_t gfp_flags);

#endif /* _SASLIB_H_ */
--
2.26.2


2022-02-24 16:25:41

by John Garry

[permalink] [raw]
Subject: Re: [PATCH 1/2] scsi: libsas: Make sas_notify_{phy,port}_event() return void

On 24/02/2022 12:43, Damien Le Moal wrote:
> On 2/24/22 20:04, John Garry wrote:
>> Nobody checks the return codes, so make them return void. Indeed, if the
>> LLDD cannot send an event, nothing much can be done in the LLDD about it.
>
> It really sound like the LLDDs should be fixed to e.g. reset the adapter
> if things go south with these functions. No sure though.

But this is not an adapter fault. As an example of a scenario which we
could be dealing with, it may be that a phyup event occurs in the
adapter but libsas cannot allocate memory to process the event. There's
not much the adapter/LLDD can do about that (nor does do).

>
>>
>> Also remove prototype for sas_notify_phy_event() in sas_internal.h, which
>> should not be there.
>>
>> Signed-off-by: John Garry <[email protected]>
>> Reviewed-by: Xiang Chen <[email protected]>
>
> In any case, these changes do not make anything worse :)

Thanks,

>
> Reviewed-by: Damien Le Moal <[email protected]>
>

2022-02-24 16:35:28

by Damien Le Moal

[permalink] [raw]
Subject: Re: [PATCH 1/2] scsi: libsas: Make sas_notify_{phy,port}_event() return void

On 2/24/22 20:04, John Garry wrote:
> Nobody checks the return codes, so make them return void. Indeed, if the
> LLDD cannot send an event, nothing much can be done in the LLDD about it.

It really sound like the LLDDs should be fixed to e.g. reset the adapter
if things go south with these functions. No sure though.

>
> Also remove prototype for sas_notify_phy_event() in sas_internal.h, which
> should not be there.
>
> Signed-off-by: John Garry <[email protected]>
> Reviewed-by: Xiang Chen <[email protected]>

In any case, these changes do not make anything worse :)

Reviewed-by: Damien Le Moal <[email protected]>

> ---
> drivers/scsi/libsas/sas_event.c | 20 ++++++++------------
> drivers/scsi/libsas/sas_internal.h | 2 --
> include/scsi/libsas.h | 8 ++++----
> 3 files changed, 12 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/scsi/libsas/sas_event.c b/drivers/scsi/libsas/sas_event.c
> index 3613b9b315bc..8ff58fd97837 100644
> --- a/drivers/scsi/libsas/sas_event.c
> +++ b/drivers/scsi/libsas/sas_event.c
> @@ -165,8 +165,8 @@ static bool sas_defer_event(struct asd_sas_phy *phy, struct asd_sas_event *ev)
> return deferred;
> }
>
> -int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
> - gfp_t gfp_flags)
> +void sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
> + gfp_t gfp_flags)
> {
> struct sas_ha_struct *ha = phy->ha;
> struct asd_sas_event *ev;
> @@ -176,7 +176,7 @@ int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
>
> ev = sas_alloc_event(phy, gfp_flags);
> if (!ev)
> - return -ENOMEM;
> + return;
>
> /* Call pm_runtime_put() with pairs in sas_port_event_worker() */
> pm_runtime_get_noresume(ha->dev);
> @@ -184,20 +184,18 @@ int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
> INIT_SAS_EVENT(ev, sas_port_event_worker, phy, event);
>
> if (sas_defer_event(phy, ev))
> - return 0;
> + return;
>
> ret = sas_queue_event(event, &ev->work, ha);
> if (ret != 1) {
> pm_runtime_put(ha->dev);
> sas_free_event(ev);
> }
> -
> - return ret;
> }
> EXPORT_SYMBOL_GPL(sas_notify_port_event);
>
> -int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
> - gfp_t gfp_flags)
> +void sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
> + gfp_t gfp_flags)
> {
> struct sas_ha_struct *ha = phy->ha;
> struct asd_sas_event *ev;
> @@ -207,7 +205,7 @@ int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
>
> ev = sas_alloc_event(phy, gfp_flags);
> if (!ev)
> - return -ENOMEM;
> + return;
>
> /* Call pm_runtime_put() with pairs in sas_phy_event_worker() */
> pm_runtime_get_noresume(ha->dev);
> @@ -215,14 +213,12 @@ int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
> INIT_SAS_EVENT(ev, sas_phy_event_worker, phy, event);
>
> if (sas_defer_event(phy, ev))
> - return 0;
> + return;
>
> ret = sas_queue_event(event, &ev->work, ha);
> if (ret != 1) {
> pm_runtime_put(ha->dev);
> sas_free_event(ev);
> }
> -
> - return ret;
> }
> EXPORT_SYMBOL_GPL(sas_notify_phy_event);
> diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h
> index b60f0bf612cf..24843db2cb65 100644
> --- a/drivers/scsi/libsas/sas_internal.h
> +++ b/drivers/scsi/libsas/sas_internal.h
> @@ -78,8 +78,6 @@ int sas_smp_phy_control(struct domain_device *dev, int phy_id,
> enum phy_func phy_func, struct sas_phy_linkrates *);
> int sas_smp_get_phy_events(struct sas_phy *phy);
>
> -int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
> - gfp_t flags);
> void sas_device_set_phy(struct domain_device *dev, struct sas_port *port);
> struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy);
> struct domain_device *sas_ex_to_ata(struct domain_device *ex_dev, int phy_id);
> diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
> index dc529cc92d65..df2c8fc43429 100644
> --- a/include/scsi/libsas.h
> +++ b/include/scsi/libsas.h
> @@ -727,9 +727,9 @@ int sas_lu_reset(struct domain_device *dev, u8 *lun);
> int sas_query_task(struct sas_task *task, u16 tag);
> int sas_abort_task(struct sas_task *task, u16 tag);
>
> -int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
> - gfp_t gfp_flags);
> -int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
> - gfp_t gfp_flags);
> +void sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
> + gfp_t gfp_flags);
> +void sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event,
> + gfp_t gfp_flags);
>
> #endif /* _SASLIB_H_ */


--
Damien Le Moal
Western Digital Research