All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frank Rowand <frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Grant Likely <grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	David Daney <david.daney-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>,
	Pantelis Antoniou
	<pantelis.antoniou-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>
Subject: Re: [PATCH 2/3] of: Make of_find_node_by_path() handle /aliases
Date: Tue, 20 May 2014 19:41:22 -0700	[thread overview]
Message-ID: <537C1252.3090900@gmail.com> (raw)
In-Reply-To: <20140518092730.109AAC40B8A-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>

On 5/18/2014 2:27 AM, Grant Likely wrote:

> On Fri, 16 May 2014 11:54:44 +0100, Grant Likely <grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> wrote:

>> On Thu, 15 May 2014 19:51:17 -0700, Frank Rowand <frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

>>> On 5/13/2014 7:58 AM, Grant Likely wrote:

>>>> Make of_find_node_by_path() handle aliases as prefixes. To make this

>>>> work the name search is refactored to search by path component instead

>>>> of by full string. This should be a more efficient search, and it makes

>>>> it possible to start a search at a subnode of a tree.

>>>>

>>>> Signed-off-by: David Daney <david.daney-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>

>>>> Signed-off-by: Pantelis Antoniou <pantelis.antoniou-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>

>>>> [grant.likely: Rework to not require allocating at runtime]

>>>> Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

>>>> Signed-off-by: Grant Likely <grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>

>>>> ---

>>>>  drivers/of/base.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++----

>>>>  1 file changed, 56 insertions(+), 4 deletions(-)

>>>>

>>>> diff --git a/drivers/of/base.c b/drivers/of/base.c

>>>> index 6e240698353b..60089b9a3014 100644

>>>> --- a/drivers/of/base.c

>>>> +++ b/drivers/of/base.c

>>>> @@ -771,9 +771,38 @@ struct device_node *of_get_child_by_name(const struct device_node *node,

>>>>  }

>>>>  EXPORT_SYMBOL(of_get_child_by_name);

>>>>  

>>>> +static struct device_node *__of_find_node_by_path(struct device_node *parent,

>>>> +						const char *path)

>>>> +{

>>>> +	struct device_node *child;

>>>> +	int len = strchrnul(path, '/') - path;

>>>> +

>>>> +	if (!len)

>>>> +		return parent;

>>>

>>> (!len) is true if the the final character of the path passed into of_find_node_by_path()

>>> was "/".  Strictly speaking, ->full_name will never end with "/", so the return value

>>> should be NULL, indicating that the match fails.

>>

>> Ah, good catch. I should add a test case for that.

> 

> In my testing this looks okay. The while loop that calls into

> __of_find_node_by_path() looks like this:

> 

> 	while (np && *path == '/') {

> 		path++; /* Increment past '/' delimiter */

> 		np = __of_find_node_by_path(np, path);

> 		path = strchrnul(path, '/');

> 	}

> 

> If the path ends with a '/', then the loop will go around one more time.

> The pointer will be incremented to point at the null character and len

> will be null because strchrnul() will point at the last item.



Yes, that was my point.  The old version of of_find_node_by_path() would not

find a match if the path ended with a "/" (unless the full path was "/").

This patch series changes the behavior to be a match.


I will reply to this email with an additional patch that restores the

original behavior.


If you move the additional test cases you provide below and the test cases

in patch 3 to the beginning of the series, you can see the before and after

behavior of adding patch 1 and patch 2.


> 

> I've added a couple of test cases to make sure it works correctly:

> 

> diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c

> index a9d00e8c17ea..10900b18fc06 100644

> --- a/drivers/of/selftest.c

> +++ b/drivers/of/selftest.c

> @@ -40,6 +40,12 @@ static void __init of_selftest_find_node_by_name(void)

>  	 	"find /testcase-data failed\n");

>  	of_node_put(np);

>  

> +	/* Test if trailing '/' works */

> +	np = of_find_node_by_path("/testcase-data/");

> +	selftest(np && !strcmp("/testcase-data", np->full_name),

> +	 	"find /testcase-data/ failed\n");

> +	of_node_put(np);

> +

>  	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");

>  	selftest(np && !strcmp("/testcase-data/phandle-tests/consumer-a", np->full_name),

>  	 	"find /testcase-data/phandle-tests/consumer-a failed\n");

> @@ -50,6 +56,12 @@ static void __init of_selftest_find_node_by_name(void)

