From patchwork Fri May 23 18:16:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Morten Rasmussen X-Patchwork-Id: 30845 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f197.google.com (mail-ie0-f197.google.com [209.85.223.197]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 9BA0420369 for ; Fri, 23 May 2014 18:17:51 +0000 (UTC) Received: by mail-ie0-f197.google.com with SMTP id rd18sf25058821iec.4 for ; Fri, 23 May 2014 11:17:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe:content-type :content-transfer-encoding; bh=1lp430vu+7a8IhSjvyTOKsXXMmg8VqwwtOsVQDkJU3A=; b=BXXCctUVOCUjALDrvz0dhpDJ2Hk89vrcuyzs8qyugogclFlJfxEscnfmtUkSHK4HmA mEqgd9kbroGP3Qbjt142Z0MK8fSwon8FHM3xPV2FK7KydwhUL6DDHCEWqQnBqHEy4KyP +bWPbohfriosAw/zbGOLnnxrYRSN2er4YAeqYrVZpbBR7HDqj+VQ3wd6nXizbEOMrxQZ jrZcNM90CPkWsfygS+d5V3wH1xbziqMddHJ4HzI0oho+0YR6OB79iMMVkLchGrIZsypq 6EkHG3qtPPqE3XDl/ReqDNLJ6sMRdviCZPTnUtlosCQsgvY/iKE2C8mBxZU1mwz7iZq6 GQAA== X-Gm-Message-State: ALoCoQnatKwqOoVW32O3ZDzvI7RB1/2t1+8H/G4M1/GoHrMM4hniJknbEkxIljXQtW6a6mkClnGq X-Received: by 10.182.213.37 with SMTP id np5mr2901165obc.36.1400869071170; Fri, 23 May 2014 11:17:51 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.101.4 with SMTP id t4ls1863762qge.1.gmail; Fri, 23 May 2014 11:17:51 -0700 (PDT) X-Received: by 10.52.75.40 with SMTP id z8mr249653vdv.90.1400869071050; Fri, 23 May 2014 11:17:51 -0700 (PDT) Received: from mail-vc0-f173.google.com (mail-vc0-f173.google.com [209.85.220.173]) by mx.google.com with ESMTPS id mg9si2116038vcb.58.2014.05.23.11.17.51 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 23 May 2014 11:17:51 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.173 as permitted sender) client-ip=209.85.220.173; Received: by mail-vc0-f173.google.com with SMTP id il7so6699169vcb.18 for ; Fri, 23 May 2014 11:17:51 -0700 (PDT) X-Received: by 10.52.236.163 with SMTP id uv3mr1596097vdc.85.1400869070958; Fri, 23 May 2014 11:17:50 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp52326vcb; Fri, 23 May 2014 11:17:50 -0700 (PDT) X-Received: by 10.69.19.140 with SMTP id gu12mr8027421pbd.111.1400869070122; Fri, 23 May 2014 11:17:50 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id kk11si4942977pbd.111.2014.05.23.11.17.49; Fri, 23 May 2014 11:17:49 -0700 (PDT) Received-SPF: none (google.com: linux-pm-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751920AbaEWSRs (ORCPT + 12 others); Fri, 23 May 2014 14:17:48 -0400 Received: from service87.mimecast.com ([91.220.42.44]:36410 "EHLO service87.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751603AbaEWSQ5 (ORCPT ); Fri, 23 May 2014 14:16:57 -0400 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Fri, 23 May 2014 19:16:55 +0100 Received: from e103034-lin.cambridge.arm.com ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 23 May 2014 19:16:54 +0100 From: Morten Rasmussen To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, peterz@infradead.org, mingo@kernel.org Cc: rjw@rjwysocki.net, vincent.guittot@linaro.org, daniel.lezcano@linaro.org, preeti@linux.vnet.ibm.com, dietmar.eggemann@arm.com Subject: [RFC PATCH 13/16] sched: Take task wakeups into account in energy estimates Date: Fri, 23 May 2014 19:16:40 +0100 Message-Id: <1400869003-27769-14-git-send-email-morten.rasmussen@arm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1400869003-27769-1-git-send-email-morten.rasmussen@arm.com> References: <1400869003-27769-1-git-send-email-morten.rasmussen@arm.com> X-OriginalArrivalTime: 23 May 2014 18:16:54.0994 (UTC) FILETIME=[2D665B20:01CF76B3] X-MC-Unique: 114052319165515901 Sender: linux-pm-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: morten.rasmussen@arm.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.173 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , The energy cost of waking a cpu and sending it back to sleep can be quite significant for short running frequently waking tasks if placed on an idle cpu in a deep sleep state. By factoring task wakeups in such tasks can be placed on cpus where the wakeup energy cost is lower. For example, partly utilized cpus in a shallower idle state, or cpus in a cluster/die that is already awake. Current cpu utilization of the target cpu is factored in guess how many task wakeups that translate into cpu wakeups (idle exits). It is a very naive approach, but it is virtually impossible to get an accurate estimate. wake_energy(task) = unused_util(cpu) * wakeups(task) * wakeup_energy(cpu) There is no per cpu wakeup tracking, so we can't estimate the energy savings when removing tasks from a cpu. It is also nearly impossible to figure out which task is the cause of cpu wakeups if multiple tasks are scheduled on the same cpu. Support for multiple idle-states per sched_group (e.g. WFI and core shutdown on ARM) is not implemented yet. wakeup_energy in struct sched_energy needs to be a table instead and cpuidle needs to tells what the most likely state is. Signed-off-by: Morten Rasmussen --- kernel/sched/fair.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 39e9cd8..5a52467 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -4271,11 +4271,13 @@ static void find_max_util(const struct cpumask *mask, int cpu, int util, * + 1-curr_util(sg) * idle_power(sg) * energy_after = new_util(sg) * busy_power(sg) * + 1-new_util(sg) * idle_power(sg) + * + new_util(sg) * task_wakeups + * * wakeup_energy(sg) * energy_diff += energy_before - energy_after * } * */ -static int energy_diff_util(int cpu, int util) +static int energy_diff_util(int cpu, int util, int wakeups) { struct sched_domain *sd; int i; @@ -4368,7 +4370,8 @@ static int energy_diff_util(int cpu, int util) * The utilization change has no impact at this level (or any * parent level). */ - if (aff_util_bef == aff_util_aft && curr_cap_idx == new_cap_idx) + if (aff_util_bef == aff_util_aft && curr_cap_idx == new_cap_idx + && unused_util_aft < 100) goto unlock; /* Energy before */ @@ -4380,6 +4383,13 @@ static int energy_diff_util(int cpu, int util) energy_diff += (aff_util_aft*new_state->power)/new_state->cap; energy_diff += (unused_util_aft * sge->idle_power) /new_state->cap; + /* + * Estimate how many of the wakeups that happens while cpu is + * idle assuming they are uniformly distributed. Ignoring + * wakeups caused by other tasks. + */ + energy_diff += (wakeups * sge->wakeup_energy >> 10) + * unused_util_aft/new_state->cap; } /* @@ -4410,6 +4420,8 @@ static int energy_diff_util(int cpu, int util) energy_diff += (aff_util_aft*new_state->power)/new_state->cap; energy_diff += (unused_util_aft * sse->idle_power) /new_state->cap; + energy_diff += (wakeups * sse->wakeup_energy >> 10) + * unused_util_aft/new_state->cap; } unlock: @@ -4420,7 +4432,8 @@ unlock: static int energy_diff_task(int cpu, struct task_struct *p) { - return energy_diff_util(cpu, p->se.avg.load_avg_contrib); + return energy_diff_util(cpu, p->se.avg.load_avg_contrib, + p->se.avg.wakeup_avg_sum); } #else