linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] driver core: clear deferred probe reason on probe retry
@ 2021-03-18  7:39 Ahmad Fatoum
  2021-03-18  7:39 ` [PATCH 2/2] driver core: add helper for deferred probe reason setting Ahmad Fatoum
  2021-03-18 12:47 ` [PATCH 1/2] driver core: clear deferred probe reason on probe retry Andy Shevchenko
  0 siblings, 2 replies; 4+ messages in thread
From: Ahmad Fatoum @ 2021-03-18  7:39 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J. Wysocki, Mark Brown, Andrzej Hajda,
	Andy Shevchenko
  Cc: kernel, stable, Ahmad Fatoum, linux-kernel

When retrying a deferred probe, any old defer reason string should be
discarded. Otherwise, if probe is deferred again at a different spot,
but without setting a message, a 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: stable@kernel.org
Fixes: d090b70ede02 ("driver core: add deferring probe reason to devices_deferred property")
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] driver core: add helper for deferred probe reason setting
  2021-03-18  7:39 [PATCH 1/2] driver core: clear deferred probe reason on probe retry Ahmad Fatoum
@ 2021-03-18  7:39 ` Ahmad Fatoum
  2021-03-22  8:20   ` Andrzej Hajda
  2021-03-18 12:47 ` [PATCH 1/2] driver core: clear deferred probe reason on probe retry Andy Shevchenko
  1 sibling, 1 reply; 4+ messages in thread
From: Ahmad Fatoum @ 2021-03-18  7:39 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J. Wysocki
  Cc: kernel, Andrzej Hajda, Ahmad Fatoum, linux-kernel

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

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] driver core: clear deferred probe reason on probe retry
  2021-03-18  7:39 [PATCH 1/2] driver core: clear deferred probe reason on probe retry Ahmad Fatoum
  2021-03-18  7:39 ` [PATCH 2/2] driver core: add helper for deferred probe reason setting Ahmad Fatoum
@ 2021-03-18 12:47 ` Andy Shevchenko
  1 sibling, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2021-03-18 12:47 UTC (permalink / raw)
  To: Ahmad Fatoum
  Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Mark Brown, Andrzej Hajda,
	Sascha Hauer, stable, Linux Kernel Mailing List

On Thu, Mar 18, 2021 at 9:39 AM Ahmad Fatoum <a.fatoum@pengutronix.de> wrote:
>
> When retrying a deferred probe, any old defer reason string should be
> discarded. Otherwise, if probe is deferred again at a different spot,

probe -> the probe

> but without setting a message, a now incorrect probe reason will remain.

a now incorrect -> now the incorrect

> 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.

Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>

> Cc: stable@kernel.org
> Fixes: d090b70ede02 ("driver core: add deferring probe reason to devices_deferred property")
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
>  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
>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] driver core: add helper for deferred probe reason setting
  2021-03-18  7:39 ` [PATCH 2/2] driver core: add helper for deferred probe reason setting Ahmad Fatoum
@ 2021-03-22  8:20   ` Andrzej Hajda
  0 siblings, 0 replies; 4+ messages in thread
From: Andrzej Hajda @ 2021-03-22  8:20 UTC (permalink / raw)
  To: Ahmad Fatoum, Greg Kroah-Hartman, Rafael J. Wysocki; +Cc: kernel, linux-kernel


W dniu 18.03.2021 o 08:39, Ahmad Fatoum pisze:
> We now have three places within the same file doing the same operation
> of freeing this pointer and setting it anew. A helper make this
> arguably easier to read, so add one.
>
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>

Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>

Regards

Andrzej

> ---
>   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);
>   }

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-03-22  8:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-18  7:39 [PATCH 1/2] driver core: clear deferred probe reason on probe retry Ahmad Fatoum
2021-03-18  7:39 ` [PATCH 2/2] driver core: add helper for deferred probe reason setting Ahmad Fatoum
2021-03-22  8:20   ` Andrzej Hajda
2021-03-18 12:47 ` [PATCH 1/2] driver core: clear deferred probe reason on probe retry Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).