Hi Tixy,

Thanks for the patch. I think this patch is the right way to solve this
issue.

There is still a problem with the priority filter in
hmp_down_migration() which Viresh pointed out earlier. There is no
checking of whether the task is actually allowed to run on any of the
slower cpus. Solving that would actually also fix the issue that you are
observing as a side effect. I have attached a patch.

I think we should apply both.

Thanks,
Morten

On Fri, Oct 12, 2012 at 02:33:40PM +0100, Jon Medhurst (Tixy) wrote:
> On Fri, 2012-10-12 at 14:19 +0100, Jon Medhurst (Tixy) wrote:
> > The attached patch fixes the immediate problem by avoiding the empty
> > domain (which is probably a good thing anyway)
> 
> Oops, my last patch included some extra junk, the one attached to this
> mail fixes this...

> From 7365076675b851355d48e9b1157e223d7719e3ac Mon Sep 17 00:00:00 2001
> From: Jon Medhurst <t...@linaro.org>
> Date: Fri, 12 Oct 2012 13:45:35 +0100
> Subject: [PATCH] ARM: sched: Avoid empty 'slow' HMP domain
> 
> On homogeneous (non-heterogeneous) systems all CPUs will be declared
> 'fast' and the slow cpu list will be empty. In this situation we need to
> avoid adding an empty slow HMP domain otherwise the scheduler code will
> blow up when it attempts to move a task to the slow domain.
> 
> Signed-off-by: Jon Medhurst <t...@linaro.org>
> ---
>  arch/arm/kernel/topology.c |   10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
> index 58dac7a..0b51233 100644
> --- a/arch/arm/kernel/topology.c
> +++ b/arch/arm/kernel/topology.c
> @@ -396,10 +396,12 @@ void __init arch_get_hmp_domains(struct list_head 
> *hmp_domains_list)
>        * Must be ordered with respect to compute capacity.
>        * Fastest domain at head of list.
>        */
> -     domain = (struct hmp_domain *)
> -             kmalloc(sizeof(struct hmp_domain), GFP_KERNEL);
> -     cpumask_copy(&domain->cpus, &hmp_slow_cpu_mask);
> -     list_add(&domain->hmp_domains, 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);
> +             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);
> -- 
> 1.7.10.4
>From 9f241c37bb7316eeea56e6c93541352cf5c9b8a8 Mon Sep 17 00:00:00 2001
From: Morten Rasmussen <morten.rasmus...@arm.com>
Date: Fri, 12 Oct 2012 15:25:02 +0100
Subject: [PATCH] sched: Only down migrate low priority tasks if allowed by
 affinity mask

Adds an extra check intersection of the task affinity mask and the slower
hmp_domain cpumask before down migrating low priority tasks.

Signed-off-by: Morten Rasmussen <morten.rasmus...@arm.com>
---
 kernel/sched/fair.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 56cbda1..edcf922 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5562,8 +5562,11 @@ static unsigned int hmp_down_migration(int cpu, struct sched_entity *se)
 
 #ifdef CONFIG_SCHED_HMP_PRIO_FILTER
 	/* Filter by task priority */
-	if (p->prio >= hmp_up_prio)
+	if ((p->prio >= hmp_up_prio) &&
+		cpumask_intersects(&hmp_slower_domain(cpu)->cpus,
+					tsk_cpus_allowed(p))) {
 		return 1;
+	}
 #endif
 
 	/* Let the task load settle before doing another down migration */
-- 
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