All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] regulator: gpio: fix error paths in probe()
@ 2016-01-28 19:55 Harald Geyer
  2016-01-28 19:55 ` [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures " Harald Geyer
  2016-01-28 19:55 ` [PATCH 2/2] regulator: gpio: Move last remaining memory allocation to devres Harald Geyer
  0 siblings, 2 replies; 6+ messages in thread
From: Harald Geyer @ 2016-01-28 19:55 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown, Heiko Stuebner; +Cc: linux-kernel, Harald Geyer

Currently resources aren't freed in the order in which they have been
allocated. Eg probe() frees drvdata->states even if it failed before
allocating that. I think allocating/copying the affacted data structures
isn't necessary anyway, so this is the easiest way to fix this.

Patch 1/2 is the actual fix.
Patch 2/2 is minor cleanup while looking at the code.

This series has only been compile tested yet. I will test it on
device-tree HW when I get access to my test equipment. I can't test
non-device-tree code however.

Other notes:
* This driver passes &drvdata->desc uninitialized (but zeroed) to
  of_get_gpio_regulator_config() - I don't know if this is ok.
* I'm not sure if copying config->supply_name is actually necessary,
  so I left that one in.

Harald Geyer (2):
  regulator: gpio: Avoid unnecessarily copying data structures in
    probe()
  regulator: gpio: Move last remaining memory allocation to devres

 drivers/regulator/gpio-regulator.c | 46 +++++++++-----------------------------
 1 file changed, 10 insertions(+), 36 deletions(-)

-- 
2.1.4

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

