diff mbox series

soc: fsl: qbman: Fix missing of_node_put() in qbman_init_private_mem()

Message ID 20220704084850.277122-1-windhl@126.com (mailing list archive)
State Handled Elsewhere, archived
Headers show
Series soc: fsl: qbman: Fix missing of_node_put() in qbman_init_private_mem() | expand

Checks

Context Check Description
snowpatch_ozlabs/github-powerpc_clang success Successfully ran 7 jobs.
snowpatch_ozlabs/github-powerpc_sparse success Successfully ran 4 jobs.
snowpatch_ozlabs/github-powerpc_kernel_qemu success Successfully ran 23 jobs.

Commit Message

Liang He July 4, 2022, 8:48 a.m. UTC
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 <linmq006@gmail.com>
Signed-off-by: Liang He <windhl@126.com>
---
 drivers/soc/fsl/qbman/dpaa_sys.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)
diff mbox series

Patch

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;
 }