Received: by 10.213.65.68 with SMTP id h4csp1145imn; Thu, 15 Mar 2018 07:51:29 -0700 (PDT) X-Google-Smtp-Source: AG47ELskgPEag3eL5pcJf0UQrGzU1KC7X5hgfgB7UAYuGsFlGrf9bdLhRaRam7/c3QDCh5XvU1Sq X-Received: by 10.99.186.72 with SMTP id l8mr6646698pgu.410.1521125489548; Thu, 15 Mar 2018 07:51:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521125489; cv=none; d=google.com; s=arc-20160816; b=mvIalK9rRklQIfbtoYDsDncrqUO4O/7pUYy5WWQ7tYYqqmKQk6Bq/5SQ2ndQkZRJpm nmk2pGMC4lQATz1yA2EXcaG/0Z6OCoiZemGkTiDxbtcMFjicb8+4F9jIdt4azxrSFtlx 6EiLajGqo0MTYblc2vkJ8NHigu7mB8Uez6MoSKeDDF5Tr7PSMyrvrT5+WVX2y+CvrnHC tNi6yi01THLEN4JTUdwwqSuXlIvaqgCVK/J6VdY9ihmt7QtNkNshk+NOGU8YL5muFAOL fzIoCS/xS4cQ5Kz2HfL6CY5k1zOWF1/6X0LIQusIwW7aE6JKZsOXodcoH0dpVATrO1ZR zw4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=fqPAwgBRYJCee1JERp/wv5Tn0DaZDDQ28hmcYAmNyCA=; b=0mpUGnVMz/gZJzh3bFvY2vBgKtnjve92jqiHAHWINkxK7NZFrrjATgZb21gGCCXL82 a5P8x45fHzOwbYq638hAVV6SMwo+wsVn/UjV9PLv7CZ+t+3vcTn3tOafmPMqTyfEpwCq sEFYsfmfuRQHJqMbZSQbn5xPPs7ypeLIYcwGX+s0z6jmnqJg0tyktK3cW2URRrBAH50W qAaPKVWIh6J+OGPPqcRXJPvH2efyt5Y0vMXgK71nfKkX+XdxCUGXdP0gszzpAlsP0shK sqJT6lJWdyfWCmMhLlzhTEnJjBydKF5qv85WyNwzgn6lNgfNKakoBCGxfSGEvIp+TMr1 nnxQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 33-v6si4129638ply.517.2018.03.15.07.51.05; Thu, 15 Mar 2018 07:51:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752713AbeCOOtJ (ORCPT + 99 others); Thu, 15 Mar 2018 10:49:09 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:40030 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752653AbeCOOr3 (ORCPT ); Thu, 15 Mar 2018 10:47:29 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5359E1684; Thu, 15 Mar 2018 07:47:29 -0700 (PDT) Received: from e105550-lin.cambridge.arm.com (e105550-lin.cambridge.arm.com [10.1.211.30]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id CE8E43F487; Thu, 15 Mar 2018 07:47:27 -0700 (PDT) From: Morten Rasmussen To: peterz@infradead.org, mingo@redhat.com Cc: valentin.schneider@arm.com, dietmar.eggemann@arm.com, vincent.guittot@linaro.org, gaku.inami.xh@renesas.com, linux-kernel@vger.kernel.org, Morten Rasmussen Subject: [PATCHv2 3/7] sched/fair: Consider misfit tasks when load-balancing Date: Thu, 15 Mar 2018 14:47:00 +0000 Message-Id: <1521125224-15434-4-git-send-email-morten.rasmussen@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1521125224-15434-1-git-send-email-morten.rasmussen@arm.com> References: <1521125224-15434-1-git-send-email-morten.rasmussen@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On asymmetric cpu capacity systems load intensive tasks can end up on cpus that don't suit their compute demand. In this scenarios 'misfit' tasks should be migrated to cpus with higher compute capacity to ensure better throughput. group_misfit_task indicates this scenario, but tweaks to the load-balance code are needed to make the migrations happen. Misfit balancing only makes sense between a source group of lower per-cpu capacity and destination group of higher compute capacity. Otherwise, misfit balancing is ignored. group_misfit_task has lowest priority so any imbalance due to overload is dealt with first. The modifications are: 1. Only pick a group containing misfit tasks as the busiest group if the destination group has higher capacity and has spare capacity. 2. When the busiest group is a 'misfit' group, skip the usual average load and group capacity checks. 3. Set the imbalance for 'misfit' balancing sufficiently high for a task to be pulled ignoring average load. 4. Pick the first cpu with the rq->misfit flag raised as the source cpu. 5. If the misfit task is alone on the source cpu, go for active balancing. cc: Ingo Molnar cc: Peter Zijlstra Signed-off-by: Morten Rasmussen --- kernel/sched/fair.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 1e06c722bc2e..496062860733 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7102,6 +7102,7 @@ struct lb_env { unsigned int loop_max; enum fbq_type fbq_type; + enum group_type src_grp_type; struct list_head tasks; }; @@ -8044,6 +8045,14 @@ static bool update_sd_pick_busiest(struct lb_env *env, { struct sg_lb_stats *busiest = &sds->busiest_stat; + /* + * Don't try to pull misfit tasks we can't help. + */ + if (sgs->group_type == group_misfit_task && + (!group_smaller_cpu_capacity(sg, sds->local) || + !group_has_capacity(env, &sds->local_stat))) + return false; + if (sgs->group_type > busiest->group_type) return true; @@ -8363,8 +8372,9 @@ static inline void calculate_imbalance(struct lb_env *env, struct sd_lb_stats *s * factors in sg capacity and sgs with smaller group_type are * skipped when updating the busiest sg: */ - if (busiest->avg_load <= sds->avg_load || - local->avg_load >= sds->avg_load) { + if (busiest->group_type != group_misfit_task && + (busiest->avg_load <= sds->avg_load || + local->avg_load >= sds->avg_load)) { env->imbalance = 0; return fix_small_imbalance(env, sds); } @@ -8398,6 +8408,12 @@ static inline void calculate_imbalance(struct lb_env *env, struct sd_lb_stats *s (sds->avg_load - local->avg_load) * local->group_capacity ) / SCHED_CAPACITY_SCALE; + /* Boost imbalance to allow misfit task to be balanced. */ + if (busiest->group_type == group_misfit_task) { + env->imbalance = max_t(long, env->imbalance, + busiest->group_misfit_task_load); + } + /* * if *imbalance is less than the average load per runnable task * there is no guarantee that any tasks will be moved so we'll have @@ -8464,6 +8480,10 @@ static struct sched_group *find_busiest_group(struct lb_env *env) busiest->group_no_capacity) goto force_balance; + /* Misfit tasks should be dealt with regardless of the avg load */ + if (busiest->group_type == group_misfit_task) + goto force_balance; + /* * If the local group is busier than the selected busiest group * don't try and pull any tasks. @@ -8501,6 +8521,7 @@ static struct sched_group *find_busiest_group(struct lb_env *env) force_balance: /* Looks like there is an imbalance. Compute it */ + env->src_grp_type = busiest->group_type; calculate_imbalance(env, &sds); return sds.busiest; @@ -8548,6 +8569,14 @@ static struct rq *find_busiest_queue(struct lb_env *env, if (rt > env->fbq_type) continue; + /* + * For ASYM_CPUCAPACITY domains with misfit tasks we ignore + * load. + */ + if (env->src_grp_type == group_misfit_task && + rq->misfit_task_load) + return rq; + capacity = capacity_of(i); wl = weighted_cpuload(rq); @@ -8617,6 +8646,9 @@ static int need_active_balance(struct lb_env *env) return 1; } + if (env->src_grp_type == group_misfit_task) + return 1; + return unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2); } -- 2.7.4