Patch "ARM: OMAP2+: Fix device node reference counts" has been added to the 4.4-stable tree
Subsystems (5)
This is a note to let you know that I've just added the patch titled
ARM: OMAP2+: Fix device node reference counts
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
arm-omap2-fix-device-node-reference-counts.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Dec 12 13:38:50 CET 2017
From: Guenter Roeck <[email protected]>
Date: Sat, 4 Mar 2017 07:02:10 -0800
Subject: ARM: OMAP2+: Fix device node reference counts
From: Guenter Roeck <[email protected]>
[ Upstream commit 10e5778f54765c96fe0c8f104b7a030e5b35bc72 ]
After commit 0549bde0fcb1 ("of: fix of_node leak caused in of_find_node_opts_by_path"), the following error may be reported when running omap images.
OF: ERROR: Bad of_node_put() on /ocp@68000000
CPU: 0 PID: 0 Comm: swapper Not tainted 4.10.0-rc7-next-20170210 #1 Hardware name: Generic OMAP3-GP (Flattened Device Tree) [<c0310604>] (unwind_backtrace) from [<c030bbf4>] (show_stack+0x10/0x14) [<c030bbf4>] (show_stack) from [<c05add8c>] (dump_stack+0x98/0xac) [<c05add8c>] (dump_stack) from [<c05af1b0>] (kobject_release+0x48/0x7c) [<c05af1b0>] (kobject_release) from [<c0ad1aa4>] (of_find_node_by_name+0x74/0x94) [<c0ad1aa4>] (of_find_node_by_name) from [<c1215bd4>] (omap3xxx_hwmod_is_hs_ip_block_usable+0x24/0x2c) [<c1215bd4>] (omap3xxx_hwmod_is_hs_ip_block_usable) from [<c1215d5c>] (omap3xxx_hwmod_init+0x180/0x274) [<c1215d5c>] (omap3xxx_hwmod_init) from [<c120faa8>] (omap3_init_early+0xa0/0x11c) [<c120faa8>] (omap3_init_early) from [<c120fb2c>] (omap3430_init_early+0x8/0x30) [<c120fb2c>] (omap3430_init_early) from [<c1204710>] (setup_arch+0xc04/0xc34)
[<c1204710>] (setup_arch) from [<c1200948>] (start_kernel+0x68/0x38c) [<c1200948>] (start_kernel) from [<8020807c>] (0x8020807c)
of_find_node_by_name() drops the reference to the passed device node. The commit referenced above exposes this problem.
To fix the problem, use of_get_child_by_name() instead of of_find_node_by_name(); of_get_child_by_name() does not drop the reference count of passed device nodes. While semantically different, we only look for immediate children of the passed device node, so of_get_child_by_name() is a more appropriate function to use anyway.
Release the reference to the device node obtained with of_get_child_by_name() after it is no longer needed to avoid another device node leak.
While at it, clean up the code and change the return type of omap3xxx_hwmod_is_hs_ip_block_usable() to bool to match its use and the return type of of_device_is_available().
--- arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +10 -6
@@ -3885,16 +3885,20 @@ static struct omap_hwmod_ocp_if *omap3xx* Return: 0 if device named @dev_name is not likely to be accessible, * or 1 if it is likely to be accessible. */ -static int __init omap3xxx_hwmod_is_hs_ip_block_usable (struct device_node *bus, -const char *dev_name) +static bool __init omap3xxx_hwmod_is_hs_ip_block_usable (struct device_node *bus, +const char *dev_name) { +struct device_node *node; +bool available; +if (!bus) -return (omap_type () ==OMAP2_DEVICE_TYPE_GP ) ?1 :0 ; +return omap_type () ==OMAP2_DEVICE_TYPE_GP ; -if (of_device_is_available (of_find_node_by_name (bus, dev_name))) -return 1 ; + node =of_get_child_by_name (bus, dev_name); + available =of_device_is_available (node); +of_node_put (node); -return 0 ; +return available; }int __init omap3xxx_hwmod_init (void )
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/arm-omap2-release-device-node-after-it-is-no-longer-needed.patch queue-4.4/arm-omap2-fix-device-node-reference-counts.patch