From: Dmitry Osipenko <digetx@gmail.com>
To: Thierry Reding <thierry.reding@gmail.com>,
MyungJoo Ham <myungjoo.ham@samsung.com>,
Kyungmin Park <kyungmin.park@samsung.com>,
Chanwoo Choi <cw00.choi@samsung.com>,
Jonathan Hunter <jonathanh@nvidia.com>,
Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v3 20/22] PM / devfreq: tegra30: Optimize upper average watermark selection
Date: Fri, 28 Jun 2019 00:11:13 +0300 [thread overview]
Message-ID: <20190627211115.21138-21-digetx@gmail.com> (raw)
In-Reply-To: <20190627211115.21138-1-digetx@gmail.com>
I noticed that CPU may be crossing the dependency threshold very
frequently for some workloads and this results in a lot of interrupts
which could be avoided if MCALL client is keeping actual EMC frequency
at a higher rate.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/devfreq/tegra30-devfreq.c | 23 ++++++++++++++++++-----
1 file changed, 18 insertions(+), 5 deletions(-)
diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c
index 1105104445a9..5b1feaf8c16e 100644
--- a/drivers/devfreq/tegra30-devfreq.c
+++ b/drivers/devfreq/tegra30-devfreq.c
@@ -314,7 +314,8 @@ static void tegra_actmon_get_lower_upper(struct tegra_devfreq *tegra,
}
static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra,
- struct tegra_devfreq_device *dev)
+ struct tegra_devfreq_device *dev,
+ unsigned long freq)
{
unsigned long avg_threshold, lower, upper;
@@ -323,6 +324,15 @@ static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra,
avg_threshold = dev->config->avg_dependency_threshold;
avg_threshold = avg_threshold * ACTMON_SAMPLING_PERIOD;
+ /*
+ * If cumulative EMC frequency selection is higher than the
+ * device's, then there is no need to set upper watermark to
+ * a lower value because it will result in unnecessary upper
+ * interrupts.
+ */
+ if (freq * ACTMON_SAMPLING_PERIOD > upper)
+ upper = freq * ACTMON_SAMPLING_PERIOD;
+
/*
* We want to get interrupts when MCCPU client crosses the
* dependency threshold in order to take into / out of account
@@ -392,6 +402,7 @@ static void actmon_isr_device(struct tegra_devfreq *tegra,
struct tegra_devfreq_device *dev)
{
u32 intr_status, dev_ctrl, avg_intr_mask, avg_count;
+ unsigned long freq;
trace_device_isr_enter(tegra->regs, dev->config->offset,
dev->boost_freq, cpufreq_get(0));
@@ -405,8 +416,10 @@ static void actmon_isr_device(struct tegra_devfreq *tegra,
avg_intr_mask = ACTMON_DEV_INTR_AVG_BELOW_WMARK |
ACTMON_DEV_INTR_AVG_ABOVE_WMARK;
- if (intr_status & avg_intr_mask)
- tegra_devfreq_update_avg_wmark(tegra, dev);
+ if (intr_status & avg_intr_mask) {
+ freq = clk_get_rate(tegra->emc_clock) / KHZ;
+ tegra_devfreq_update_avg_wmark(tegra, dev, freq);
+ }
if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_UPPER) {
/*
@@ -524,7 +537,7 @@ static int tegra_actmon_clk_notify_cb(struct notifier_block *nb,
for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) {
dev = &tegra->devices[i];
- tegra_devfreq_update_avg_wmark(tegra, dev);
+ tegra_devfreq_update_avg_wmark(tegra, dev, freq);
tegra_devfreq_update_wmark(tegra, dev, freq);
}
@@ -629,7 +642,7 @@ static void tegra_actmon_configure_device(struct tegra_devfreq *tegra,
device_writel(dev, dev->avg_freq * ACTMON_SAMPLING_PERIOD,
ACTMON_DEV_INIT_AVG);
- tegra_devfreq_update_avg_wmark(tegra, dev);
+ tegra_devfreq_update_avg_wmark(tegra, dev, dev->avg_freq);
tegra_devfreq_update_wmark(tegra, dev, dev->avg_freq);
device_writel(dev, ACTMON_COUNT_WEIGHT, ACTMON_DEV_COUNT_WEIGHT);
--
2.22.0
next prev parent reply other threads:[~2019-06-27 21:13 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-27 21:10 [PATCH v3 00/22] More improvements for Tegra30 devfreq driver Dmitry Osipenko
2019-06-27 21:10 ` [PATCH v3 01/22] PM / devfreq: tegra30: Change irq type to unsigned int Dmitry Osipenko
2019-06-27 21:10 ` [PATCH v3 02/22] PM / devfreq: tegra30: Keep interrupt disabled while governor is stopped Dmitry Osipenko
2019-06-28 6:48 ` MyungJoo Ham
2019-06-28 7:12 ` Dmitry Osipenko
2019-06-27 21:10 ` [PATCH v3 03/22] PM / devfreq: tegra30: Handle possible round-rate error Dmitry Osipenko
2019-06-27 21:10 ` [PATCH v3 04/22] PM / devfreq: tegra30: Drop write-barrier Dmitry Osipenko
2019-06-27 21:10 ` [PATCH v3 05/22] PM / devfreq: tegra30: Set up watermarks properly Dmitry Osipenko
2019-06-27 21:10 ` [PATCH v3 06/22] PM / devfreq: tegra30: Tune up boosting thresholds Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 07/22] PM / devfreq: tegra30: Use CPUFreq notifier Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 08/22] PM / devfreq: tegra30: Move clk-notifier's registration to governor's start Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 09/22] PM / devfreq: tegra30: Reset boosting on startup Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 10/22] PM / devfreq: tegra30: Don't enable consecutive-down interrupt " Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 11/22] PM / devfreq: tegra30: Add debug messages Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 12/22] PM / devfreq: tegra30: Inline all one-line functions Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 13/22] PM / devfreq: tegra30: Constify structs Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 14/22] PM / devfreq: tegra30: Ensure that target freq won't overflow Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 15/22] PM / devfreq: tegra30: Fix integer overflow on CPU's freq max out Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 16/22] PM / devfreq: tegra30: Use kHz units uniformly in the code Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 17/22] PM / devfreq: tegra30: Use tracepoints for debugging Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 18/22] PM / devfreq: tegra30: Optimize CPUFreq notifier Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 19/22] PM / devfreq: tegra30: Optimize upper consecutive watermark selection Dmitry Osipenko
2019-06-27 21:11 ` Dmitry Osipenko [this message]
2019-06-27 21:11 ` [PATCH v3 21/22] PM / devfreq: tegra30: Include appropriate header Dmitry Osipenko
2019-06-27 21:11 ` [PATCH v3 22/22] PM / devfreq: tegra20/30: Add Dmitry as a maintainer Dmitry Osipenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190627211115.21138-21-digetx@gmail.com \
--to=digetx@gmail.com \
--cc=cw00.choi@samsung.com \
--cc=jonathanh@nvidia.com \
--cc=kyungmin.park@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=myungjoo.ham@samsung.com \
--cc=thierry.reding@gmail.com \
--cc=tomeu.vizoso@collabora.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).