• Thierry Reding's avatar
    clocksource: clksrc-of: Do not drop unheld reference on device node · 4c4b0532
    Thierry Reding authored
    When booting a recent kernel on ARM with OF_DYNAMIC enabled, the kernel
    warns about the following:
    
    	[    0.000000] ERROR: Bad of_node_put() on /timer@50004600
    	[    0.000000] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.12.0-rc5-next-20131017-00077-gedfd827-dirty #406
    	[    0.000000] [<c0015b68>] (unwind_backtrace+0x0/0xf4) from [<c00117e4>] (show_stack+0x10/0x14)
    	[    0.000000] [<c00117e4>] (show_stack+0x10/0x14) from [<c055f734>] (dump_stack+0x9c/0xc8)
    	[    0.000000] [<c055f734>] (dump_stack+0x9c/0xc8) from [<c03b47d4>] (of_node_release+0x90/0x9c)
    	[    0.000000] [<c03b47d4>] (of_node_release+0x90/0x9c) from [<c03b5084>] (of_find_matching_node_and_match+0x78/0xb4)
    	[    0.000000] [<c03b5084>] (of_find_matching_node_and_match+0x78/0xb4) from [<c07887c8>] (clocksource_of_init+0x60/0x70)
    	[    0.000000] [<c07887c8>] (clocksource_of_init+0x60/0x70) from [<c076e99c>] (start_kernel+0x1f4/0x33c)
    	[    0.000000] [<c076e99c>] (start_kernel+0x1f4/0x33c) from [<80008074>] (0x80008074)
    
    This is caused by clocksource_of_init() dropping a reference on the
    device node that it never took. The reference taken by the loop is
    implicitly dropped on subsequent iterations. See the implementation of
    and the comment on top of the of_find_matching_node_and_match()
    function for reference (no pun intended).
    Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
    Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    4c4b0532
clksrc-of.c 1.17 KB