Commit 6ec4836f authored by Liang He's avatar Liang He Committed by Michael Ellerman

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: default avatarLiang He <windhl@126.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220621111701.4082889-1-windhl@126.com
parent d208d8c2
......@@ -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;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment