Fixing linaro dev address

On 16 May 2013 22:18, Chris Redpath <chris.redp...@arm.com> wrote:
> Previously, an offline CPU would always appear to have a zero load
> and this would distort the offload functionality used for balancing
> big and little domains.
>
> Maintain a mask of online CPUs in each domain and use this instead.
>
> Change-Id: I639b564b2f40cb659af8ceb8bd37f84b8a1fe323
> Signed-off-by: Chris Redpath <chris.redp...@arm.com>
> ---
>  arch/arm/kernel/topology.c |    6 ++++--
>  include/linux/sched.h      |    1 +
>  kernel/sched/fair.c        |   39 +++++++++++++++++++++++++++++++++++++--
>  3 files changed, 42 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
> index fa45fb4..93ad2cd 100644
> --- a/arch/arm/kernel/topology.c
> +++ b/arch/arm/kernel/topology.c
> @@ -381,12 +381,14 @@ void __init arch_get_hmp_domains(struct list_head 
> *hmp_domains_list)
>         if(!cpumask_empty(&hmp_slow_cpu_mask)) {
>                 domain = (struct hmp_domain *)
>                         kmalloc(sizeof(struct hmp_domain), GFP_KERNEL);
> -               cpumask_copy(&domain->cpus, &hmp_slow_cpu_mask);
> +               cpumask_copy(&domain->possible_cpus, &hmp_slow_cpu_mask);
> +               cpumask_and(&domain->cpus, cpu_online_mask, 
> &domain->possible_cpus);
>                 list_add(&domain->hmp_domains, hmp_domains_list);
>         }
>         domain = (struct hmp_domain *)
>                 kmalloc(sizeof(struct hmp_domain), GFP_KERNEL);
> -       cpumask_copy(&domain->cpus, &hmp_fast_cpu_mask);
> +       cpumask_copy(&domain->possible_cpus, &hmp_fast_cpu_mask);
> +       cpumask_and(&domain->cpus, cpu_online_mask, &domain->possible_cpus);
>         list_add(&domain->hmp_domains, hmp_domains_list);
>  }
>  #endif /* CONFIG_SCHED_HMP */
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index ea439ab..0553d76 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -988,6 +988,7 @@ bool cpus_share_cache(int this_cpu, int that_cpu);
>  #ifdef CONFIG_SCHED_HMP
>  struct hmp_domain {
>         struct cpumask cpus;
> +       struct cpumask possible_cpus;
>         struct list_head hmp_domains;
>  };
>  #endif /* CONFIG_SCHED_HMP */
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 0f9941e..3a53343 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -3514,10 +3514,10 @@ static int __init hmp_cpu_mask_setup(void)
>         dc = 0;
>         list_for_each(pos, &hmp_domains) {
>                 domain = list_entry(pos, struct hmp_domain, hmp_domains);
> -               cpulist_scnprintf(buf, 64, &domain->cpus);
> +               cpulist_scnprintf(buf, 64, &domain->possible_cpus);
>                 pr_debug("  HMP domain %d: %s\n", dc, buf);
>
> -               for_each_cpu_mask(cpu, domain->cpus) {
> +               for_each_cpu_mask(cpu, domain->possible_cpus) {
>                         per_cpu(hmp_cpu_domain, cpu) = domain;
>                 }
>                 dc++;
> @@ -3526,6 +3526,35 @@ static int __init hmp_cpu_mask_setup(void)
>         return 1;
>  }
>
> +static struct hmp_domain *hmp_get_hmp_domain_for_cpu(int cpu)
> +{
> +       struct hmp_domain *domain;
> +       struct list_head *pos;
> +
> +       list_for_each(pos, &hmp_domains) {
> +               domain = list_entry(pos, struct hmp_domain, hmp_domains);
> +               if(cpumask_test_cpu(cpu, &domain->possible_cpus))
> +                       return domain;
> +       }
> +       return NULL;
> +}
> +
> +static void hmp_online_cpu(int cpu)
> +{
> +       struct hmp_domain *domain = hmp_get_hmp_domain_for_cpu(cpu);
> +
> +       if(domain)
> +               cpumask_set_cpu(cpu, &domain->cpus);
> +}
> +
> +static void hmp_offline_cpu(int cpu)
> +{
> +       struct hmp_domain *domain = hmp_get_hmp_domain_for_cpu(cpu);
> +
> +       if(domain)
> +               cpumask_clear_cpu(cpu, &domain->cpus);
> +}
> +
>  /*
>   * Migration thresholds should be in the range [0..1023]
>   * hmp_up_threshold: min. load required for migrating tasks to a faster cpu
> @@ -6570,11 +6599,17 @@ void trigger_load_balance(struct rq *rq, int cpu)
>
>  static void rq_online_fair(struct rq *rq)
>  {
> +#ifdef CONFIG_SCHED_HMP
> +       hmp_online_cpu(rq->cpu);
> +#endif
>         update_sysctl();
>  }
>
>  static void rq_offline_fair(struct rq *rq)
>  {
> +#ifdef CONFIG_SCHED_HMP
> +       hmp_offline_cpu(rq->cpu);
> +#endif
>         update_sysctl();
>
>         /* Ensure any throttled groups are reachable by pick_next_task */
> --
> 1.7.9.5
>
>

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

Reply via email to