2021-03-23 15:39:52

by Ahmad Fatoum

[permalink] [raw]
Subject: [PATCH v3 1/2] driver core: clear deferred probe reason on probe retry

When retrying a deferred probe, any old defer reason string should be
discarded. Otherwise, if the probe is deferred again at a different spot,
but without setting a message, the now incorrect probe reason will remain.

This was observed with the i.MX I2C driver, which ultimately failed
to probe due to lack of the GPIO driver. The probe defer for GPIO
doesn't record a message, but a previous probe defer to clock_get did.
This had the effect that /sys/kernel/debug/devices_deferred listed
a misleading probe deferral reason.

Cc: [email protected]
Fixes: d090b70ede02 ("driver core: add deferring probe reason to devices_deferred property")
Reviewed-by: Andy Shevchenko <[email protected]>
Reviewed-by: Andrzej Hajda <[email protected]>
Signed-off-by: Ahmad Fatoum <[email protected]>
---
v2 -> v3:
- collected Andrzej's Reviewed-by
v1 -> v2:
- reworded commit message (Andy)
- collected Andy's Reviewed-by
---
drivers/base/dd.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 9179825ff646..e2cf3b29123e 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -97,6 +97,9 @@ static void deferred_probe_work_func(struct work_struct *work)

get_device(dev);

+ kfree(dev->p->deferred_probe_reason);
+ dev->p->deferred_probe_reason = NULL;
+
/*
* Drop the mutex while probing each device; the probe path may
* manipulate the deferred list
--
2.29.2


2021-03-23 15:40:53

by Ahmad Fatoum

[permalink] [raw]
Subject: [PATCH v3 2/2] driver core: add helper for deferred probe reason setting

We now have three places within the same file doing the same operation
of freeing this pointer and setting it anew. A helper makes this
arguably easier to read, so add one.

Reviewed-by: Andy Shevchenko <[email protected]>
Reviewed-by: Andrzej Hajda <[email protected]>
Signed-off-by: Ahmad Fatoum <[email protected]>
---
v2 -> v3:
- fixed typo in commit message (Andy)
- collected Andy's and Andrzej's Reviewed-by
v1 -> v2:
- no change
---
drivers/base/dd.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index e2cf3b29123e..4201baa1cc13 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -69,6 +69,12 @@ static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN];
*/
static bool defer_all_probes;

+static void __device_set_deferred_probe_reason(const struct device *dev, char *reason)
+{
+ kfree(dev->p->deferred_probe_reason);
+ dev->p->deferred_probe_reason = reason;
+}
+
/*
* deferred_probe_work_func() - Retry probing devices in the active list.
*/
@@ -97,8 +103,7 @@ static void deferred_probe_work_func(struct work_struct *work)

get_device(dev);

- kfree(dev->p->deferred_probe_reason);
- dev->p->deferred_probe_reason = NULL;
+ __device_set_deferred_probe_reason(dev, NULL);

