Hi Niklas,
On Mon, Aug 21, 2017 at 2:51 PM, Niklas Söderlund
<[email protected]> wrote:
> Using CONFIG_OF_DYNAMIC=y uncovered an imbalance in the usecount of the
> node being passed to of_fwnode_graph_get_port_parent(). Preserve the
> usecount just like it is done in of_graph_get_port_parent().
>
> Fixes: 3b27d00e7b6d7c88 ("device property: Move fwnode graph ops to firmware
> specific locations")
> Signed-off-by: Niklas Söderlund <[email protected]>
> ---
> drivers/of/property.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/of/property.c b/drivers/of/property.c
> index 067f9fab7b77c794..637dcb4833e2af60 100644
> --- a/drivers/of/property.c
> +++ b/drivers/of/property.c
> @@ -922,6 +922,12 @@ of_fwnode_graph_get_port_parent(struct fwnode_handle
> *fwnode)
> {
> struct device_node *np;
>
> + /*
> + * Preserve usecount for passed in node as of_get_next_parent()
> + * will do of_node_put() on it.
> + */
> + of_node_get(to_of_node(fwnode));
> +
> /* Get the parent of the port */
> np = of_get_next_parent(to_of_node(fwnode));
> if (!np)
FWIW, I'd use "np" to store the intermediate value:
struct device_node *np = to_of_node(fwnode);
/*
* Preserve usecount for passed in node as of_get_next_parent()
* will do of_node_put() on it.
*/
of_node_get(np);
/* Get the parent of the port */
np = of_get_next_parent(np);
Alternatively, perhaps to_of_node() should increment the refcount and
call of_node_get()? Oh, there's (static) of_fwnode_get(), too.
Is drivers/iommu/iommu.c:iommu_fwspec_init() really the only place outside
drivers/of/property.c that calls of_node_get() on a node obtained by
to_of_node()?
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds