Re: [RFC PATCH 06/10] ARM: sched: Use device-tree to provide fast/slow CPU list for HMP

2012-10-10 Thread Morten Rasmussen
On Thu, Oct 04, 2012 at 07:49:32AM +0100, Viresh Kumar wrote:
 On 22 September 2012 00:02,  morten.rasmus...@arm.com wrote:
  From: Morten Rasmussen morten.rasmus...@arm.com
 
  We can't rely on Kconfig options to set the fast and slow CPU lists for
  HMP scheduling if we want a single kernel binary to support multiple
  devices with different CPU topology. E.g. TC2 (ARM's Test-Chip-2
  big.LITTLE system), Fast Models, or even non big.LITTLE devices.
 
  This patch adds the function arch_get_fast_and_slow_cpus() to generate
  the lists at run-time by parsing the CPU nodes in device-tree; it
  assumes slow cores are A7s and everything else is fast. The function
  still supports the old Kconfig options as this is useful for testing the
  HMP scheduler on devices without big.LITTLE.
 
 But this code is handling this case too at the end, with following logic:
 
  +   cpumask_setall(fast);
  +   cpumask_clear(slow);
 
 Am i missing something?
 

The HMP setup can be defined using Kconfig or DT. If both fails, it will
set all cpus to be fast cpus and effectively disable SCHED_HMP. The
Kconfig option is kept to allow testing of alternative HMP setups
without having to change the DT or use DT at all which might be handy
for non-ARM platforms. I hope that answers you question.

  This patch is reuse of a patch by Jon Medhurst t...@linaro.org with a
  few bits left out.
 
 Then probably he must be the author of this commit? Also a SOB is required
 from him here.
 

I don't know what the correct procedure is for this sort of partial
patch reuse. Since I didn't know better, I adopted Tixy's own reference
style that he used in one of his patches which is an extension of a
previous patch by me. I will of course fix it to follow normal procedure
if there is one.

  Signed-off-by: Morten Rasmussen morten.rasmus...@arm.com
  ---
   arch/arm/Kconfig   |4 ++-
   arch/arm/kernel/topology.c |   69 
  
   2 files changed, 72 insertions(+), 1 deletion(-)
 
  diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
  index cb80846..f1271bc 100644
  --- a/arch/arm/Kconfig
  +++ b/arch/arm/Kconfig
  @@ -1588,13 +1588,15 @@ config HMP_FAST_CPU_MASK
  string HMP scheduler fast CPU mask
  depends on SCHED_HMP
  help
  -  Specify the cpuids of the fast CPUs in the system as a list 
  string,
  +  Leave empty to use device tree information.
  + Specify the cpuids of the fast CPUs in the system as a list 
  string,
e.g. cpuid 0+1 should be specified as 0-1.
 
   config HMP_SLOW_CPU_MASK
  string HMP scheduler slow CPU mask
  depends on SCHED_HMP
  help
  + Leave empty to use device tree information.
Specify the cpuids of the slow CPUs in the system as a list 
  string,
