powerpc: Pull out cpu_core_mask updates into a separate function
PATCH v2 1/2 powerpc: Pull out cpu_core_mask updates into a separate function
This factors out the details of updating cpu_core_mask into a separate function, to make it easier to change how the mask is calculated later. This makes no functional change.
---
v2: add is bool
arch/powerpc/kernel/smp.c | 56 +++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 28 deletions(-)
arch/powerpc/kernel/smp.c +28 -28
@@ -609,11 +609,36 @@ static struct device_node *cpu_to_l2cache(int cpu)return cache; } +static void traverse_core_siblings (int cpu,bool add) +{ +struct device_node *l2_cache; +const struct cpumask *mask; +int i; + + 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); +if (!np) +continue ; +if (np == l2_cache) { +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); + } +of_node_put (l2_cache); +} +/* Activate a secondary processor. */ void start_secondary (void *unused) {unsigned int cpu =smp_processor_id (); -struct device_node *l2_cache;int i, base;atomic_inc (&init_mm.mm_count);
@@ -652,18 +677,7 @@ void start_secondary(void *unused)cpumask_set_cpu (cpu,cpu_core_mask (base + i));cpumask_set_cpu (base + i,cpu_core_mask (cpu)); } - l2_cache =cpu_to_l2cache (cpu); -for_each_online_cpu (i) { -struct device_node *np =cpu_to_l2cache (i); -if (!np) -continue ; -if (np == l2_cache) { -cpumask_set_cpu (cpu,cpu_core_mask (i)); -cpumask_set_cpu (i,cpu_core_mask (cpu)); - } -of_node_put (np); - } -of_node_put (l2_cache); +traverse_core_siblings (cpu, true);smp_wmb ();notify_cpu_starting (cpu);
@@ -719,7 +733,6 @@ int arch_sd_sibling_asym_packing(void)#ifdef CONFIG_HOTPLUG_CPU int __cpu_disable (void ) { -struct device_node *l2_cache;int cpu =smp_processor_id ();int base, i;int err;
@@ -739,20 +752,7 @@ int __cpu_disable(void)cpumask_clear_cpu (cpu,cpu_core_mask (base + i));cpumask_clear_cpu (base + i,cpu_core_mask (cpu)); } - - l2_cache =cpu_to_l2cache (cpu); -for_each_present_cpu (i) { -struct device_node *np =cpu_to_l2cache (i); -if (!np) -continue ; -if (np == l2_cache) { -cpumask_clear_cpu (cpu,cpu_core_mask (i)); -cpumask_clear_cpu (i,cpu_core_mask (cpu)); - } -of_node_put (np); - } -of_node_put (l2_cache); - +traverse_core_siblings (cpu, false);return 0 ; }
Signature · 1 line
1.8.4.rc2
PATCH v2 2/2 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.
---
v2: add is bool, use of_read_number
arch/powerpc/kernel/smp.c | 48 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-)
arch/powerpc/kernel/smp.c +45 -3
@@ -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) {
Signature · 1 line
1.8.4.rc2
Re: [PATCH v2 2/2] powerpc: Use ibm, chip-id property to compute cpu_core_mask if available
Quoted 4 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.
Looks fine.
-Vasant
Quoted 80 lines
Signed-off-by Paul Mackerras <[email protected]>---
v2: add is bool, useof_read_numberarch/powerpc/kernel/smp.c | 48 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-)arch/powerpc/kernel/smp.c +45
-3@@ -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) {