irqchip/gic-v3-its: Drop ITS node reference on its_of_probe() errors
Subsystems (2)
PATCH v3 1/1 irqchip/gic-v3-its: Drop ITS node reference on its_of_probe() errors
its_of_probe() walks the ITS nodes with of_find_matching_node(), which drops the reference on the previous node and returns the next one with its reference count raised. The loops are balanced when they run to the end, but the three error returns (a failed its_reset_one(), a failed its_node_init() and a failed its_probe_one()) leave with the current node still referenced.
Declare the iterator in each loop with __free(device_node), so that the reference is dropped whichever way the loop is left.
---
v3:
- Keep each loop's __free(device_node) declaration on one line (Marc).
- Add Marc's Acked-by.
v2: https://lore.kernel.org/r/[email protected]
- Use __free(device_node) on the loop iterators instead of adding of_node_put() to each error return (Marc).
- Rebased on v7.4-rc1.
v1: https://lore.kernel.org/r/[email protected]
Compile-tested only (arm64 defconfig, W=1).
drivers/irqchip/irq-gic-v3-its.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/irqchip/irq-gic-v3-its.c +2 -3
@@ -5572,7 +5572,6 @@ static void its_node_destroy(struct its_node *its)static int __init its_of_probe (struct device_node *node) { -struct device_node *np;struct resource res;int err;
@@ -5582,7 +5581,7 @@ static int __init its_of_probe(struct device_node *node)* reset, don't even try to go any further, as this could * result in something even worse. */ -for (np =of_find_matching_node (node, its_device_id); np; + for (struct device_node *np __free(device_node) = of_find_matching_node(node, its_device_id); np; np =of_find_matching_node (np, its_device_id)) { if (!of_device_is_available(np) || !of_property_read_bool(np, "msi-controller") ||
@@ -5594,7 +5593,7 @@ static int __init its_of_probe(struct device_node *node)return err; } -for (np =of_find_matching_node (node, its_device_id); np; + for (struct device_node *np __free(device_node) = of_find_matching_node(node, its_device_id); np; np =of_find_matching_node (np, its_device_id)) {struct its_node *its;
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
Signature · 1 line
2.43.0