Subject: [PATCH] net: thunderx: Fix broken of_node_put() code.

From: [email-masked] (David Daney)
Date: Fri, 8 Apr 2016 09:41:35 -0700

Due to mail server malfunction, this patch was sent twice.  Please 
ignore this duplicate.

Thanks,
David Daney

On 03/31/2016 06:01 PM, David Daney wrote:
> From: David Daney <[email-masked]>
>
> commit b7d3e3d3d21a ("net: thunderx: Don't leak phy device references
> on -EPROBE_DEFER condition.") incorrectly moved the call to
> of_node_put() outside of the loop.  Under normal loop exit, the node
> has already had of_node_put() called, so the extra call results in:
>
> [    8.228020] ERROR: Bad of_node_put() on /soc at 0/pci at 848000000000/mrml-bridge0 at 1,0/bgx0/xlaui00
> [    8.239433] CPU: 16 PID: 608 Comm: systemd-udevd Not tainted 4.6.0-rc1-numa+ #157
> [    8.247380] Hardware name: www.cavium.com EBB8800/EBB8800, BIOS 0.3 Mar  2 2016
> [    8.273541] Call trace:
> [    8.273550] [<fffffc0008097364>] dump_backtrace+0x0/0x210
> [    8.273557] [<fffffc0008097598>] show_stack+0x24/0x2c
> [    8.273560] [<fffffc0008399ed0>] dump_stack+0x8c/0xb4
> [    8.273566] [<fffffc00085aa828>] of_node_release+0xa8/0xac
> [    8.273570] [<fffffc000839cad8>] kobject_cleanup+0x8c/0x194
> [    8.273573] [<fffffc000839c97c>] kobject_put+0x44/0x6c
> [    8.273576] [<fffffc00085a9ab0>] of_node_put+0x24/0x30
> [    8.273587] [<fffffc0000bd0f74>] bgx_probe+0x17c/0xcd8 [thunder_bgx]
> [    8.273591] [<fffffc00083ed220>] pci_device_probe+0xa0/0x114
> [    8.273596] [<fffffc0008473fbc>] driver_probe_device+0x178/0x418
> [    8.273599] [<fffffc000847435c>] __driver_attach+0x100/0x118
> [    8.273602] [<fffffc0008471b58>] bus_for_each_dev+0x6c/0xac
> [    8.273605] [<fffffc0008473884>] driver_attach+0x30/0x38
> [    8.273608] [<fffffc00084732f4>] bus_add_driver+0x1f8/0x29c
> [    8.273611] [<fffffc0008475028>] driver_register+0x70/0x110
> [    8.273617] [<fffffc00083ebf08>] __pci_register_driver+0x60/0x6c
> [    8.273623] [<fffffc0000bf0040>] bgx_init_module+0x40/0x48 [thunder_bgx]
> [    8.273626] [<fffffc0008090d04>] do_one_initcall+0xcc/0x1c0
> [    8.273631] [<fffffc0008198abc>] do_init_module+0x68/0x1c8
> [    8.273635] [<fffffc0008125668>] load_module+0xf44/0x11f4
> [    8.273638] [<fffffc0008125b64>] SyS_finit_module+0xb8/0xe0
> [    8.273641] [<fffffc0008093b30>] el0_svc_naked+0x24/0x28
>
> Go back to the previous (correct) code that only did the extra
> of_node_put() call on early exit from the loop.
>
> Signed-off-by: David Daney <[email-masked]>
> ---
>   drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 5 +++--
>   1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
> index 9679515..d20539a 100644
> --- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
> +++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
> @@ -1011,10 +1011,11 @@ static int bgx_init_of_phy(struct bgx *bgx)
>   		}
>
>   		lmac++;
> -		if (lmac == MAX_LMAC_PER_BGX)
> +		if (lmac == MAX_LMAC_PER_BGX) {
> +			of_node_put(node);
>   			break;
> +		}
>   	}
> -	of_node_put(node);
>   	return 0;
>
>   defer:
>