* [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures in probe()
  2016-01-28 19:55 [PATCH 0/2] regulator: gpio: fix error paths in probe() Harald Geyer
@ 2016-01-28 19:55 ` Harald Geyer
  2016-01-28 23:09   ` Mark Brown
  2016-01-28 19:55 ` [PATCH 2/2] regulator: gpio: Move last remaining memory allocation to devres Harald Geyer
  1 sibling, 1 reply; 6+ messages in thread
From: Harald Geyer @ 2016-01-28 19:55 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown, Heiko Stuebner; +Cc: linux-kernel, Harald Geyer

The data structures either have been copied in
of_get_gpio_regulator_config() already or are part of platform data,
which we keep a pointer to for the life time of the device anyway.

As a side effect this fixes the cleanup pathes if probe() fails.

Signed-off-by: Harald Geyer <harald@ccbib.org>
---
 drivers/regulator/gpio-regulator.c | 34 ++++++----------------------------
 1 file changed, 6 insertions(+), 28 deletions(-)

diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 7bba8b7..5e2e14d 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -271,33 +271,18 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	}
 
 	if (config->nr_gpios != 0) {
-		drvdata->gpios = kmemdup(config->gpios,
-					 config->nr_gpios * sizeof(struct gpio),
-					 GFP_KERNEL);
-		if (drvdata->gpios == NULL) {
-			dev_err(&pdev->dev, "Failed to allocate gpio data\n");
-			ret = -ENOMEM;
-			goto err_name;
-		}
+		drvdata->gpios = config->gpios;
 
 		drvdata->nr_gpios = config->nr_gpios;
 		ret = gpio_request_array(drvdata->gpios, drvdata->nr_gpios);
 		if (ret) {
 			dev_err(&pdev->dev,
 			"Could not obtain regulator setting GPIOs: %d\n", ret);
-			goto err_memstate;
+			goto err_name;
 		}
 	}
 
-	drvdata->states = kmemdup(config->states,
-				  config->nr_states *
-					 sizeof(struct gpio_regulator_state),
-				  GFP_KERNEL);
-	if (drvdata->states == NULL) {
-		dev_err(&pdev->dev, "Failed to allocate state data\n");
-		ret = -ENOMEM;
-		goto err_memgpio;
-	}
+	drvdata->states = config->states;
 	drvdata->nr_states = config->nr_states;
 
 	drvdata->desc.owner = THIS_MODULE;
@@ -317,7 +302,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	default:
 		dev_err(&pdev->dev, "No regulator type set\n");
 		ret = -EINVAL;
-		goto err_memgpio;
+		goto err_gpio;
 	}
 
 	/* build initial state from gpio init data. */
@@ -354,19 +339,15 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 	if (IS_ERR(drvdata->dev)) {
 		ret = PTR_ERR(drvdata->dev);
 		dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
-		goto err_stategpio;
+		goto err_gpio;
 	}
 
 	platform_set_drvdata(pdev, drvdata);
 
 	return 0;
 
-err_stategpio:
+err_gpio:
 	gpio_free_array(drvdata->gpios, drvdata->nr_gpios);
-err_memstate:
-	kfree(drvdata->states);
-err_memgpio:
-	kfree(drvdata->gpios);
 err_name:
 	kfree(drvdata->desc.name);
 err:
@@ -381,9 +362,6 @@ static int gpio_regulator_remove(struct platform_device *pdev)
 
 	gpio_free_array(drvdata->gpios, drvdata->nr_gpios);
 
-	kfree(drvdata->states);
-	kfree(drvdata->gpios);
-
 	kfree(drvdata->desc.name);
 
 	return 0;
-- 
2.1.4

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

* [PATCH 2/2] regulator: gpio: Move last remaining memory allocation to devres
  2016-01-28 19:55 [PATCH 0/2] regulator: gpio: fix error paths in probe() Harald Geyer
  2016-01-28 19:55 ` [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures " Harald Geyer
@ 2016-01-28 19:55 ` Harald Geyer
  1 sibling, 0 replies; 6+ messages in thread
From: Harald Geyer @ 2016-01-28 19:55 UTC (permalink / raw)
  To: Liam Girdwood, Mark Brown, Heiko Stuebner; +Cc: linux-kernel, Harald Geyer

Simple cleanup without functional changes.

Signed-off-by: Harald Geyer <harald@ccbib.org>
---
 drivers/regulator/gpio-regulator.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c
index 5e2e14d..5fe4921 100644
--- a/drivers/regulator/gpio-regulator.c
+++ b/drivers/regulator/gpio-regulator.c
@@ -263,11 +263,11 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 			return PTR_ERR(config);
 	}
 
-	drvdata->desc.name = kstrdup(config->supply_name, GFP_KERNEL);
+	drvdata->desc.name = devm_kstrdup(&pdev->dev, config->supply_name,
+					  GFP_KERNEL);
 	if (drvdata->desc.name == NULL) {
 		dev_err(&pdev->dev, "Failed to allocate supply name\n");
-		ret = -ENOMEM;
-		goto err;
+		return -ENOMEM;
 	}
 
 	if (config->nr_gpios != 0) {
@@ -278,7 +278,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 		if (ret) {
 			dev_err(&pdev->dev,
 			"Could not obtain regulator setting GPIOs: %d\n", ret);
-			goto err_name;
+			return ret;
 		}
 	}
 
@@ -348,9 +348,7 @@ static int gpio_regulator_probe(struct platform_device *pdev)
 
 err_gpio:
 	gpio_free_array(drvdata->gpios, drvdata->nr_gpios);
-err_name:
-	kfree(drvdata->desc.name);
-err:
+
 	return ret;
 }
 
@@ -362,8 +360,6 @@ static int gpio_regulator_remove(struct platform_device *pdev)
 
 	gpio_free_array(drvdata->gpios, drvdata->nr_gpios);
 
-	kfree(drvdata->desc.name);
-
 	return 0;
 }
 
-- 
2.1.4

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

* Re: [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures in probe()
  2016-01-28 19:55 ` [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures " Harald Geyer
@ 2016-01-28 23:09   ` Mark Brown
  2016-01-29 16:25     ` Harald Geyer
  0 siblings, 1 reply; 6+ messages in thread
From: Mark Brown @ 2016-01-28 23:09 UTC (permalink / raw)
  To: Harald Geyer; +Cc: Liam Girdwood, Heiko Stuebner, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 342 bytes --]

On Thu, Jan 28, 2016 at 07:55:17PM +0000, Harald Geyer wrote:
> The data structures either have been copied in
> of_get_gpio_regulator_config() already or are part of platform data,
> which we keep a pointer to for the life time of the device anyway.

The point of this code is to avoid referring to platform data after
probe for robustness.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

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

* Re: [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures in probe()
  2016-01-28 23:09   ` Mark Brown
@ 2016-01-29 16:25     ` Harald Geyer
  2016-02-03 17:20       ` Mark Brown
  0 siblings, 1 reply; 6+ messages in thread
From: Harald Geyer @ 2016-01-29 16:25 UTC (permalink / raw)
  To: Mark Brown; +Cc: Harald Geyer, Liam Girdwood, Heiko Stuebner, linux-kernel

Mark Brown writes:
> On Thu, Jan 28, 2016 at 07:55:17PM +0000, Harald Geyer wrote:
> > The data structures either have been copied in
> > of_get_gpio_regulator_config() already or are part of platform data,
> > which we keep a pointer to for the life time of the device anyway.
> 
> The point of this code is to avoid referring to platform data after
> probe for robustness.

Well, if we can't rely on platform data staying available after probe()
then probably we shouldn't keep a pointer to it - but thats a different
issue, so lets focus on the original problem:

What's your preferred way to fix the error path of probe() then?

Harald

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

* Re: [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures in probe()
  2016-01-29 16:25     ` Harald Geyer
@ 2016-02-03 17:20       ` Mark Brown
  0 siblings, 0 replies; 6+ messages in thread
From: Mark Brown @ 2016-02-03 17:20 UTC (permalink / raw)
  To: Harald Geyer; +Cc: Liam Girdwood, Heiko Stuebner, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 799 bytes --]

On Fri, Jan 29, 2016 at 05:25:28PM +0100, Harald Geyer wrote:
> Mark Brown writes:
> > On Thu, Jan 28, 2016 at 07:55:17PM +0000, Harald Geyer wrote:
> > > The data structures either have been copied in
> > > of_get_gpio_regulator_config() already or are part of platform data,
> > > which we keep a pointer to for the life time of the device anyway.

> > The point of this code is to avoid referring to platform data after
> > probe for robustness.

> Well, if we can't rely on platform data staying available after probe()
> then probably we shouldn't keep a pointer to it - but thats a different
> issue, so lets focus on the original problem:

> What's your preferred way to fix the error path of probe() then?

Add the matching frees?  I'm not sure I know what the original problem
is mind you.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

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

end of thread, other threads:[~2016-02-03 17:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-28 19:55 [PATCH 0/2] regulator: gpio: fix error paths in probe() Harald Geyer
2016-01-28 19:55 ` [PATCH 1/2] regulator: gpio: Avoid unnecessarily copying data structures " Harald Geyer
2016-01-28 23:09   ` Mark Brown
2016-01-29 16:25     ` Harald Geyer
2016-02-03 17:20       ` Mark Brown
2016-01-28 19:55 ` [PATCH 2/2] regulator: gpio: Move last remaining memory allocation to devres Harald Geyer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.