e.g. cpuid 0+1 should be specified as 0-1.
 
  diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
  index 26c12c6..7682e12 100644
  --- a/arch/arm/kernel/topology.c
  +++ b/arch/arm/kernel/topology.c
  @@ -317,6 +317,75 @@ void store_cpu_topology(unsigned int cpuid)
  cpu_topology[cpuid].socket_id, mpidr);
   }
 
  +
  +#ifdef CONFIG_SCHED_HMP
  +
  +static const char * const little_cores[] = {
  +   arm,cortex-a7,
  +   NULL,
  +};
  +
  +static bool is_little_cpu(struct device_node *cn)
  +{
  +   const char * const *lc;
  +   for (lc = little_cores; *lc; lc++)
  +   if (of_device_is_compatible(cn, *lc))
  +   return true;
  +   return false;
  +}
  +
  +void __init arch_get_fast_and_slow_cpus(struct cpumask *fast,
  +   struct cpumask *slow)
  +{
  +   struct device_node *cn = NULL;
  +   int cpu = 0;
  +
  +   cpumask_clear(fast);
  +   cpumask_clear(slow);
  +
  +   /*
  +* Use the config options if they are given. This helps testing
  +* HMP scheduling on systems without a big.LITTLE architecture.
  +*/
  +   if (strlen(CONFIG_HMP_FAST_CPU_MASK)  
  strlen(CONFIG_HMP_SLOW_CPU_MASK)) {
  +   if (cpulist_parse(CONFIG_HMP_FAST_CPU_MASK, fast))
  +   WARN(1, Failed to parse HMP fast cpu mask!\n);
  +   if (cpulist_parse(CONFIG_HMP_SLOW_CPU_MASK, slow))
  +   WARN(1, Failed to parse HMP slow cpu mask!\n);
  +   return;
  +   }
  +
  +   /*
  +* Else, parse device tree for little cores.
  +*/
  +   while ((cn = of_find_node_by_type(cn, cpu))) {
  +
  +   if (cpu = num_possible_cpus())
  +   break;
  +
  +   if (is_little_cpu(cn))
  +   cpumask_set_cpu(cpu, slow);
  +   else
  +   cpumask_set_cpu(cpu, fast);
  +
  +   cpu++;
  +   }
  +
  +   if (!cpumask_empty(fast)  !cpumask_empty(slow))
  +   return;
  +
  

Re: [RFC PATCH 06/10] ARM: sched: Use device-tree to provide fast/slow CPU list for HMP

2012-10-10 Thread Viresh Kumar
On 10 October 2012 15:47, Morten Rasmussen morten.rasmus...@arm.com wrote:
 On Thu, Oct 04, 2012 at 07:49:32AM +0100, Viresh Kumar wrote:

  This patch is reuse of a patch by Jon Medhurst t...@linaro.org with a
  few bits left out.

 Then probably he must be the author of this commit? Also a SOB is required
 from him here.


 I don't know what the correct procedure is for this sort of partial
 patch reuse. Since I didn't know better, I adopted Tixy's own reference
 style that he used in one of his patches which is an extension of a
 previous patch by me. I will of course fix it to follow normal procedure
 if there is one.

AFAIK, if you have used only some part of the earlier patch, then you just
need to add an SOB of original author.
But if you have picked most of the stuff from original patch, which i feel is
the case here, you must have original author in author  SOB + your SOB.

 It would be very easy to blame someone else here... :) I will fix it.

:)

___
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev


Re: [RFC PATCH 06/10] ARM: sched: Use device-tree to provide fast/slow CPU list for HMP

2012-10-10 Thread Morten Rasmussen
Hi Tixy,

Could you have a look at my code stealing patch below? Since it is
basically a trimmed version of one of your patches I would prefer to
put you as author and have your SOB on it. What is your opinion?

Thanks,
Morten

