From mboxrd@z Thu Jan 1 00:00:00 1970 From: Julia Lawall Date: Thu, 22 Oct 2015 13:19:43 +0000 Subject: Re: [PATCH 0/4] add missing of_node_put Message-Id: List-Id: References: <1445504571-19838-1-git-send-email-Julia.Lawall@lip6.fr> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Rob Herring Cc: Russell King - ARM Linux , kernel-janitors-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Frank Rowand , Grant Likely , "devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , "linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" On Thu, 22 Oct 2015, Rob Herring wrote: > +Russell who raised issues with these iterators recently. > > On Thu, Oct 22, 2015 at 4:02 AM, Julia Lawall wrote: > > The various for_each device_node iterators performs an of_node_get on each > > iteration, so a break out of the loop requires an of_node_put. > > Thanks for this. > > Are there any plans to use coccinelle as a checker that developers can > run to be warned of these problems? There are three issues I have found so far: 1. of_node_put before a continue 2. missing of_node_put before a break 3. missing of_node get before some more permanent storage of the value The semantic patches for the first two seem to be working pretty well, so I could submit them for integration into the kernel. The third one, I have only looked at in an ad hoc way so far. julia > > Rob > > > The complete semantic patch that fixes this problem is > > (http://coccinelle.lip6.fr): > > > > // > > @r@ > > local idexpression n; > > expression e1,e2; > > iterator name for_each_node_by_name, for_each_node_by_type, > > for_each_compatible_node, for_each_matching_node, > > for_each_matching_node_and_match, for_each_child_of_node, > > for_each_available_child_of_node, for_each_node_with_property; > > iterator i; > > statement S; > > expression list [n1] es; > > @@ > > > > ( > > ( > > for_each_node_by_name(n,e1) S > > | > > for_each_node_by_type(n,e1) S > > | > > for_each_compatible_node(n,e1,e2) S > > | > > for_each_matching_node(n,e1) S > > | > > for_each_matching_node_and_match(n,e1,e2) S > > | > > for_each_child_of_node(e1,n) S > > | > > for_each_available_child_of_node(e1,n) S > > | > > for_each_node_with_property(n,e1) S > > ) > > & > > i(es,n,...) S > > ) > > > > @@ > > local idexpression r.n; > > iterator r.i; > > expression e; > > expression list [r.n1] es; > > @@ > > > > i(es,n,...) { > > ... > > ( > > of_node_put(n); > > | > > e = n > > | > > return n; > > | > > + of_node_put(n); > > ? return ...; > > ) > > ... > > } > > > > @@ > > local idexpression r.n; > > iterator r.i; > > expression e; > > expression list [r.n1] es; > > @@ > > > > i(es,n,...) { > > ... > > ( > > of_node_put(n); > > | > > e = n > > | > > + of_node_put(n); > > ? break; > > ) > > ... > > } > > ... when != n > > > > @@ > > local idexpression r.n; > > iterator r.i; > > expression e; > > identifier l; > > expression list [r.n1] es; > > @@ > > > > i(es,n,...) { > > ... > > ( > > of_node_put(n); > > | > > e = n > > | > > + of_node_put(n); > > ? goto l; > > ) > > ... > > } > > ... > > l: ... when != n// > > > > --- > > > > drivers/of/irq.c | 7 +++++-- > > drivers/of/overlay.c | 5 ++++- > > drivers/of/platform.c | 8 ++++++-- > > drivers/of/unittest.c | 8 ++++++-- > > 4 files changed, 21 insertions(+), 7 deletions(-) > -- > To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >