[PATCH] soc: fsl: qbman: Fix missing of_node_put() in qbman_init_private_mem()
From: Liang He <hidden>
Date: 2022-07-04 08:49:52
Subsystem:
freescale soc drivers, the rest · Maintainers:
Christophe Leroy, Linus Torvalds
We should call of_node_put() for the reference returned by
of_parse_phandle() which will increase the refcount.
Fixes: 42d0349784c7 ("soc/fsl/qbman: Add common routine for QBMan private allocations")
Co-authored-by: Miaoqian Lin [off-list ref]
Signed-off-by: Liang He <redacted>
---
drivers/soc/fsl/qbman/dpaa_sys.c | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/drivers/soc/fsl/qbman/dpaa_sys.c b/drivers/soc/fsl/qbman/dpaa_sys.c
index 9dd8bb571dbc..6138a68ea699 100644
--- a/drivers/soc/fsl/qbman/dpaa_sys.c
+++ b/drivers/soc/fsl/qbman/dpaa_sys.c@@ -52,7 +52,8 @@ int qbman_init_private_mem(struct device *dev, int idx, dma_addr_t *addr, rmem = of_reserved_mem_lookup(mem_node); if (!rmem) { dev_err(dev, "of_reserved_mem_lookup() returned NULL\n"); - return -ENODEV; + err = -ENODEV; + goto out_of_put; } *addr = rmem->base; *size = rmem->size;
@@ -66,24 +67,35 @@ int qbman_init_private_mem(struct device *dev, int idx, dma_addr_t *addr, prop = of_find_property(mem_node, "reg", &len); if (!prop) { prop = devm_kzalloc(dev, sizeof(*prop), GFP_KERNEL); - if (!prop) - return -ENOMEM; + if (!prop) { + err = -ENOMEM; + goto out_of_put; + } prop->value = res_array = devm_kzalloc(dev, sizeof(__be32) * 4, GFP_KERNEL); - if (!prop->value) - return -ENOMEM; + if (!prop->value) { + err = -ENOMEM; + goto out_of_put; + } res_array[0] = cpu_to_be32(upper_32_bits(*addr)); res_array[1] = cpu_to_be32(lower_32_bits(*addr)); res_array[2] = cpu_to_be32(upper_32_bits(*size)); res_array[3] = cpu_to_be32(lower_32_bits(*size)); prop->length = sizeof(__be32) * 4; prop->name = devm_kstrdup(dev, "reg", GFP_KERNEL); - if (!prop->name) - return -ENOMEM; + if (!prop->name) { + err = -ENOMEM; + goto out_of_put; + } err = of_add_property(mem_node, prop); if (err) - return err; + goto out_of_put; } + of_node_put(mem_node); return 0; + +out_of_put: + of_node_put(mem_node); + return err; }
--
2.25.1