Message ID | 20180822105547.9634-2-johan@kernel.org |
---|---|
State | Superseded, archived |
Headers | show |
Series | of: fix compatible-child-node lookups | expand |
Hi Johan, I love your patch! Yet something to improve: [auto build test ERROR on robh/for-next] [also build test ERROR on v4.18 next-20180822] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Johan-Hovold/of-fix-compatible-child-node-lookups/20180823-074211 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next config: mips-decstation_defconfig (attached as .config) compiler: mipsel-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=7.2.0 make.cross ARCH=mips All errors (new ones prefixed by >>): In file included from include/linux/irqdomain.h:35:0, from arch/mips/include/asm/irq.h:14, from include/linux/irq.h:23, from include/asm-generic/hardirq.h:13, from arch/mips/include/asm/hardirq.h:16, from include/linux/hardirq.h:9, from include/linux/interrupt.h:11, from arch/mips/dec/ecc-berr.c:16: >> include/linux/of.h:637:28: error: 'of_get_compatible_child' defined but not used [-Werror=unused-function] static struct device_node *of_get_compatible_child(const struct device_node *parent, ^~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors vim +/of_get_compatible_child +637 include/linux/of.h 636 > 637 static struct device_node *of_get_compatible_child(const struct device_node *parent, 638 const char *compatible) 639 { 640 return NULL; 641 } 642 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
On Thu, Aug 23, 2018 at 11:17:26AM +0800, kbuild test robot wrote: > Hi Johan, > > I love your patch! Yet something to improve: > > [auto build test ERROR on robh/for-next] > [also build test ERROR on v4.18 next-20180822] > [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] > > url: https://github.com/0day-ci/linux/commits/Johan-Hovold/of-fix-compatible-child-node-lookups/20180823-074211 > base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next > config: mips-decstation_defconfig (attached as .config) > compiler: mipsel-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 > reproduce: > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # save the attached .config to linux build tree > GCC_VERSION=7.2.0 make.cross ARCH=mips > > All errors (new ones prefixed by >>): > > In file included from include/linux/irqdomain.h:35:0, > from arch/mips/include/asm/irq.h:14, > from include/linux/irq.h:23, > from include/asm-generic/hardirq.h:13, > from arch/mips/include/asm/hardirq.h:16, > from include/linux/hardirq.h:9, > from include/linux/interrupt.h:11, > from arch/mips/dec/ecc-berr.c:16: > >> include/linux/of.h:637:28: error: 'of_get_compatible_child' defined but not used [-Werror=unused-function] > static struct device_node *of_get_compatible_child(const struct device_node *parent, > ^~~~~~~~~~~~~~~~~~~~~~~ > cc1: all warnings being treated as errors Bah, I forgot the inline keyword. I'll fix this in a v2, and I can amend the commit message and mention the start node while at it. Johan
diff --git a/drivers/of/base.c b/drivers/of/base.c index 466e3c8582f0..bc420d2aa5f5 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -719,6 +719,31 @@ struct device_node *of_get_next_available_child(const struct device_node *node, } EXPORT_SYMBOL(of_get_next_available_child); +/** + * of_get_compatible_child - Find compatible child node + * @parent: parent node + * @compatible: compatible string + * + * Lookup child node whose compatible property contains the given compatible + * string. + * + * Returns a node pointer with refcount incremented, use of_node_put() on it + * when done; or NULL if not found. + */ +struct device_node *of_get_compatible_child(const struct device_node *parent, + const char *compatible) +{ + struct device_node *child; + + for_each_child_of_node(parent, child) { + if (of_device_is_compatible(child, compatible)) + break; + } + + return child; +} +EXPORT_SYMBOL(of_get_compatible_child); + /** * of_get_child_by_name - Find the child node by name for a given parent * @node: parent node diff --git a/include/linux/of.h b/include/linux/of.h index 4d25e4f952d9..c22982fc1bff 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -290,6 +290,8 @@ extern struct device_node *of_get_next_child(const struct device_node *node, extern struct device_node *of_get_next_available_child( const struct device_node *node, struct device_node *prev); +extern struct device_node *of_get_compatible_child(const struct device_node *parent, + const char *compatible); extern struct device_node *of_get_child_by_name(const struct device_node *node, const char *name); @@ -632,6 +634,12 @@ static inline bool of_have_populated_dt(void) return false; } +static struct device_node *of_get_compatible_child(const struct device_node *parent, + const char *compatible) +{ + return NULL; +} + static inline struct device_node *of_get_child_by_name( const struct device_node *node, const char *name)
Add of_get_compatible_child() helper that can be used to lookup compatible child nodes. Several drivers currently use of_find_compatible_node() to lookup child nodes while failing to notice that the of_find_ functions search the entire tree depth-first and therefore can match unrelated (non-child) nodes. The fact that these functions also drop a reference to the node they start searching from (e.g. the parent node) is typically also overlooked, something which can lead to use-after-free bugs. Signed-off-by: Johan Hovold <johan@kernel.org> --- drivers/of/base.c | 25 +++++++++++++++++++++++++ include/linux/of.h | 8 ++++++++ 2 files changed, 33 insertions(+)