Thread (3 messages) 3 messages, 2 authors, 2013-08-12

Re: [PATCH v2 2/2] powerpc: Use ibm, chip-id property to compute cpu_core_mask if available

flat view

From: Vasant Hegde <hidden>
Date: 2013-08-12 07:54:41

On 08/12/2013 11:59 AM, Paul Mackerras wrote:
Some systems have an ibm,chip-id property in the cpu nodes in the
device tree.  On these systems, we now use that to compute the
cpu_core_mask (i.e. the set of core siblings) rather than looking
at cache properties.
Looks fine.

Tested-by: Vasant Hegde <redacted>

-Vasant
quoted hunk ↗ jump to hunk
Signed-off-by: Paul Mackerras <redacted>
---
v2: add is bool, use of_read_number

  arch/powerpc/kernel/smp.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---
  1 file changed, 45 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 1568525..a4137de 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -587,6 +587,33 @@ int cpu_first_thread_of_core(int core)
  }
  EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);

+static void traverse_siblings_chip_id(int cpu, bool add, int chipid)
+{
+	const struct cpumask *mask;
+	struct device_node *np;
+	int i, plen;
+	const __be32 *prop;
+
+	mask = add ? cpu_online_mask : cpu_present_mask;
+	for_each_cpu(i, mask) {
+		np = of_get_cpu_node(i, NULL);
+		if (!np)
+			continue;
+		prop = of_get_property(np, "ibm,chip-id", &plen);
+		if (prop && plen == sizeof(int) &&
+		    of_read_number(prop, 1) == chipid) {
+			if (add) {
+				cpumask_set_cpu(cpu, cpu_core_mask(i));
+				cpumask_set_cpu(i, cpu_core_mask(cpu));
+			} else {
+				cpumask_clear_cpu(cpu, cpu_core_mask(i));
+				cpumask_clear_cpu(i, cpu_core_mask(cpu));
+			}
+		}
+		of_node_put(np);
+	}
+}
+
  /* Must be called when no change can occur to cpu_present_mask,
   * i.e. during cpu online or offline.
   */
@@ -611,14 +638,29 @@ static struct device_node *cpu_to_l2cache(int cpu)

  static void traverse_core_siblings(int cpu, bool add)
  {
-	struct device_node *l2_cache;
+	struct device_node *l2_cache, *np;
  	const struct cpumask *mask;
-	int i;
+	int i, chip, plen;
+	const __be32 *prop;
+
+	/* First see if we have ibm,chip-id properties in cpu nodes */
+	np = of_get_cpu_node(cpu, NULL);
+	if (np) {
+		chip = -1;
+		prop = of_get_property(np, "ibm,chip-id", &plen);
+		if (prop && plen == sizeof(int))
+			chip = of_read_number(prop, 1);
+		of_node_put(np);
+		if (chip >= 0) {
+			traverse_siblings_chip_id(cpu, add, chip);
+			return;
+		}
+	}

  	l2_cache = cpu_to_l2cache(cpu);
  	mask = add ? cpu_online_mask : cpu_present_mask;
  	for_each_cpu(i, mask) {
-		struct device_node *np = cpu_to_l2cache(i);
+		np = cpu_to_l2cache(i);
  		if (!np)
  			continue;
  		if (np == l2_cache) {
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help