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

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
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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;
	}