On Fri, Sep 21, 2012 at 07:32:21PM +0100, Morten Rasmussen wrote:
 From: Morten Rasmussen morten.rasmus...@arm.com
 
 We can't rely on Kconfig options to set the fast and slow CPU lists for
 HMP scheduling if we want a single kernel binary to support multiple
 devices with different CPU topology. E.g. TC2 (ARM's Test-Chip-2
 big.LITTLE system), Fast Models, or even non big.LITTLE devices.
 
 This patch adds the function arch_get_fast_and_slow_cpus() to generate
 the lists at run-time by parsing the CPU nodes in device-tree; it
 assumes slow cores are A7s and everything else is fast. The function
 still supports the old Kconfig options as this is useful for testing the
 HMP scheduler on devices without big.LITTLE.
 
 This patch is reuse of a patch by Jon Medhurst t...@linaro.org with a
 few bits left out.
 
 Signed-off-by: Morten Rasmussen morten.rasmus...@arm.com
 ---
  arch/arm/Kconfig   |4 ++-
  arch/arm/kernel/topology.c |   69 
 
  2 files changed, 72 insertions(+), 1 deletion(-)
 
 diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
 index cb80846..f1271bc 100644
 --- a/arch/arm/Kconfig
 +++ b/arch/arm/Kconfig
 @@ -1588,13 +1588,15 @@ config HMP_FAST_CPU_MASK
   string HMP scheduler fast CPU mask
   depends on SCHED_HMP
   help
 -  Specify the cpuids of the fast CPUs in the system as a list string,
 +  Leave empty to use device tree information.
 +   Specify the cpuids of the fast CPUs in the system as a list string,
 e.g. cpuid 0+1 should be specified as 0-1.
  
  config HMP_SLOW_CPU_MASK
   string HMP scheduler slow CPU mask
   depends on SCHED_HMP
   help
 +   Leave empty to use device tree information.
 Specify the cpuids of the slow CPUs in the system as a list string,
 e.g. cpuid 0+1 should be specified as 0-1.
  
 diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
 index 26c12c6..7682e12 100644
 --- a/arch/arm/kernel/topology.c
 +++ b/arch/arm/kernel/topology.c
 @@ -317,6 +317,75 @@ void store_cpu_topology(unsigned int cpuid)
   cpu_topology[cpuid].socket_id, mpidr);
  }
  
 +
 +#ifdef CONFIG_SCHED_HMP
 +
 +static const char * const little_cores[] = {
 + arm,cortex-a7,
 + NULL,
 +};
 +
 +static bool is_little_cpu(struct device_node *cn)
 +{
 + const char * const *lc;
 + for (lc = little_cores; *lc; lc++)
 + if (of_device_is_compatible(cn, *lc))
 + return true;
 + return false;
 +}
 +
 +void __init arch_get_fast_and_slow_cpus(struct cpumask *fast,
 + struct cpumask *slow)
 +{
 + struct device_node *cn = NULL;
 + int cpu = 0;
 +
 + cpumask_clear(fast);
 + cpumask_clear(slow);
 +
 + /*
 +  * Use the config options if they are given. This helps testing
 +  * HMP scheduling on systems without a big.LITTLE architecture.
 +  */
 + if (strlen(CONFIG_HMP_FAST_CPU_MASK)  
 strlen(CONFIG_HMP_SLOW_CPU_MASK)) {
 + if (cpulist_parse(CONFIG_HMP_FAST_CPU_MASK, fast))
 + WARN(1, Failed to parse HMP fast cpu mask!\n);
 + if (cpulist_parse(CONFIG_HMP_SLOW_CPU_MASK, slow))
 + WARN(1, Failed to parse HMP slow cpu mask!\n);
 + return;
 + }
 +
 + /*
 +  * Else, parse device tree for little cores.
 +  */
 + while ((cn = of_find_node_by_type(cn, cpu))) {
 +
 + if (cpu = num_possible_cpus())
 + break;
 +
 + if (is_little_cpu(cn))
 + cpumask_set_cpu(cpu, slow);
 + else
 + cpumask_set_cpu(cpu, fast);
 +
 + cpu++;
 + }
 +
 + if (!cpumask_empty(fast)  !cpumask_empty(slow))
 + return;
 +
 + /*
 +  * We didn't find both big and little cores so let's call all cores
 +  * fast as this will keep the system running, with all cores being
 +  * treated equal.
 +  */
 + cpumask_setall(fast);
 + cpumask_clear(slow);
 +}
 +
 +#endif /* CONFIG_SCHED_HMP */
 +
 +
  /*
   * init_cpu_topology is called at boot when only one cpu is running
   * which prevent simultaneous write access to cpu_topology array
 -- 
 1.7.9.5
 


___
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev


Re: [RFC PATCH 06/10] ARM: sched: Use device-tree to provide fast/slow CPU list for HMP

2012-10-10 Thread Jon Medhurst (Tixy)
On Wed, 2012-10-10 at 12:04 +0100, Morten Rasmussen wrote:
 Hi Tixy,
 
 Could you have a look at my code stealing patch below? Since it is
 basically a trimmed version of one of your patches I would prefer to
 put you as author and have your SOB on it. What is your opinion?

Yes, I can agree with that opinion, (and my employer likes to count
their patch totals ;-) so please feel free to add: 

From: Jon Medhurst t...@linaro.org
Signed-off-by: Jon Medhurst t...@linaro.org

Thanks

-- 
Tixy


 Thanks,
 Morten
 
 On Fri, Sep 21, 2012 at 07:32:21PM +0100, Morten Rasmussen wrote:
  From: Morten Rasmussen morten.rasmus...@arm.com
  
  We can't rely on Kconfig options to set the fast and slow CPU lists for
  HMP scheduling if we want a single kernel binary to support multiple
  devices with different CPU topology. E.g. TC2 (ARM's Test-Chip-2
  big.LITTLE system), Fast Models, or even non big.LITTLE devices.
  
  This patch adds the function arch_get_fast_and_slow_cpus() to generate
  the lists at run-time by parsing the CPU nodes in device-tree; it
  assumes slow cores are A7s and everything else is fast. The function
  still supports the old Kconfig options as this is useful for testing the
  HMP scheduler on devices without big.LITTLE.
  
  This patch is reuse of a patch by Jon Medhurst t...@linaro.org with a
  few bits left out.
  
  Signed-off-by: Morten Rasmussen morten.rasmus...@arm.com
  ---
   arch/arm/Kconfig   |4 ++-
   arch/arm/kernel/topology.c |   69 
  
   2 files changed, 72 insertions(+), 1 deletion(-)
  
  diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
  index cb80846..f1271bc 100644
  --- a/arch/arm/Kconfig
  +++ b/arch/arm/Kconfig
  @@ -1588,13 +1588,15 @@ config HMP_FAST_CPU_MASK
  string HMP scheduler fast CPU mask
  depends on SCHED_HMP
  help
  -  Specify the cpuids of the fast CPUs in the system as a list 
  string,
  +  Leave empty to use device tree information.
  + Specify the cpuids of the fast CPUs in the system as a list string,
e.g. cpuid 0+1 should be specified as 0-1.
   
   config HMP_SLOW_CPU_MASK
  string HMP scheduler slow CPU mask
  depends on SCHED_HMP
  help
  + Leave empty to use device tree information.
Specify the cpuids of the slow CPUs in the system as a list string,
e.g. cpuid 0+1 should be specified as 0-1.
   
  diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
  index 26c12c6..7682e12 100644
  --- a/arch/arm/kernel/topology.c
  +++ b/arch/arm/kernel/topology.c
  @@ -317,6 +317,75 @@ void store_cpu_topology(unsigned int cpuid)
  cpu_topology[cpuid].socket_id, mpidr);
   }
   
  +
  +#ifdef CONFIG_SCHED_HMP
  +
  +static const char * const little_cores[] = {
  +   arm,cortex-a7,
  +   NULL,
  +};
  +
  +static bool is_little_cpu(struct device_node *cn)
  +{
  +   const char * const *lc;
  +   for (lc = little_cores; *lc; lc++)
  +   if (of_device_is_compatible(cn, *lc))
  +   return true;
  +   return false;
  +}
  +
  +void __init arch_get_fast_and_slow_cpus(struct cpumask *fast,
  +   struct cpumask *slow)
  +{
  +   struct device_node *cn = NULL;
  +   int cpu = 0;
  +
  +   cpumask_clear(fast);
  +   cpumask_clear(slow);
  +
  +   /*
  +* Use the config options if they are given. This helps testing
  +* HMP scheduling on systems without a big.LITTLE architecture.
  +*/
  +   if (strlen(CONFIG_HMP_FAST_CPU_MASK)  
  strlen(CONFIG_HMP_SLOW_CPU_MASK)) {
  +   if (cpulist_parse(CONFIG_HMP_FAST_CPU_MASK, fast))
  +   WARN(1, Failed to parse HMP fast cpu mask!\n);
  +   if (cpulist_parse(CONFIG_HMP_SLOW_CPU_MASK, slow))
  +   WARN(1, Failed to parse HMP slow cpu mask!\n);
  +   return;
  +   }
  +
  +   /*
  +* Else, parse device tree for little cores.
  +*/
  +   while ((cn = of_find_node_by_type(cn, cpu))) {
  +
  +   if (cpu = num_possible_cpus())
  +   break;
  +
  +   if (is_little_cpu(cn))
  +   cpumask_set_cpu(cpu, slow);
  +   else
  +   cpumask_set_cpu(cpu, fast);
  +
  +   cpu++;
  +   }
  +
  +   if (!cpumask_empty(fast)  !cpumask_empty(slow))
  +   return;
  +
  +   /*
  +* We didn't find both big and little cores so let's call all cores
  +* fast as this will keep the system running, with all cores being
  +* treated equal.
  +*/
  +   cpumask_setall(fast);
  +   cpumask_clear(slow);
  +}
  +
  +#endif /* CONFIG_SCHED_HMP */
  +
  +
   /*
* init_cpu_topology is called at boot when only one cpu is running
* which prevent simultaneous write access to cpu_topology array
  -- 
  1.7.9.5
  
 



___
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev


[RFC PATCH 06/10] ARM: sched: Use device-tree to provide fast/slow CPU list for HMP

2012-09-21 Thread morten . rasmussen
From: Morten Rasmussen morten.rasmus...@arm.com

We can't rely on Kconfig options to set the fast and slow CPU lists for
HMP scheduling if we want a single kernel binary to support multiple
devices with different CPU topology. E.g. TC2 (ARM's Test-Chip-2
big.LITTLE system), Fast Models, or even non big.LITTLE devices.

This patch adds the function arch_get_fast_and_slow_cpus() to generate
the lists at run-time by parsing the CPU nodes in device-tree; it
assumes slow cores are A7s and everything else is fast. The function
still supports the old Kconfig options as this is useful for testing the
HMP scheduler on devices without big.LITTLE.

This patch is reuse of a patch by Jon Medhurst t...@linaro.org with a
few bits left out.

Signed-off-by: Morten Rasmussen morten.rasmus...@arm.com
---
 arch/arm/Kconfig   |4 ++-
 arch/arm/kernel/topology.c |   69 
 2 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index cb80846..f1271bc 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1588,13 +1588,15 @@ config HMP_FAST_CPU_MASK
string HMP scheduler fast CPU mask
depends on SCHED_HMP
help
-  Specify the cpuids of the fast CPUs in the system as a list string,
+  Leave empty to use device tree information.
+ Specify the cpuids of the fast CPUs in the system as a list string,
  e.g. cpuid 0+1 should be specified as 0-1.
 
 config HMP_SLOW_CPU_MASK
string HMP scheduler slow CPU mask
depends on SCHED_HMP
help
+ Leave empty to use device tree information.
  Specify the cpuids of the slow CPUs in the system as a list string,
  e.g. cpuid 0+1 should be specified as 0-1.
 
diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
index 26c12c6..7682e12 100644
--- a/arch/arm/kernel/topology.c
+++ b/arch/arm/kernel/topology.c
@@ -317,6 +317,75 @@ void store_cpu_topology(unsigned int cpuid)
cpu_topology[cpuid].socket_id, mpidr);
 }
 
+
+#ifdef CONFIG_SCHED_HMP
+
+static const char * const little_cores[] = {
+   arm,cortex-a7,
+   NULL,
+};
+
+static bool is_little_cpu(struct device_node *cn)
+{
+   const char * const *lc;
+   for (lc = little_cores; *lc; lc++)
+   if (of_device_is_compatible(cn, *lc))
+   return true;
+   return false;
+}
+
+void __init arch_get_fast_and_slow_cpus(struct cpumask *fast,
+   struct cpumask *slow)
+{
+   struct device_node *cn = NULL;
+   int cpu = 0;
+
+   cpumask_clear(fast);
+   cpumask_clear(slow);
+
+   /*
+* Use the config options if they are given. This helps testing
+* HMP scheduling on systems without a big.LITTLE architecture.
+*/
+   if (strlen(CONFIG_HMP_FAST_CPU_MASK)  
strlen(CONFIG_HMP_SLOW_CPU_MASK)) {
+   if (cpulist_parse(CONFIG_HMP_FAST_CPU_MASK, fast))
+   WARN(1, Failed to parse HMP fast cpu mask!\n);
+   if (cpulist_parse(CONFIG_HMP_SLOW_CPU_MASK, slow))
+   WARN(1, Failed to parse HMP slow cpu mask!\n);
+   return;
+   }
+
+   /*
+* Else, parse device tree for little cores.
+*/
+   while ((cn = of_find_node_by_type(cn, cpu))) {
+
+   if (cpu = num_possible_cpus())
+   break;
+
+   if (is_little_cpu(cn))
+   cpumask_set_cpu(cpu, slow);
+   else
+   cpumask_set_cpu(cpu, fast);
+
+   cpu++;
+   }
+
+   if (!cpumask_empty(fast)  !cpumask_empty(slow))
+   return;
+
+   /*
+* We didn't find both big and little cores so let's call all cores
+* fast as this will keep the system running, with all cores being
+* treated equal.
+*/
+   cpumask_setall(fast);
+   cpumask_clear(slow);
+}
+
+#endif /* CONFIG_SCHED_HMP */
+
+
 /*
  * init_cpu_topology is called at boot when only one cpu is running
  * which prevent simultaneous write access to cpu_topology array
-- 
1.7.9.5



___
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev