Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp1242045pxv; Fri, 25 Jun 2021 08:28:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw3eBQ9fVLC+7RIPMFC6pInDpH/B3nDhSCepiiJf6hT7NNqcHdWnHux/WCbNxP4v5WVdU1K X-Received: by 2002:a92:c566:: with SMTP id b6mr7967662ilj.84.1624634880765; Fri, 25 Jun 2021 08:28:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624634880; cv=none; d=google.com; s=arc-20160816; b=kdadUszstcPGixYQCmyynG9BXCQia7vkAMZzo3gTbxWMdNVk0DWPhzV6rmJ7oBorpb Hq5msqkndWyeR06UsDcDN7IVx/HCgZbLFGWEG8NflJtLexMmzWkV+NDzb+rwJy8lcMpy 260PV1xglPZVEMlAzWk/CoOoHQiUaw2aHzPbcseIsDasHPIw9cklDZGyz2lFLkfwtQJM hnaOvnvE8Od+84DRwVSBtmII0Zh35zZwl9/8LItDIewuQUFnjkFOXFwog+fq0ywXlAOP MBKFhckF+MDYj/BNUAmlU6+I3PKod2Z4BB3uugA0yNNOm2GDgsJawA8n85ktzoEc79X0 P1oA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=YR6ufZ/r/jv/OnsaWxu1cteEFSQ2RW8Z70AjKyYIeoA=; b=P8c7JlByBo2F25pkK+E4ffK69rdOVtTDdzQeQaxcXB0Kb7di6cVWTCSyPhrvpACc+W pjsQ1vySDjBHRGx/3piDn081AIUMR02FJOgHYqHojD8TWwy6UXq+CiqKk1cjmm8fZIYE 0c7Snz0ZtbgBV9wV7bZbdQM8mzRP4nWVMpTcY6shiD0ltl90SfPrEjuDrxVwf95GSxLo wtWemqeGumL9G5HnCeDKIeHYBv24wfTSnqwZAWusA8iLU3iJr5DjG1yVW5qWoy7sXypH fGht8L0QLmHlaGNLZhLicRMB+NK7V3Co1nb/GbwB0WC04I3x+Y602z0EfNYU3fwqfpPJ 8DHQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l17si1356712jas.38.2021.06.25.08.27.49; Fri, 25 Jun 2021 08:28:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229950AbhFYP3L (ORCPT + 99 others); Fri, 25 Jun 2021 11:29:11 -0400 Received: from foss.arm.com ([217.140.110.172]:58684 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229445AbhFYP3K (ORCPT ); Fri, 25 Jun 2021 11:29:10 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id AF19413A1; Fri, 25 Jun 2021 08:26:49 -0700 (PDT) Received: from e123648.arm.com (unknown [10.57.7.232]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 83E683F694; Fri, 25 Jun 2021 08:26:46 -0700 (PDT) From: Lukasz Luba To: linux-kernel@vger.kernel.org Cc: Chris.Redpath@arm.com, lukasz.luba@arm.com, dietmar.eggemann@arm.com, morten.rasmussen@arm.com, qperret@google.com, linux-pm@vger.kernel.org, peterz@infradead.org, rjw@rjwysocki.net, viresh.kumar@linaro.org, vincent.guittot@linaro.org, mingo@redhat.com, juri.lelli@redhat.com, rostedt@goodmis.org, segall@google.com, mgorman@suse.de, bristot@redhat.com, CCj.Yeh@mediatek.com Subject: [PATCH 3/3] PM: EM: Increase energy calculation precision Date: Fri, 25 Jun 2021 16:26:03 +0100 Message-Id: <20210625152603.25960-4-lukasz.luba@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210625152603.25960-1-lukasz.luba@arm.com> References: <20210625152603.25960-1-lukasz.luba@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The Energy Model (EM) provides useful information about device power in each performance state to other subsystems like: Energy Aware Scheduler (EAS). The energy calculation in EAS does arithmetic operation based on the EM em_cpu_energy(). Current implementation of that function uses em_perf_state::cost as a pre-computed cost coefficient equal to: cost = power * max_frequency / frequency. The 'power' is expressed in milli-Watts (or in abstract scale). There are corner cases then the EAS energy calculation for two Performance Domains (PDs) return the same value, e.g. 10mW. The EAS compares these values to choose smaller one. It might happen that this values are equal due to rounding error. In such scenario, we need better precision, e.g. 10000 times better. To provide this possibility increase the precision on the em_perf_state::cost. This patch allows to avoid the rounding to milli-Watt errors, which might occur in EAS energy estimation for each Performance Domains (PD). The rounding error is common for small tasks which have small utilization values. The rest of the EM code doesn't change, em_perf_state::power is still expressed in milli-Watts (or in abstract scale). Thus, all existing platforms don't have to change their reported power. The same applies to EM clients, like thermal or DTPM (they use em_perf_state::power). Reported-by: CCJ Yeh Suggested-by: CCJ Yeh Signed-off-by: Lukasz Luba --- include/linux/energy_model.h | 5 ++++- kernel/power/energy_model.c | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/linux/energy_model.h b/include/linux/energy_model.h index 2016f5a706e0..91037dd57e61 100644 --- a/include/linux/energy_model.h +++ b/include/linux/energy_model.h @@ -16,7 +16,10 @@ * @power: The power consumed at this level (by 1 CPU or by a registered * device). It can be a total power: static and dynamic. * @cost: The cost coefficient associated with this level, used during - * energy calculation. Equal to: power * max_frequency / frequency + * energy calculation. Equal to: + power * 10000 * max_frequency / frequency + * To increase the energy estimation presision use different + * scale in this coefficient than in @power field. */ struct em_perf_state { unsigned long frequency; diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index 0f4530b3a8cd..2724f0ac417d 100644 --- a/kernel/power/energy_model.c +++ b/kernel/power/energy_model.c @@ -170,7 +170,8 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd, /* Compute the cost of each performance state. */ fmax = (u64) table[nr_states - 1].frequency; for (i = 0; i < nr_states; i++) { - table[i].cost = div64_u64(fmax * table[i].power, + u64 power_res = (u64)table[i].power * 10000; + table[i].cost = div64_u64(fmax * power_res, table[i].frequency); } -- 2.17.1