>  	 	"find testcase-alias failed\n");

>  	of_node_put(np);

>  

> +	/* Test if trailing '/' works on aliases */

> +	np = of_find_node_by_path("testcase-alias/");

> +	selftest(np && !strcmp("/testcase-data", np->full_name),

> +	 	"find testcase-alias/ failed\n");

> +	of_node_put(np);

> +

>  	np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a");

>  	selftest(np && !strcmp("/testcase-data/phandle-tests/consumer-a", np->full_name),

>  	 	"find testcase-alias/phandle-tests/consumer-a failed\n");

> 

> g.

> 

> 

>>

>>>

>>>> +

>>>> +	for_each_child_of_node(parent, child) {

>>>> +		const char *name = strrchr(child->full_name, '/');

>>>> +		if (WARN(!name, "malformed device_node %s\n", child->full_name))

>>>> +			continue;

>>>> +		name++;


< snip >

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: Frank Rowand <frowand.list@gmail.com>
To: Grant Likely <grant.likely@linaro.org>
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	David Daney <david.daney@cavium.com>,
	Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Subject: Re: [PATCH 2/3] of: Make of_find_node_by_path() handle /aliases
Date: Tue, 20 May 2014 19:41:22 -0700	[thread overview]
Message-ID: <537C1252.3090900@gmail.com> (raw)
In-Reply-To: <20140518092730.109AAC40B8A@trevor.secretlab.ca>

On 5/18/2014 2:27 AM, Grant Likely wrote:

> On Fri, 16 May 2014 11:54:44 +0100, Grant Likely <grant.likely@linaro.org> wrote:

>> On Thu, 15 May 2014 19:51:17 -0700, Frank Rowand <frowand.list@gmail.com> wrote:

>>> On 5/13/2014 7:58 AM, Grant Likely wrote:

>>>> Make of_find_node_by_path() handle aliases as prefixes. To make this

>>>> work the name search is refactored to search by path component instead

>>>> of by full string. This should be a more efficient search, and it makes

>>>> it possible to start a search at a subnode of a tree.

>>>>

>>>> Signed-off-by: David Daney <david.daney@cavium.com>

>>>> Signed-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>

>>>> [grant.likely: Rework to not require allocating at runtime]

>>>> Acked-by: Rob Herring <robh@kernel.org>

>>>> Signed-off-by: Grant Likely <grant.likely@linaro.org>

>>>> ---

>>>>  drivers/of/base.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++----

>>>>  1 file changed, 56 insertions(+), 4 deletions(-)

>>>>

>>>> diff --git a/drivers/of/base.c b/drivers/of/base.c

>>>> index 6e240698353b..60089b9a3014 100644

>>>> --- a/drivers/of/base.c

>>>> +++ b/drivers/of/base.c

>>>> @@ -771,9 +771,38 @@ struct device_node *of_get_child_by_name(const struct device_node *node,

>>>>  }

>>>>  EXPORT_SYMBOL(of_get_child_by_name);

>>>>  

>>>> +static struct device_node *__of_find_node_by_path(struct device_node *parent,

>>>> +						const char *path)

>>>> +{

>>>> +	struct device_node *child;

>>>> +	int len = strchrnul(path, '/') - path;

>>>> +

>>>> +	if (!len)

>>>> +		return parent;

>>>

>>> (!len) is true if the the final character of the path passed into of_find_node_by_path()

>>> was "/".  Strictly speaking, ->full_name will never end with "/", so the return value

>>> should be NULL, indicating that the match fails.

>>

>> Ah, good catch. I should add a test case for that.

> 

> In my testing this looks okay. The while loop that calls into

> __of_find_node_by_path() looks like this:

> 

> 	while (np && *path == '/') {

> 		path++; /* Increment past '/' delimiter */

> 		np = __of_find_node_by_path(np, path);

> 		path = strchrnul(path, '/');

> 	}

> 

> If the path ends with a '/', then the loop will go around one more time.

> The pointer will be incremented to point at the null character and len

> will be null because strchrnul() will point at the last item.



Yes, that was my point.  The old version of of_find_node_by_path() would not

find a match if the path ended with a "/" (unless the full path was "/").

This patch series changes the behavior to be a match.


I will reply to this email with an additional patch that restores the

original behavior.


If you move the additional test cases you provide below and the test cases

in patch 3 to the beginning of the series, you can see the before and after

behavior of adding patch 1 and patch 2.


> 

> I've added a couple of test cases to make sure it works correctly:

> 

> diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c

> index a9d00e8c17ea..10900b18fc06 100644

> --- a/drivers/of/selftest.c

> +++ b/drivers/of/selftest.c

> @@ -40,6 +40,12 @@ static void __init of_selftest_find_node_by_name(void)

>  	 	"find /testcase-data failed\n");

>  	of_node_put(np);

>  

> +	/* Test if trailing '/' works */

> +	np = of_find_node_by_path("/testcase-data/");

> +	selftest(np && !strcmp("/testcase-data", np->full_name),

> +	 	"find /testcase-data/ failed\n");

> +	of_node_put(np);

> +

>  	np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");

>  	selftest(np && !strcmp("/testcase-data/phandle-tests/consumer-a", np->full_name),

>  	 	"find /testcase-data/phandle-tests/consumer-a failed\n");

> @@ -50,6 +56,12 @@ static void __init of_selftest_find_node_by_name(void)

>  	 	"find testcase-alias failed\n");

