* [PATCH 1/3] devres: Clarify documentation for devres_destroy()
@ 2012-05-03 17:15 Mark Brown
2012-05-03 17:15 ` [PATCH 2/3] devres: Add devres_release() Mark Brown
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Mark Brown @ 2012-05-03 17:15 UTC (permalink / raw)
To: Grant Likely, Greg Kroah-Hartman, Linus Walleij
Cc: Guennadi Liakhovetski, linux-kernel, Mark Brown
It's not massively obvious (at least to me) that removing and freeing a
resource does not involve calling the release function for the resource
but rather only removes the management of it. Make the documentation more
explicit.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
drivers/base/devres.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/base/devres.c b/drivers/base/devres.c
index 524bf96..1741a60 100644
--- a/drivers/base/devres.c
+++ b/drivers/base/devres.c
@@ -309,6 +309,10 @@ EXPORT_SYMBOL_GPL(devres_remove);
* which @match returns 1. If @match is NULL, it's considered to
* match all. If found, the resource is removed atomically and freed.
*
+ * Note that the release function for the resource will not be called,
+ * only the devres-allocated data will be freed. The caller becomes
+ * responsible for freeing any other data.
+ *
* RETURNS:
* 0 if devres is found and freed, -ENOENT if not found.
*/
--
1.7.10
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] devres: Add devres_release()
2012-05-03 17:15 [PATCH 1/3] devres: Clarify documentation for devres_destroy() Mark Brown
@ 2012-05-03 17:15 ` Mark Brown
2012-05-03 17:15 ` [PATCH 3/3] gpiolib: Convert to devres_release() Mark Brown
2012-05-12 0:41 ` [PATCH 1/3] devres: Clarify documentation for devres_destroy() Grant Likely
2 siblings, 0 replies; 4+ messages in thread
From: Mark Brown @ 2012-05-03 17:15 UTC (permalink / raw)
To: Grant Likely, Greg Kroah-Hartman, Linus Walleij
Cc: Guennadi Liakhovetski, linux-kernel, Mark Brown
APIs using devres frequently want to implement a "remove and free the
resource" operation so it seems sensible that they should be able to
just have devres do the freeing for them since that's a big part of what
devres is all about.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
drivers/base/devres.c | 31 +++++++++++++++++++++++++++++++
include/linux/device.h | 2 ++
2 files changed, 33 insertions(+)
diff --git a/drivers/base/devres.c b/drivers/base/devres.c
index 1741a60..2360adb 100644
--- a/drivers/base/devres.c
+++ b/drivers/base/devres.c
@@ -330,6 +330,37 @@ int devres_destroy(struct device *dev, dr_release_t release,
}
EXPORT_SYMBOL_GPL(devres_destroy);
+
+/**
+ * devres_release - Find a device resource and destroy it, calling release
+ * @dev: Device to find resource from
+ * @release: Look for resources associated with this release function
+ * @match: Match function (optional)
+ * @match_data: Data for the match function
+ *
+ * Find the latest devres of @dev associated with @release and for
+ * which @match returns 1. If @match is NULL, it's considered to
+ * match all. If found, the resource is removed atomically, the
+ * release function called and the resource freed.
+ *
+ * RETURNS:
+ * 0 if devres is found and freed, -ENOENT if not found.
+ */
+int devres_release(struct device *dev, dr_release_t release,
+ dr_match_t match, void *match_data)
+{
+ void *res;
+
+ res = devres_remove(dev, release, match, match_data);
+ if (unlikely(!res))
+ return -ENOENT;
+
+ (*release)(dev, res);
+ devres_free(res);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(devres_release);
+
static int remove_nodes(struct device *dev,
struct list_head *first, struct list_head *end,
struct list_head *todo)
diff --git a/include/linux/device.h b/include/linux/device.h
index e3399290..5c7fdbd 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -541,6 +541,8 @@ extern void *devres_remove(struct device *dev, dr_release_t release,
dr_match_t match, void *match_data);
extern int devres_destroy(struct device *dev, dr_release_t release,
dr_match_t match, void *match_data);
+extern int devres_release(struct device *dev, dr_release_t release,
+ dr_match_t match, void *match_data);
/* devres group */
extern void * __must_check devres_open_group(struct device *dev, void *id,
--
1.7.10
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] gpiolib: Convert to devres_release()
2012-05-03 17:15 [PATCH 1/3] devres: Clarify documentation for devres_destroy() Mark Brown
2012-05-03 17:15 ` [PATCH 2/3] devres: Add devres_release() Mark Brown
@ 2012-05-03 17:15 ` Mark Brown
2012-05-12 0:41 ` [PATCH 1/3] devres: Clarify documentation for devres_destroy() Grant Likely
2 siblings, 0 replies; 4+ messages in thread
From: Mark Brown @ 2012-05-03 17:15 UTC (permalink / raw)
To: Grant Likely, Greg Kroah-Hartman, Linus Walleij
Cc: Guennadi Liakhovetski, linux-kernel, Mark Brown
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
drivers/gpio/devres.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/gpio/devres.c b/drivers/gpio/devres.c
index d21a9ff..9e9947c 100644
--- a/drivers/gpio/devres.c
+++ b/drivers/gpio/devres.c
@@ -112,8 +112,7 @@ int devm_gpio_request_one(struct device *dev, unsigned gpio,
void devm_gpio_free(struct device *dev, unsigned int gpio)
{
- WARN_ON(devres_destroy(dev, devm_gpio_release, devm_gpio_match,
+ WARN_ON(devres_release(dev, devm_gpio_release, devm_gpio_match,
&gpio));
- gpio_free(gpio);
}
EXPORT_SYMBOL(devm_gpio_free);
--
1.7.10
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/3] devres: Clarify documentation for devres_destroy()
2012-05-03 17:15 [PATCH 1/3] devres: Clarify documentation for devres_destroy() Mark Brown
2012-05-03 17:15 ` [PATCH 2/3] devres: Add devres_release() Mark Brown
2012-05-03 17:15 ` [PATCH 3/3] gpiolib: Convert to devres_release() Mark Brown
@ 2012-05-12 0:41 ` Grant Likely
2 siblings, 0 replies; 4+ messages in thread
From: Grant Likely @ 2012-05-12 0:41 UTC (permalink / raw)
To: Mark Brown, Greg Kroah-Hartman, Linus Walleij
Cc: Guennadi Liakhovetski, linux-kernel, Mark Brown
On Thu, 3 May 2012 18:15:12 +0100, Mark Brown <broonie@opensource.wolfsonmicro.com> wrote:
> It's not massively obvious (at least to me) that removing and freeing a
> resource does not involve calling the release function for the resource
> but rather only removes the management of it. Make the documentation more
> explicit.
>
> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This series looks appropriate to me. FWIW:
Acked-by: Grant Likely <grant.likely@secretlab.ca>
> ---
> drivers/base/devres.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/drivers/base/devres.c b/drivers/base/devres.c
> index 524bf96..1741a60 100644
> --- a/drivers/base/devres.c
> +++ b/drivers/base/devres.c
> @@ -309,6 +309,10 @@ EXPORT_SYMBOL_GPL(devres_remove);
> * which @match returns 1. If @match is NULL, it's considered to
> * match all. If found, the resource is removed atomically and freed.
> *
> + * Note that the release function for the resource will not be called,
> + * only the devres-allocated data will be freed. The caller becomes
> + * responsible for freeing any other data.
> + *
> * RETURNS:
> * 0 if devres is found and freed, -ENOENT if not found.
> */
> --
> 1.7.10
>
--
Grant Likely, B.Sc, P.Eng.
Secret Lab Technologies, Ltd.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-05-12 0:41 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-03 17:15 [PATCH 1/3] devres: Clarify documentation for devres_destroy() Mark Brown
2012-05-03 17:15 ` [PATCH 2/3] devres: Add devres_release() Mark Brown
2012-05-03 17:15 ` [PATCH 3/3] gpiolib: Convert to devres_release() Mark Brown
2012-05-12 0:41 ` [PATCH 1/3] devres: Clarify documentation for devres_destroy() Grant Likely
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).