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

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: stable@kernel.org
Fixes: d090b70ede02 ("driver core: add deferring probe reason to devices_deferred property")
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
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


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

* [PATCH v3 2/2] driver core: add helper for deferred probe reason setting
  2021-03-23 15:37 [PATCH v3 1/2] driver core: clear deferred probe reason on probe retry Ahmad Fatoum
@ 2021-03-23 15:37 ` Ahmad Fatoum
  2021-04-05  8:27   ` Ahmad Fatoum
  0 siblings, 1 reply; 4+ messages in thread
From: Ahmad Fatoum @ 2021-03-23 15:37 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J. Wysocki
  Cc: kernel, Andrzej Hajda, Andy Shevchenko, 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 makes this
arguably easier to read, so add one.

Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
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


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

* Re: [PATCH v3 2/2] driver core: add helper for deferred probe reason setting
  2021-03-23 15:37 ` [PATCH v3 2/2] driver core: add helper for deferred probe reason setting Ahmad Fatoum
@ 2021-04-05  8:27   ` Ahmad Fatoum
  2021-04-05  8:31     ` Greg Kroah-Hartman
  0 siblings, 1 reply; 4+ messages in thread
From: Ahmad Fatoum @ 2021-04-05  8:27 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rafael J. Wysocki
  Cc: kernel, Andrzej Hajda, Andy Shevchenko, linux-kernel

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 <andy.shevchenko@gmail.com>
> Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>

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 |

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

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

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 <andy.shevchenko@gmail.com>
> > Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
> > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> 
> 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

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

end of thread, other threads:[~2021-04-05  8:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-23 15:37 [PATCH v3 1/2] driver core: clear deferred probe reason on probe retry Ahmad Fatoum
2021-03-23 15:37 ` [PATCH v3 2/2] driver core: add helper for deferred probe reason setting Ahmad Fatoum
2021-04-05  8:27   ` Ahmad Fatoum
2021-04-05  8:31     ` Greg Kroah-Hartman

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