* [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 [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 [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome