From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932846AbdEVJtI (ORCPT ); Mon, 22 May 2017 05:49:08 -0400 Received: from foss.arm.com ([217.140.101.70]:34234 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932348AbdEVJtG (ORCPT ); Mon, 22 May 2017 05:49:06 -0400 Subject: Re: [PATCH V3 1/2] sched/fair: Fix load_balance() affinity redo path To: Jeffrey Hugo , Ingo Molnar , Peter Zijlstra , linux-kernel@vger.kernel.org References: <1495136163-27440-1-git-send-email-jhugo@codeaurora.org> <1495136163-27440-2-git-send-email-jhugo@codeaurora.org> <642f9111-71ae-398d-58ad-74f930533e70@arm.com> Cc: Austin Christ , Tyler Baicar , Timur Tabi From: Dietmar Eggemann Message-ID: Date: Mon, 22 May 2017 10:48:59 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <642f9111-71ae-398d-58ad-74f930533e70@arm.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 19/05/17 14:31, Dietmar Eggemann wrote: > On 18/05/17 20:36, Jeffrey Hugo wrote: > > [...] > >> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c >> index d711093..a5d41b1 100644 >> --- a/kernel/sched/fair.c >> +++ b/kernel/sched/fair.c >> @@ -8220,7 +8220,24 @@ static int load_balance(int this_cpu, struct rq *this_rq, >> /* All tasks on this runqueue were pinned by CPU affinity */ >> if (unlikely(env.flags & LBF_ALL_PINNED)) { >> cpumask_clear_cpu(cpu_of(busiest), cpus); >> - if (!cpumask_empty(cpus)) { >> + /* >> + * dst_cpu is not a valid busiest cpu in the following >> + * check since load cannot be pulled from dst_cpu to be >> + * put on dst_cpu. >> + */ >> + cpumask_clear_cpu(env.dst_cpu, cpus); >> + /* >> + * Go back to "redo" iff the load-balance cpumask >> + * contains other potential busiest cpus for the >> + * current sched domain. >> + */ >> + if (cpumask_intersects(cpus, sched_domain_span(env.sd))) { >> + /* >> + * Now that the check has passed, reenable >> + * dst_cpu so that load can be calculated on >> + * it in the redo path. >> + */ >> + cpumask_set_cpu(env.dst_cpu, cpus); > > IMHO, this will work nicely and its way easier. This was too quick ... if we still have other potential dst cpus available and cpu_of(busiest) is the latest src cpu then this will fail. It does work on sd with 'group_weight == 1', e.g. your MC sd 'sd->child == NULL'. But IMHO 'group_imbalance' propagation has to work on higher sd levels as well. > Another idea might be to check if the LBF_ALL_PINNED is set when we > check if we should clean the imbalance flag. > > @@ -8307,14 +8307,13 @@ static int load_balance(int this_cpu, struct rq *this_rq, > * We reach balance although we may have faced some affinity > * constraints. Clear the imbalance flag if it was set. > */ > - if (sd_parent) { > + if (sd_parent && !(env.flags & LBF_ALL_PINNED)) { > int *group_imbalance = &sd_parent->groups->sgc->imbalance; > > if (*group_imbalance) > *group_imbalance = 0; > } [...]