linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/5] powerpc/pseries: extract of_helpers module
@ 2015-08-04 14:36 Andy Shevchenko
  2015-08-04 14:36 ` [PATCH 2/5] powerpc/pseries: fix a potential memory leak Andy Shevchenko
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Andy Shevchenko @ 2015-08-04 14:36 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman; +Cc: Andy Shevchenko

Extract a new module to share the code between other modules.

There is no functional change.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 arch/powerpc/platforms/pseries/Makefile     |  1 +
 arch/powerpc/platforms/pseries/of_helpers.c | 38 +++++++++++++++++++++++++++++
 arch/powerpc/platforms/pseries/of_helpers.h |  8 ++++++
 arch/powerpc/platforms/pseries/reconfig.c   | 34 ++------------------------
 4 files changed, 49 insertions(+), 32 deletions(-)
 create mode 100644 arch/powerpc/platforms/pseries/of_helpers.c
 create mode 100644 arch/powerpc/platforms/pseries/of_helpers.h

diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile
index 0348079..2e857c2 100644
--- a/arch/powerpc/platforms/pseries/Makefile
+++ b/arch/powerpc/platforms/pseries/Makefile
@@ -2,6 +2,7 @@ ccflags-$(CONFIG_PPC64)			:= $(NO_MINIMAL_TOC)
 ccflags-$(CONFIG_PPC_PSERIES_DEBUG)	+= -DDEBUG
 
 obj-y			:= lpar.o hvCall.o nvram.o reconfig.o \
+			   of_helpers.o \
 			   setup.o iommu.o event_sources.o ras.o \
 			   firmware.o power.o dlpar.o mobility.o rng.o
 obj-$(CONFIG_SMP)	+= smp.o
diff --git a/arch/powerpc/platforms/pseries/of_helpers.c b/arch/powerpc/platforms/pseries/of_helpers.c
new file mode 100644
index 0000000..1cbd896
--- /dev/null
+++ b/arch/powerpc/platforms/pseries/of_helpers.c
@@ -0,0 +1,38 @@
+#include <linux/string.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+
+#include "of_helpers.h"
+
+/**
+ * pseries_of_derive_parent - basically like dirname(1)
+ * @path:  the full_name of a node to be added to the tree
+ *
+ * Returns the node which should be the parent of the node
+ * described by path.  E.g., for path = "/foo/bar", returns
+ * the node with full_name = "/foo".
+ */
+struct device_node *pseries_of_derive_parent(const char *path)
+{
+	struct device_node *parent = NULL;
+	char *parent_path = "/";
+	size_t parent_path_len = strrchr(path, '/') - path + 1;
+
+	/* reject if path is "/" */
+	if (!strcmp(path, "/"))
+		return ERR_PTR(-EINVAL);
+
+	if (strrchr(path, '/') != path) {
+		parent_path = kmalloc(parent_path_len, GFP_KERNEL);
+		if (!parent_path)
+			return ERR_PTR(-ENOMEM);
+		strlcpy(parent_path, path, parent_path_len);
+	}
+	parent = of_find_node_by_path(parent_path);
+	if (!parent)
+		return ERR_PTR(-EINVAL);
+	if (strcmp(parent_path, "/"))
+		kfree(parent_path);
+	return parent;
+}
diff --git a/arch/powerpc/platforms/pseries/of_helpers.h b/arch/powerpc/platforms/pseries/of_helpers.h
new file mode 100644
index 0000000..bb83d39
--- /dev/null
+++ b/arch/powerpc/platforms/pseries/of_helpers.h
@@ -0,0 +1,8 @@
+#ifndef _PSERIES_OF_HELPERS_H
+#define _PSERIES_OF_HELPERS_H
+
+#include <linux/of.h>
+
+struct device_node *pseries_of_derive_parent(const char *path);
+
+#endif /* _PSERIES_OF_HELPERS_H */
diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c
index 0f31952..7c7fcc0 100644
--- a/arch/powerpc/platforms/pseries/reconfig.c
+++ b/arch/powerpc/platforms/pseries/reconfig.c
@@ -22,37 +22,7 @@
 #include <asm/uaccess.h>
 #include <asm/mmu.h>
 
-/**
- *	derive_parent - basically like dirname(1)
- *	@path:  the full_name of a node to be added to the tree
- *
- *	Returns the node which should be the parent of the node
- *	described by path.  E.g., for path = "/foo/bar", returns
- *	the node with full_name = "/foo".
- */
-static struct device_node *derive_parent(const char *path)
-{
-	struct device_node *parent = NULL;
-	char *parent_path = "/";
-	size_t parent_path_len = strrchr(path, '/') - path + 1;
-
-	/* reject if path is "/" */
-	if (!strcmp(path, "/"))
-		return ERR_PTR(-EINVAL);
-
-	if (strrchr(path, '/') != path) {
-		parent_path = kmalloc(parent_path_len, GFP_KERNEL);
-		if (!parent_path)
-			return ERR_PTR(-ENOMEM);
-		strlcpy(parent_path, path, parent_path_len);
-	}
-	parent = of_find_node_by_path(parent_path);
-	if (!parent)
-		return ERR_PTR(-EINVAL);
-	if (strcmp(parent_path, "/"))
-		kfree(parent_path);
-	return parent;
-}
+#include "of_helpers.h"
 
 static int pSeries_reconfig_add_node(const char *path, struct property *proplist)
 {
@@ -71,7 +41,7 @@ static int pSeries_reconfig_add_node(const char *path, struct property *proplist
 	of_node_set_flag(np, OF_DYNAMIC);
 	of_node_init(np);
 
-	np->parent = derive_parent(path);
+	np->parent = pseries_of_derive_parent(path);
 	if (IS_ERR(np->parent)) {
 		err = PTR_ERR(np->parent);
 		goto out_err;
-- 
2.4.6

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

* [PATCH 2/5] powerpc/pseries: fix a potential memory leak
  2015-08-04 14:36 [PATCH 1/5] powerpc/pseries: extract of_helpers module Andy Shevchenko
@ 2015-08-04 14:36 ` Andy Shevchenko
  2015-08-04 14:36 ` [PATCH 3/5] powerpc/pseries: don't call strrchr() twice Andy Shevchenko
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2015-08-04 14:36 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman; +Cc: Andy Shevchenko

In case we have a full node name like /foo/bar and /foo is not found the
parent_path left unfreed. So, free a memory before return to a caller.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 arch/powerpc/platforms/pseries/of_helpers.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/of_helpers.c b/arch/powerpc/platforms/pseries/of_helpers.c
index 1cbd896..2f363e3 100644
--- a/arch/powerpc/platforms/pseries/of_helpers.c
+++ b/arch/powerpc/platforms/pseries/of_helpers.c
@@ -15,7 +15,7 @@
  */
 struct device_node *pseries_of_derive_parent(const char *path)
 {
-	struct device_node *parent = NULL;
+	struct device_node *parent;
 	char *parent_path = "/";
 	size_t parent_path_len = strrchr(path, '/') - path + 1;
 
@@ -30,9 +30,7 @@ struct device_node *pseries_of_derive_parent(const char *path)
 		strlcpy(parent_path, path, parent_path_len);
 	}
 	parent = of_find_node_by_path(parent_path);
-	if (!parent)
-		return ERR_PTR(-EINVAL);
 	if (strcmp(parent_path, "/"))
 		kfree(parent_path);
-	return parent;
+	return parent ? parent : ERR_PTR(-EINVAL);
 }
-- 
2.4.6

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

* [PATCH 3/5] powerpc/pseries: don't call strrchr() twice
  2015-08-04 14:36 [PATCH 1/5] powerpc/pseries: extract of_helpers module Andy Shevchenko
  2015-08-04 14:36 ` [PATCH 2/5] powerpc/pseries: fix a potential memory leak Andy Shevchenko
