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