Skip to contentSkip to conversation

powerpc: Use ibm,chip-id property to compute cpu_core_mask if available

PATCH In review Paul Mackerras 2 participants 3 messages Jul 4, 2013 – Aug 10, 2013 PowerPC

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 powerpc: Use ibm,chip-id property to compute cpu_core_mask if available

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.

---

arch/powerpc/kernel/smp.c +44 -3
index b72d8c9..3b7a118 100644
@@ -587,6 +587,32 @@ int cpu_first_thread_of_core(int core)
 }
 EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);
 
+static void traverse_siblings_chip_id(int cpu, int add, int chipid)
+{
+	const struct cpumask *mask;
+	struct device_node *np;
+	int i, plen;
+	const int *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) && *prop == 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 +637,29 @@ static struct device_node *cpu_to_l2cache(int cpu)
 
 static void traverse_core_siblings(int cpu, int add)
 {
-	struct device_node *l2_cache;
+	struct device_node *l2_cache, *np;
 	const struct cpumask *mask;
-	int i;
+	int i, chip, plen;
+	const int *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 = *(int *)prop;
+		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) {
#1 lore raw

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

Quoted 5 lines · Paul Mackerras

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.

Paul,

I wanted to test this patch but not able to apply this patch on top of Linux tree. Looks like I'm missing traverse_core_siblings() related patch. I searched in ppc mailing list and couldn't figure out.

Can you point me to related patch?

-Vasant

Quoted 77 lines

---

arch/powerpc/kernel/smp.c +44 -3
index b72d8c9..3b7a118 100644
@@ -587,6 +587,32 @@ int cpu_first_thread_of_core(int core)
  }
  EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);
 
+static void traverse_siblings_chip_id(int cpu, int add, int chipid)
+{
+	const struct cpumask *mask;
+	struct device_node *np;
+	int i, plen;
+	const int *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) && *prop == 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 +637,29 @@ static struct device_node *cpu_to_l2cache(int cpu)
 
  static void traverse_core_siblings(int cpu, int add)
  {
-	struct device_node *l2_cache;
+	struct device_node *l2_cache, *np;
  	const struct cpumask *mask;
-	int i;
+	int i, chip, plen;
+	const int *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 = *(int *)prop;
+		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) {

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://lists.ozlabs.org/listinfo/linuxppc-dev

#2 lore raw
Quoted 6 lines · Vasant Hegde

Paul,

I wanted to test this patch but not able to apply this patch on top of Linux tree. Looks like I'm missing traverse_core_siblings() related patch. I searched in ppc mailing list and couldn't figure out.

Oops, my fault, there were actually 2 patches in that series but somehow I only posted the second one. I'll repost both patches.

Paul.