linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).