/*
* Drop the mutex while probing each device; the probe path may
@@ -140,8 +145,7 @@ void driver_deferred_probe_del(struct device *dev)
if (!list_empty(&dev->p->deferred_probe)) {
dev_dbg(dev, "Removed from deferred list\n");
list_del_init(&dev->p->deferred_probe);
- kfree(dev->p->deferred_probe_reason);
- dev->p->deferred_probe_reason = NULL;
+ __device_set_deferred_probe_reason(dev, NULL);
}
mutex_unlock(&deferred_probe_mutex);
}
@@ -220,11 +224,12 @@ void device_unblock_probing(void)
void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf)
{
const char *drv = dev_driver_string(dev);
+ char *reason;

mutex_lock(&deferred_probe_mutex);

- kfree(dev->p->deferred_probe_reason);
- dev->p->deferred_probe_reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf);
+ reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf);
+ __device_set_deferred_probe_reason(dev, reason);

mutex_unlock(&deferred_probe_mutex);
}
--
2.29.2

2021-04-05 08:56:08

by Ahmad Fatoum

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] driver core: add helper for deferred probe reason setting

Hello Greg,

On 23.03.21 16:37, Ahmad Fatoum wrote:
> We now have three places within the same file doing the same operation
> of freeing this pointer and setting it anew. A helper makes this
> arguably easier to read, so add one.
>
> Reviewed-by: Andy Shevchenko <[email protected]>
> Reviewed-by: Andrzej Hajda <[email protected]>
> Signed-off-by: Ahmad Fatoum <[email protected]>

are there still objections to this patch?
Patch 1 was applied, should I resend without?

Cheers,
Ahmad

> ---
> v2 -> v3:
> - fixed typo in commit message (Andy)
> - collected Andy's and Andrzej's Reviewed-by
> v1 -> v2:
> - no change
> ---
> drivers/base/dd.c | 17 +++++++++++------
> 1 file changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/base/dd.c b/drivers/base/dd.c
> index e2cf3b29123e..4201baa1cc13 100644
> --- a/drivers/base/dd.c
> +++ b/drivers/base/dd.c
> @@ -69,6 +69,12 @@ static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN];
> */
> static bool defer_all_probes;
>
> +static void __device_set_deferred_probe_reason(const struct device *dev, char *reason)
> +{
> + kfree(dev->p->deferred_probe_reason);
> + dev->p->deferred_probe_reason = reason;
> +}
> +
> /*
> * deferred_probe_work_func() - Retry probing devices in the active list.
> */
> @@ -97,8 +103,7 @@ static void deferred_probe_work_func(struct work_struct *work)
>
> get_device(dev);
>
> - kfree(dev->p->deferred_probe_reason);
> - dev->p->deferred_probe_reason = NULL;
> + __device_set_deferred_probe_reason(dev, NULL);
>
> /*
> * Drop the mutex while probing each device; the probe path may
> @@ -140,8 +145,7 @@ void driver_deferred_probe_del(struct device *dev)
> if (!list_empty(&dev->p->deferred_probe)) {
> dev_dbg(dev, "Removed from deferred list\n");
> list_del_init(&dev->p->deferred_probe);
> - kfree(dev->p->deferred_probe_reason);
> - dev->p->deferred_probe_reason = NULL;
> + __device_set_deferred_probe_reason(dev, NULL);
> }
> mutex_unlock(&deferred_probe_mutex);
> }
> @@ -220,11 +224,12 @@ void device_unblock_probing(void)
> void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf)
> {
> const char *drv = dev_driver_string(dev);
> + char *reason;
>
> mutex_lock(&deferred_probe_mutex);
>
> - kfree(dev->p->deferred_probe_reason);
> - dev->p->deferred_probe_reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf);
> + reason = kasprintf(GFP_KERNEL, "%s: %pV", drv, vaf);
> + __device_set_deferred_probe_reason(dev, reason);
>
> mutex_unlock(&deferred_probe_mutex);
> }
>

--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |

2021-04-05 09:44:45

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH v3 2/2] driver core: add helper for deferred probe reason setting

On Mon, Apr 05, 2021 at 10:27:56AM +0200, Ahmad Fatoum wrote:
> Hello Greg,
>
> On 23.03.21 16:37, Ahmad Fatoum wrote:
> > We now have three places within the same file doing the same operation
> > of freeing this pointer and setting it anew. A helper makes this
> > arguably easier to read, so add one.
> >
> > Reviewed-by: Andy Shevchenko <[email protected]>
> > Reviewed-by: Andrzej Hajda <[email protected]>
> > Signed-off-by: Ahmad Fatoum <[email protected]>
>
> are there still objections to this patch?
> Patch 1 was applied, should I resend without?

No, I'll queue this up now, I wanted patch 1 to show up in my "next"
branch first, it's now there, give me a chance to catch up on patches...

thanks,

greg k-h