From: Frank Rowand <frowand.list@gmail.com>
To: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Cc: Rob Herring <robh@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Amitoj Kaur Chawla <amitoj1606@gmail.com>,
Grant Likely <grant.likely@linaro.org>,
Devicetree List <devicetree@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
julia.lawall@lip6.fr
Subject: Re: [PATCH] of: resolver: Add missing of_node_put
Date: Fri, 29 Jan 2016 15:46:48 -0800 [thread overview]
Message-ID: <56ABF9E8.2080609@gmail.com> (raw)
In-Reply-To: <C95DDB58-2BFB-42FA-BB00-0CE130CE90BC@konsulko.com>
On 1/29/2016 9:33 AM, Pantelis Antoniou wrote:
> Hi Rob,
>
>> On Jan 29, 2016, at 18:45 , Rob Herring <robh@kernel.org> wrote:
>>
>> On Wed, Jan 27, 2016 at 06:14:00PM +0200, Pantelis Antoniou wrote:
>>> Hi Mark,
>>>
>>>> On Jan 27, 2016, at 18:05 , Mark Rutland <mark.rutland@arm.com> wrote:
>>>>
>>>> On Wed, Jan 27, 2016 at 08:50:17PM +0530, Amitoj Kaur Chawla wrote:
>>>>> for_each_child_of_node performs an of_node_get on each iteration, so
>>>>> to break out of the loop an of_node_put is required.
>>>>>
>>>>> Found using Coccinelle. The semantic patch used for this is as follows:
>>>>>
>>>>> // <smpl>
>>>>> @@
>>>>> expression e;
>>>>> local idexpression n;
>>>>> @@
>>>>>
>>>>> for_each_child_of_node(..., n) {
>>>>> ... when != of_node_put(n)
>>>>> when != e = n
>>>>> (
>>>>> return n;
>>>>> |
>>>>> + of_node_put(n);
>>>>> ? return ...;
>>>>> )
>>>>> ...
>>>>> }
>>>>> // </smpl
>>>>>
>>>>> Signed-off-by: Amitoj Kaur Chawla <amitoj1606@gmail.com>
>>>>> ---
>>>>> drivers/of/resolver.c | 4 +++-
>>>>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
>>>>> index 640eb4c..e2a0143 100644
>>>>> --- a/drivers/of/resolver.c
>>>>> +++ b/drivers/of/resolver.c
>>>>> @@ -40,8 +40,10 @@ static struct device_node *__of_find_node_by_full_name(struct device_node *node,
>>>>>
>>>>> for_each_child_of_node(node, child) {
>>>>> found = __of_find_node_by_full_name(child, full_name);
>>>>> - if (found != NULL)
>>>>> + if (found != NULL) {
>>>>> + of_node_put(child);
>>>>> return found;
>>>>> + }
>>>>> }
>>>>>
>>>>> return NULL;
>>>>
>>>> I don't think this is quite right. When child == found, this change will
>>>> leave it decremented.
>>>>
>>>
>>>
>>> This patch is bogus.
>>>
>>> __of_find_node_by_full_name() is not taking a reference on the node if found.
>>> This method relies on keeping the reference taken by the loop.
>>>
>>> Taking this into account all of these conccinelle tests are bogus.
>>>
>>> The DT internal method are not using the object model in an obvious manner
>>> and applying these patches without vetting each and everyone is bound to
>>> break things.
>>
>> Things are already broken. But does it matter?
>>
>> Our time would be better spent re-designing any refcounting around where
>> we actually need it rather than trying to fix up the many locations
>> which are wrong and don't matter. As long as it is callers'
>> responsibility to get this right, it will never be right. Even the core
>> code has a hard time getting it right.
>>
>
> Let me pile up. Refcounting for DT is broken. There’s no point trying to fix
> it as it is. I have a big pile of TODO, one of these is fixing (as in severely
> cutting down) the areas where refcounting is needed.
May as well violently agree.
An additional way that DT refcounting is architecturally broken is the concept
of using a held refcount as a lock substitute while traversing a linked list.
Fixing this is on my todo list, hopefully late this winter or early spring.
>
> The idea would be to keep refcounting only in core and provide interfaces that
> use different semantics for drivers and subsystems.
>
> We can discuss things in ELC this April, perhaps on a BoF session again.
Yes, all interested people please come discuss things with us. I have
submitted a BoF proposal.
-Frank
>
>
>> Rob
>
> Regards
>
> — Pantelis
>
>
prev parent reply other threads:[~2016-01-29 23:46 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-27 15:20 [PATCH] of: resolver: Add missing of_node_put Amitoj Kaur Chawla
2016-01-27 16:05 ` Mark Rutland
2016-01-27 16:14 ` Pantelis Antoniou
[not found] ` <FE79FA58-A084-47BE-B872-7D57AC2B4D75-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>
2016-01-27 16:21 ` Mark Rutland
2016-01-27 18:02 ` Pantelis Antoniou
2016-01-27 19:48 ` Julia Lawall
2016-01-28 11:28 ` Mark Rutland
2016-01-28 11:36 ` Julia Lawall
[not found] ` <FF19B941-89E4-4954-9818-E352FE9A0E97-OWPKS81ov/FWk0Htik3J/w@public.gmane.org>
2016-01-27 22:32 ` Julia Lawall
2016-01-29 16:45 ` Rob Herring
2016-01-29 17:33 ` Pantelis Antoniou
2016-01-29 23:46 ` Frank Rowand [this message]
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=56ABF9E8.2080609@gmail.com \
--to=frowand.list@gmail.com \
--cc=amitoj1606@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=grant.likely@linaro.org \
--cc=julia.lawall@lip6.fr \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=pantelis.antoniou@konsulko.com \
--cc=robh@kernel.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 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).