Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp5305450rdb; Wed, 13 Dec 2023 05:15:41 -0800 (PST) X-Google-Smtp-Source: AGHT+IFAArpMRodospRH50DWalaifVgLhLc6p7fl8wuA6vjNqkhEeBy/9Q4Qbk//UBb5AMdKJsL3 X-Received: by 2002:a05:6a00:c90:b0:6ce:3d8f:2217 with SMTP id a16-20020a056a000c9000b006ce3d8f2217mr4423353pfv.25.1702473341583; Wed, 13 Dec 2023 05:15:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702473341; cv=none; d=google.com; s=arc-20160816; b=Ay8V8UjsKrsIs3mVx/3m23ktodSnelMvdWmzaXGyDwWiF2FdOds0kP3zhs61pTa3ga UnM+i8SWS7nZph1/ymzVuPW/6aBxhoc7ojzxkxb3jWgMw2kha7mjw6rxY6wC6aDZftkk oSQ2GztP9P/q2CV0gyjUfxHetlQNDxA1iVKqjokbATzpC4G7wNW7rUFHsLbnQFvpSRw6 eWg658vDpfLd5pDh2jrUJEtVLDpgIDUyOAj85e6B6USsL5mMepiIjcPkjDCLpbBSyGn4 H5UwWnf2eNZ1G5rND9VCqm5plwj3YRZnxwDgnd0co3HAzAsZr3zTl+v0mJCuoQg8VglX SHUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=4cNfvnGzVgbrL90xdgCG1NXR37nYqqpIrnIY+8q2e5w=; fh=7wATtt6E/vqOqyscEhnn2/LGUsmpgJiZ4UxiQIGYy6E=; b=nvEA4F7pVbKzt+KP+cRbJW8mEjXfgzP8K2YS5AlvlW+Y22mp9YPVg3Jm5E4YnnNrCx axRJQ6L7+COpWRuDEWuWtYf8hy+SzEG7vu6mUo7+eYWgZ+AJ2k47kwSGetSWB2ryJN4u PGrQPMwRYvD2bn9Wj55GyobRuRFWG3+9QxlI8rVoaCwdZB68Bkx/uk47SF5yIgZbTLln Uc4/OLItO2tzopSi2krYgITIomkx6bwWIC7NP7sThD6X6LLL4x5h8hZZXXfIhJO0qg2h gzo3oaUR4RfxXwnG9ukSBZZLYwMBkBw2ccojmic9fX0xT8LHtJkIW7L+x5hUDl4EJj0m x23Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 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 lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id y23-20020a056a00181700b006ce35e17cabsi9619831pfa.21.2023.12.13.05.15.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Dec 2023 05:15:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) client-ip=2620:137:e000::3:3; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id E3B9C806E3CB; Wed, 13 Dec 2023 05:15:35 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233520AbjLMNPP (ORCPT + 99 others); Wed, 13 Dec 2023 08:15:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32858 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231744AbjLMNPO (ORCPT ); Wed, 13 Dec 2023 08:15:14 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0A8438E; Wed, 13 Dec 2023 05:15:17 -0800 (PST) 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 C796FC15; Wed, 13 Dec 2023 05:16:02 -0800 (PST) Received: from [10.57.85.168] (unknown [10.57.85.168]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 566D13F762; Wed, 13 Dec 2023 05:15:14 -0800 (PST) Message-ID: Date: Wed, 13 Dec 2023 13:16:18 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v5 00/23] Introduce runtime modifiable Energy Model Content-Language: en-US To: adharmap@quicinc.com Cc: dietmar.eggemann@arm.com, rui.zhang@intel.com, amit.kucheria@verdurent.com, amit.kachhap@gmail.com, daniel.lezcano@linaro.org, viresh.kumar@linaro.org, len.brown@intel.com, pavel@ucw.cz, mhiramat@kernel.org, qyousef@layalina.io, wvw@google.com, rafael@kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org References: <20231129110853.94344-1-lukasz.luba@arm.com> From: Lukasz Luba In-Reply-To: <20231129110853.94344-1-lukasz.luba@arm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Wed, 13 Dec 2023 05:15:36 -0800 (PST) Hi Abhijeet, It's been a while when we discussed an EM feature presented on some Android common kernel Gerrit (Nov 2021). On 11/29/23 11:08, Lukasz Luba wrote: > Hi all, > > This patch set adds a new feature which allows to modify Energy Model (EM) > power values at runtime. It will allow to better reflect power model of > a recent SoCs and silicon. Different characteristics of the power usage > can be leveraged and thus better decisions made during task placement in EAS. > > It's part of feature set know as Dynamic Energy Model. It has been presented > and discussed recently at OSPM2023 [3]. This patch set implements the 1st > improvement for the EM. > > The concepts: > 1. The CPU power usage can vary due to the workload that it's running or due > to the temperature of the SoC. The same workload can use more power when the > temperature of the silicon has increased (e.g. due to hot GPU or ISP). > In such situation the EM can be adjusted and reflect the fact of increased > power usage. That power increase is due to static power > (sometimes called simply: leakage). The CPUs in recent SoCs are different. > We have heterogeneous SoCs with 3 (or even 4) different microarchitectures. > They are also built differently with High Performance (HP) cells or > Low Power (LP) cells. They are affected by the temperature increase > differently: HP cells have bigger leakage. The SW model can leverage that > knowledge. > > 2. It is also possible to change the EM to better reflect the currently > running workload. Usually the EM is derived from some average power values > taken from experiments with benchmark (e.g. Dhrystone). The model derived > from such scenario might not represent properly the workloads usually running > on the device. Therefore, runtime modification of the EM allows to switch to > a different model, when there is a need. > > 3. The EM can be adjusted after boot, when all the modules are loaded and > more information about the SoC is available e.g. chip binning. This would help > to better reflect the silicon characteristics. Thus, this EM modification > API allows it now. It wasn't possible in the past and the EM had to be > 'set in stone'. > > More detailed explanation and background can be found in presentations > during LPC2022 [1][2] or in the documentation patches. > > Some test results. > The EM can be updated to fit better the workload type. In the case below the EM > has been updated for the Jankbench test on Pixel6 (running v5.18 w/ mainline backports > for the scheduler bits). The Jankbench was run 10 times for those two configurations, > to get more reliable data. > > 1. Janky frames percentage > +--------+-----------------+---------------------+-------+-----------+ > | metric | variable | kernel | value | perc_diff | > +--------+-----------------+---------------------+-------+-----------+ > | gmean | jank_percentage | EM_default | 2.0 | 0.0% | > | gmean | jank_percentage | EM_modified_runtime | 1.3 | -35.33% | > +--------+-----------------+---------------------+-------+-----------+ > > 2. Avg frame render time duration > +--------+---------------------+---------------------+-------+-----------+ > | metric | variable | kernel | value | perc_diff | > +--------+---------------------+---------------------+-------+-----------+ > | gmean | mean_frame_duration | EM_default | 10.5 | 0.0% | > | gmean | mean_frame_duration | EM_modified_runtime | 9.6 | -8.52% | > +--------+---------------------+---------------------+-------+-----------+ > > 3. Max frame render time duration > +--------+--------------------+---------------------+-------+-----------+ > | metric | variable | kernel | value | perc_diff | > +--------+--------------------+---------------------+-------+-----------+ > | gmean | max_frame_duration | EM_default | 251.6 | 0.0% | > | gmean | max_frame_duration | EM_modified_runtime | 115.5 | -54.09% | > +--------+--------------------+---------------------+-------+-----------+ > > 4. OS overutilized state percentage (when EAS is not working) > +--------------+---------------------+------+------------+------------+ > | metric | wa_path | time | total_time | percentage | > +--------------+---------------------+------+------------+------------+ > | overutilized | EM_default | 1.65 | 253.38 | 0.65 | > | overutilized | EM_modified_runtime | 1.4 | 277.5 | 0.51 | > +--------------+---------------------+------+------------+------------+ > > 5. All CPUs (Little+Mid+Big) power values in mW > +------------+--------+---------------------+-------+-----------+ > | channel | metric | kernel | value | perc_diff | > +------------+--------+---------------------+-------+-----------+ > | CPU | gmean | EM_default | 142.1 | 0.0% | > | CPU | gmean | EM_modified_runtime | 131.8 | -7.27% | > +------------+--------+---------------------+-------+-----------+ > > The time cost to update the EM decreased in this v5 vs v4: > big: 5us vs 2us -> 2.6x faster > mid: 9us vs 3us -> 3x faster > little: 16us vs 16us -> no change > > We still have to update the inefficiency in the cpufreq framework, thus > a bit of overhead will be there. > > Changelog: > v5: > - removed 2 tables design > - have only one table (runtime_table) used also in thermal (Wei, Rafael) > - refactored update function and removed callback call for each opp > - added faster EM table swap, using only the RCU pointer update > - added memory allocation API and tracking with kref > - avoid overhead for computing 'cost' for each OPP in update, it can be > pre-computed in device drivers EM earlier > - add support for device drivers providing EM table > - added API for computing 'cost' values in EM for EAS > - added API for thermal/powercap to use EM (using RCU wrappers) > - switched to single allocation and 'state[]' array (Rafael) > - changed documentation to align with current design > - added helper API for computing cost values > - simplified EM free in unregister path (thanks to kref) > - split patch updating EM clients and changed them separetly > - added seperate patch removing old static EM table > - added EM debugfs change patch to dump the runtime_table > - addressed comments in v4 for spelling/comments/headers > - added review tags > v4 changes are here [4] > > Regards, > Lukasz Luba > > [1] https://lpc.events/event/16/contributions/1341/attachments/955/1873/Dynamic_Energy_Model_to_handle_leakage_power.pdf > [2] https://lpc.events/event/16/contributions/1194/attachments/1114/2139/LPC2022_Energy_model_accuracy.pdf > [3] https://www.youtube.com/watch?v=2C-5uikSbtM&list=PL0fKordpLTjKsBOUcZqnzlHShri4YBL1H > [4] https://lore.kernel.org/lkml/20230925081139.1305766-1-lukasz.luba@arm.com/ > > > Lukasz Luba (23): > PM: EM: Add missing newline for the message log > PM: EM: Refactor em_cpufreq_update_efficiencies() arguments > PM: EM: Find first CPU active while updating OPP efficiency > PM: EM: Refactor em_pd_get_efficient_state() to be more flexible > PM: EM: Refactor a new function em_compute_costs() > PM: EM: Check if the get_cost() callback is present in > em_compute_costs() > PM: EM: Refactor how the EM table is allocated and populated > PM: EM: Introduce runtime modifiable table > PM: EM: Use runtime modified EM for CPUs energy estimation in EAS > PM: EM: Add API for memory allocations for new tables > PM: EM: Add API for updating the runtime modifiable EM > PM: EM: Add helpers to read under RCU lock the EM table > PM: EM: Add performance field to struct em_perf_state > PM: EM: Support late CPUs booting and capacity adjustment > PM: EM: Optimize em_cpu_energy() and remove division > powercap/dtpm_cpu: Use new Energy Model interface to get table > powercap/dtpm_devfreq: Use new Energy Model interface to get table > drivers/thermal/cpufreq_cooling: Use new Energy Model interface > drivers/thermal/devfreq_cooling: Use new Energy Model interface > PM: EM: Change debugfs configuration to use runtime EM table data > PM: EM: Remove old table > PM: EM: Add em_dev_compute_costs() as API for device drivers > Documentation: EM: Update with runtime modification design > > Documentation/power/energy-model.rst | 206 +++++++++++- > drivers/powercap/dtpm_cpu.c | 35 +- > drivers/powercap/dtpm_devfreq.c | 31 +- > drivers/thermal/cpufreq_cooling.c | 40 ++- > drivers/thermal/devfreq_cooling.c | 43 ++- > include/linux/energy_model.h | 163 +++++---- > kernel/power/energy_model.c | 479 +++++++++++++++++++++++---- > 7 files changed, 813 insertions(+), 184 deletions(-) > You've been interested in this feature back then. I have a gentle ask, if you are still interested in. It would be nice if you (or some other Qcom engineer) could leave a feedback comment (similar what you have made for the Gerrit original series). I will be really grateful. In this cover letter, there are some power saving numbers from a real phone, with also performance metrics (janky frames). You might be interested in those scenarios as well. Regards, Lukasz