>  	of_node_put(np);

>  

> +	/* Test if trailing '/' works on aliases */

> +	np = of_find_node_by_path("testcase-alias/");

> +	selftest(np && !strcmp("/testcase-data", np->full_name),

> +	 	"find testcase-alias/ failed\n");

> +	of_node_put(np);

> +

>  	np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a");

>  	selftest(np && !strcmp("/testcase-data/phandle-tests/consumer-a", np->full_name),

>  	 	"find testcase-alias/phandle-tests/consumer-a failed\n");

> 

> g.

> 

> 

>>

>>>

>>>> +

>>>> +	for_each_child_of_node(parent, child) {

>>>> +		const char *name = strrchr(child->full_name, '/');

>>>> +		if (WARN(!name, "malformed device_node %s\n", child->full_name))

>>>> +			continue;

>>>> +		name++;


< snip >


  parent reply	other threads:[~2014-05-21  2:41 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-13 14:58 [PATCH 0/3] Rework of_find_node_by_path() code Grant Likely
2014-05-13 14:58 ` [PATCH 1/3] lib: add glibc style strchrnul() variant Grant Likely
2014-05-15 22:19   ` Frank Rowand
2014-05-16 15:00     ` Grant Likely
2014-05-13 14:58 ` [PATCH 2/3] of: Make of_find_node_by_path() handle /aliases Grant Likely
2014-05-16  2:51   ` Frank Rowand
     [not found]     ` <53757D25.1060005-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-05-16 10:54       ` Grant Likely
2014-05-16 10:54         ` Grant Likely
2014-05-18  9:27         ` Grant Likely
     [not found]           ` <20140518092730.109AAC40B8A-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-05-21  2:41             ` Frank Rowand [this message]
2014-05-21  2:41               ` Frank Rowand
     [not found]               ` <537C1252.3090900-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-05-21  2:46                 ` Frank Rowand
2014-05-21  2:46                   ` Frank Rowand
2014-05-22  3:13                   ` Grant Likely
     [not found]                     ` <20140522031306.DD6B7C41847-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-05-23  0:53                       ` Frank Rowand
2014-05-23  0:53                         ` Frank Rowand
2014-05-22  1:16               ` Grant Likely
     [not found]                 ` <20140522011600.C0014C40B13-WNowdnHR2B42iJbIjFUEsiwD8/FfD2ys@public.gmane.org>
2014-05-23  1:14                   ` Frank Rowand
2014-05-23  1:14                     ` Frank Rowand
2014-05-23 21:13                     ` Grant Likely
     [not found]   ` <1399993115-21552-3-git-send-email-grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2014-05-21  2:55     ` Frank Rowand
2014-05-21  2:55       ` Frank Rowand
2014-05-21 16:09       ` Grant Likely
2014-05-22  1:27         ` Frank Rowand
     [not found] ` <1399993115-21552-1-git-send-email-grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2014-05-13 14:58   ` [PATCH 3/3] of: Add a testcase for of_find_node_by_path() Grant Likely
2014-05-13 14:58     ` Grant Likely

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=537C1252.3090900@gmail.com \
    --to=frowand.list-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=david.daney-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=pantelis.antoniou-OWPKS81ov/FWk0Htik3J/w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.