linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] devres: provide devm_kstrdup_const()
@ 2018-08-27  8:21 Bartosz Golaszewski
  2018-08-27  8:21 ` [PATCH 2/2] clk: pmc-atom: use devm_kstrdup_const() Bartosz Golaszewski
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Bartosz Golaszewski @ 2018-08-27  8:21 UTC (permalink / raw)
  To: Michael Turquette, Stephen Boyd, Greg Kroah-Hartman,
	Rafael J . Wysocki, Arend van Spriel, Ulf Hansson, Bjorn Helgaas,
	Vivek Gautam, Robin Murphy, Joe Perches, Heikki Krogerus,
	Andrew Morton, Mike Rapoport, Michal Hocko, Al Viro,
	Jonathan Corbet, Roman Gushchin, Huang Ying, Kees Cook,
	Bjorn Andersson
  Cc: linux-clk, linux-kernel, linux-mm, Bartosz Golaszewski

Provide a resource managed version of kstrdup_const(). This variant
internally calls devm_kstrdup() on pointers that are outside of
.rodata section. Also provide a corresponding version of devm_kfree().

Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
---
 include/linux/device.h |  2 ++
 mm/util.c              | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/include/linux/device.h b/include/linux/device.h
index 8f882549edee..f8f5982d26b2 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -693,7 +693,9 @@ static inline void *devm_kcalloc(struct device *dev,
 	return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO);
 }
 extern void devm_kfree(struct device *dev, void *p);
+extern void devm_kfree_const(struct device *dev, void *p);
 extern char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp) __malloc;
+extern char *devm_kstrdup_const(struct device *dev, const char *s, gfp_t gfp);
 extern void *devm_kmemdup(struct device *dev, const void *src, size_t len,
 			  gfp_t gfp);
 
diff --git a/mm/util.c b/mm/util.c
index d2890a407332..6d1f41b5775e 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -39,6 +39,20 @@ void kfree_const(const void *x)
 }
 EXPORT_SYMBOL(kfree_const);
 
+/**
+ * devm_kfree_const - Resource managed conditional kfree
+ * @dev: device this memory belongs to
+ * @p: memory to free
+ *
+ * Function calls devm_kfree only if @p is not in .rodata section.
+ */
+void devm_kfree_const(struct device *dev, void *p)
+{
+	if (!is_kernel_rodata((unsigned long)p))
+		devm_kfree(dev, p);
+}
+EXPORT_SYMBOL(devm_kfree_const);
+
 /**
  * kstrdup - allocate space for and copy an existing string
  * @s: the string to duplicate
@@ -78,6 +92,27 @@ const char *kstrdup_const(const char *s, gfp_t gfp)
 }
 EXPORT_SYMBOL(kstrdup_const);
 
+/**
+ * devm_kstrdup_const - resource managed conditional string duplication
+ * @dev: device for which to duplicate the string
+ * @s: the string to duplicate
+ * @gfp: the GFP mask used in the kmalloc() call when allocating memory
+ *
+ * Function returns source string if it is in .rodata section otherwise it
+ * fallbacks to devm_kstrdup.
+ *
+ * Strings allocated by devm_kstrdup_const will be automatically freed when
+ * the associated device is detached.
+ */
+char *devm_kstrdup_const(struct device *dev, const char *s, gfp_t gfp)
+{
+	if (is_kernel_rodata((unsigned long)s))
+		return s;
+
+	return devm_kstrdup(dev, s, gfp);
+}
+EXPORT_SYMBOL(devm_kstrdup_const);
+
 /**
  * kstrndup - allocate space for and copy an existing string
  * @s: the string to duplicate
-- 
2.18.0


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

end of thread, other threads:[~2018-08-28  6:33 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-27  8:21 [PATCH 1/2] devres: provide devm_kstrdup_const() Bartosz Golaszewski
2018-08-27  8:21 ` [PATCH 2/2] clk: pmc-atom: use devm_kstrdup_const() Bartosz Golaszewski
2018-08-27 10:39   ` Mike Rapoport
2018-08-27 12:28     ` Bartosz Golaszewski
2018-08-27 12:52       ` Mike Rapoport
2018-08-27 12:58         ` Bartosz Golaszewski
2018-08-27 13:04           ` Mike Rapoport
2018-08-27  8:42 ` [PATCH 1/2] devres: provide devm_kstrdup_const() Joe Perches
2018-08-27  9:01   ` Bartosz Golaszewski
2018-08-27 10:33 ` Mike Rapoport
2018-08-27 14:28   ` Bartosz Golaszewski
2018-08-28  6:32     ` Mike Rapoport
2018-08-27 12:47 ` kbuild test robot

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