>From 134718e495a8d989c84dafe27d1b56b3c2e029c3 Mon Sep 17 00:00:00 2001 From: Lorenzo Pieralisi Date: Mon, 24 Mar 2014 14:52:24 +0000 Subject: [PATCH 2/2] arm64: kernel: topology updates Signed-off-by: Lorenzo Pieralisi --- arch/arm64/kernel/topology.c | 33 ++++++++++++++++++++------------- 1 files changed, 20 insertions(+), 13 deletions(-) diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c index 0e2cfeb..60f5f47 100644 --- a/arch/arm64/kernel/topology.c +++ b/arch/arm64/kernel/topology.c @@ -31,12 +31,15 @@ static int __init get_cpu_for_node(struct device_node *node) if (!cpu_node) return -1; - for_each_possible_cpu(cpu) { - if (of_get_cpu_node(cpu, NULL) == cpu_node) + for_each_possible_cpu(cpu) + if (of_get_cpu_node(cpu, NULL) == cpu_node) { + of_node_put(cpu_node); return cpu; - } + } pr_crit("Unable to find CPU node for %s\n", cpu_node->full_name); + + of_node_put(cpu_node); return -1; } @@ -55,6 +58,7 @@ static int __init parse_core(struct device_node *core, int cluster_id, if (t) { leaf = false; cpu = get_cpu_for_node(t); + of_node_put(t); if (cpu >= 0) { cpu_topology[cpu].cluster_id = cluster_id; cpu_topology[cpu].core_id = core_id; @@ -64,7 +68,6 @@ static int __init parse_core(struct device_node *core, int cluster_id, t->full_name); return -EINVAL; } - of_node_put(t); } i++; } while (t); @@ -107,11 +110,11 @@ static int __init parse_cluster(struct device_node *cluster, int depth) snprintf(name, sizeof(name), "cluster%d", i); c = of_get_child_by_name(cluster, name); if (c) { + leaf = false; ret = parse_cluster(c, depth + 1); + of_node_put(c); if (ret != 0) return ret; - leaf = false; - of_node_put(c); } i++; } while (c); @@ -124,20 +127,24 @@ static int __init parse_cluster(struct device_node *cluster, int depth) if (c) { has_cores = true; - if (depth == 0) + if (depth == 0) { pr_err("%s: cpu-map children should be clusters\n", c->full_name); + of_node_put(c); + return -EINVAL; + } if (leaf) { ret = parse_core(c, cluster_id, core_id++); - if (ret != 0) - return ret; } else { pr_err("%s: Non-leaf cluster with core %s\n", cluster->full_name, name); - return -EINVAL; + ret = -EINVAL; } + of_node_put(c); + if (ret != 0) + return ret; } i++; } while (c); @@ -173,9 +180,7 @@ static int __init parse_dt_topology(void) ret = parse_cluster(map, 0); if (ret != 0) - goto out; - - of_node_put(map); + goto out_map; /* * Check that all cores are in the topology; the SMP code will @@ -189,6 +194,8 @@ static int __init parse_dt_topology(void) } } +out_map: + of_node_put(map); out: of_node_put(cn); return ret; -- 1.7.5.4