@ 2015-08-04 14:36 ` Andy Shevchenko
  2015-08-04 14:36 ` [PATCH 4/5] powerpc/pseries: replace kmalloc + strlcpy Andy Shevchenko
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2015-08-04 14:36 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman; +Cc: Andy Shevchenko

There is no need to call strrchr() second time. We already know that in that
case parent_path_len either 1 ("/foo") or bigger ("/foo/bar").

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 arch/powerpc/platforms/pseries/of_helpers.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/platforms/pseries/of_helpers.c b/arch/powerpc/platforms/pseries/of_helpers.c
index 2f363e3..027446a 100644
--- a/arch/powerpc/platforms/pseries/of_helpers.c
+++ b/arch/powerpc/platforms/pseries/of_helpers.c
@@ -23,7 +23,7 @@ struct device_node *pseries_of_derive_parent(const char *path)
 	if (!strcmp(path, "/"))
 		return ERR_PTR(-EINVAL);
 
-	if (strrchr(path, '/') != path) {
+	if (parent_path_len > 1) {
 		parent_path = kmalloc(parent_path_len, GFP_KERNEL);
 		if (!parent_path)
 			return ERR_PTR(-ENOMEM);
-- 
2.4.6

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

* [PATCH 4/5] powerpc/pseries: replace kmalloc + strlcpy
  2015-08-04 14:36 [PATCH 1/5] powerpc/pseries: extract of_helpers module Andy Shevchenko
  2015-08-04 14:36 ` [PATCH 2/5] powerpc/pseries: fix a potential memory leak Andy Shevchenko
  2015-08-04 14:36 ` [PATCH 3/5] powerpc/pseries: don't call strrchr() twice Andy Shevchenko
@ 2015-08-04 14:36 ` Andy Shevchenko
  2015-08-04 14:36 ` [PATCH 5/5] powerpc/pseries: re-use code from of_helpers module Andy Shevchenko
  2015-08-05  5:20 ` [PATCH 1/5] powerpc/pseries: extract " Segher Boessenkool
  4 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2015-08-04 14:36 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman; +Cc: Andy Shevchenko

The helper kstrndup() will do the same in one line.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 arch/powerpc/platforms/pseries/of_helpers.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/of_helpers.c b/arch/powerpc/platforms/pseries/of_helpers.c
index 027446a..afa5555 100644
--- a/arch/powerpc/platforms/pseries/of_helpers.c
+++ b/arch/powerpc/platforms/pseries/of_helpers.c
@@ -24,10 +24,9 @@ struct device_node *pseries_of_derive_parent(const char *path)
 		return ERR_PTR(-EINVAL);
 
 	if (parent_path_len > 1) {
-		parent_path = kmalloc(parent_path_len, GFP_KERNEL);
+		parent_path = kstrndup(path, parent_path_len, GFP_KERNEL);
 		if (!parent_path)
 			return ERR_PTR(-ENOMEM);
-		strlcpy(parent_path, path, parent_path_len);
 	}
 	parent = of_find_node_by_path(parent_path);
 	if (strcmp(parent_path, "/"))
-- 
2.4.6

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

* [PATCH 5/5] powerpc/pseries: re-use code from of_helpers module
  2015-08-04 14:36 [PATCH 1/5] powerpc/pseries: extract of_helpers module Andy Shevchenko
                   ` (2 preceding siblings ...)
  2015-08-04 14:36 ` [PATCH 4/5] powerpc/pseries: replace kmalloc + strlcpy Andy Shevchenko
@ 2015-08-04 14:36 ` Andy Shevchenko
  2015-08-05  5:20 ` [PATCH 1/5] powerpc/pseries: extract " Segher Boessenkool
  4 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2015-08-04 14:36 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman; +Cc: Andy Shevchenko

The derive_parent() has similar semantics to what we have in newly introduced
of_helpers module. The replacement reduces code base and propagates the actual
error code to the caller.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 arch/powerpc/platforms/pseries/dlpar.c | 31 +++++--------------------------
 1 file changed, 5 insertions(+), 26 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
index 47d9cebe..b7f243c 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -18,6 +18,8 @@
 #include <linux/cpu.h>
 #include <linux/slab.h>
 #include <linux/of.h>
+
+#include "of_helpers.h"
 #include "offline_states.h"
 #include "pseries.h"
 
@@ -244,36 +246,13 @@ cc_error:
 	return first_dn;
 }
 
-static struct device_node *derive_parent(const char *path)
-{
-	struct device_node *parent;
-	char *last_slash;
-
-	last_slash = strrchr(path, '/');
-	if (last_slash == path) {
-		parent = of_find_node_by_path("/");
-	} else {
-		char *parent_path;
-		int parent_path_len = last_slash - path + 1;
-		parent_path = kmalloc(parent_path_len, GFP_KERNEL);
-		if (!parent_path)
-			return NULL;
-
-		strlcpy(parent_path, path, parent_path_len);
-		parent = of_find_node_by_path(parent_path);
-		kfree(parent_path);
-	}
-
-	return parent;
-}
-
 int dlpar_attach_node(struct device_node *dn)
 {
 	int rc;
 
-	dn->parent = derive_parent(dn->full_name);
-	if (!dn->parent)
-		return -ENOMEM;
+	dn->parent = pseries_of_derive_parent(dn->full_name);
+	if (IS_ERR(dn->parent))
+		return PTR_ERR(dn_parent);
 
 	rc = of_attach_node(dn);
 	if (rc) {
-- 
2.4.6

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

* Re: [PATCH 1/5] powerpc/pseries: extract of_helpers module
  2015-08-04 14:36 [PATCH 1/5] powerpc/pseries: extract of_helpers module Andy Shevchenko
                   ` (3 preceding siblings ...)
  2015-08-04 14:36 ` [PATCH 5/5] powerpc/pseries: re-use code from of_helpers module Andy Shevchenko
@ 2015-08-05  5:20 ` Segher Boessenkool
  2015-08-05  9:32   ` Andy Shevchenko
  4 siblings, 1 reply; 8+ messages in thread
From: Segher Boessenkool @ 2015-08-05  5:20 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman

Hi Andy,

On Tue, Aug 04, 2015 at 05:36:45PM +0300, Andy Shevchenko wrote:
> +struct device_node *pseries_of_derive_parent(const char *path)
> +{
> +	struct device_node *parent = NULL;
> +	char *parent_path = "/";
> +	size_t parent_path_len = strrchr(path, '/') - path + 1;
> +
> +	/* reject if path is "/" */
> +	if (!strcmp(path, "/"))
> +		return ERR_PTR(-EINVAL);
> +
> +	if (strrchr(path, '/') != path) {
> +		parent_path = kmalloc(parent_path_len, GFP_KERNEL);

If path doesn't contain any slash this will do interesting things;
you might want to fix that too while you're at it :-)


Segher

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

* Re: [PATCH 1/5] powerpc/pseries: extract of_helpers module
  2015-08-05  5:20 ` [PATCH 1/5] powerpc/pseries: extract " Segher Boessenkool
@ 2015-08-05  9:32   ` Andy Shevchenko
  2015-08-05 17:20     ` Segher Boessenkool
  0 siblings, 1 reply; 8+ messages in thread
From: Andy Shevchenko @ 2015-08-05  9:32 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman

On Wed, 2015-08-05 at 00:20 -0500, Segher Boessenkool wrote:
> Hi Andy,
> 
> On Tue, Aug 04, 2015 at 05:36:45PM +0300, Andy Shevchenko wrote:
> > +struct device_node *pseries_of_derive_parent(const char *path)
> > +{
> > +	struct device_node *parent = NULL;
> > +	char *parent_path = "/";
> > +	size_t parent_path_len = strrchr(path, '/') - path + 1;
> > +
> > +	/* reject if path is "/" */
> > +	if (!strcmp(path, "/"))
> > +		return ERR_PTR(-EINVAL);
> > +
> > +	if (strrchr(path, '/') != path) {
> > +		parent_path = kmalloc(parent_path_len, 
> > GFP_KERNEL);
> 
> If path doesn't contain any slash this will do interesting things;
> you might want to fix that too while you're at it :-)

No problem, though it is in the original code. I would do as a separate
patch on top of the series. Will be okay for you?

> 
> 
> Segher

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

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

* Re: [PATCH 1/5] powerpc/pseries: extract of_helpers module
  2015-08-05  9:32   ` Andy Shevchenko
@ 2015-08-05 17:20     ` Segher Boessenkool
  0 siblings, 0 replies; 8+ messages in thread
From: Segher Boessenkool @ 2015-08-05 17:20 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Benjamin Herrenschmidt, linuxppc-dev, Michael Ellerman

On Wed, Aug 05, 2015 at 12:32:55PM +0300, Andy Shevchenko wrote:
> > If path doesn't contain any slash this will do interesting things;
> > you might want to fix that too while you're at it :-)
> 
> No problem, though it is in the original code. I would do as a separate
> patch on top of the series. Will be okay for you?

Of course -- you're fixing other problems here as well (memory leak
or what was it), that's why I asked.


Segher

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

end of thread, other threads:[~2015-08-05 17:21 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-04 14:36 [PATCH 1/5] powerpc/pseries: extract of_helpers module Andy Shevchenko
2015-08-04 14:36 ` [PATCH 2/5] powerpc/pseries: fix a potential memory leak Andy Shevchenko
2015-08-04 14:36 ` [PATCH 3/5] powerpc/pseries: don't call strrchr() twice Andy Shevchenko
2015-08-04 14:36 ` [PATCH 4/5] powerpc/pseries: replace kmalloc + strlcpy Andy Shevchenko
2015-08-04 14:36 ` [PATCH 5/5] powerpc/pseries: re-use code from of_helpers module Andy Shevchenko
2015-08-05  5:20 ` [PATCH 1/5] powerpc/pseries: extract " Segher Boessenkool
2015-08-05  9:32   ` Andy Shevchenko
2015-08-05 17:20     ` Segher Boessenkool

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