powerpc/pseries: Add missing of_node_put()s in hotplug-cpu.c

In pseries_cpuhp_cache_use_count() and pseries_cpuhp_detach_nodes(),
we need carefully hold the reference returned by
of_find_next_cache_node() and use it to call of_node_put() to keep
refcount balance.

Signed-off-by: Liang He <windhl@126.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220621111701.4082889-1-windhl@126.com
This commit is contained in:
Liang He 2022-06-21 19:17:01 +08:00 committed by Michael Ellerman
parent d208d8c2cd
commit 6ec4836fa1

View file

@ -619,17 +619,21 @@ static ssize_t dlpar_cpu_add(u32 drc_index)
static unsigned int pseries_cpuhp_cache_use_count(const struct device_node *cachedn)
{
unsigned int use_count = 0;
struct device_node *dn;
struct device_node *dn, *tn;
WARN_ON(!of_node_is_type(cachedn, "cache"));
for_each_of_cpu_node(dn) {
if (of_find_next_cache_node(dn) == cachedn)
tn = of_find_next_cache_node(dn);
of_node_put(tn);
if (tn == cachedn)
use_count++;
}
for_each_node_by_type(dn, "cache") {
if (of_find_next_cache_node(dn) == cachedn)
tn = of_find_next_cache_node(dn);
of_node_put(tn);
if (tn == cachedn)
use_count++;
}
@ -649,10 +653,13 @@ static int pseries_cpuhp_detach_nodes(struct device_node *cpudn)
dn = cpudn;
while ((dn = of_find_next_cache_node(dn))) {
if (pseries_cpuhp_cache_use_count(dn) > 1)
if (pseries_cpuhp_cache_use_count(dn) > 1) {
of_node_put(dn);
break;
}
ret = of_changeset_detach_node(&cs, dn);
of_node_put(dn);
if (ret)
goto out;
}