lkml.org 
[lkml]   [2017]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH V3 3/9] cpufreq: Cap the default transition delay value to 10 ms
On 25-07-17, 14:54, Leonard Crestez wrote:

Thanks for reporting Leonard, really appreciate it.

> This patch made it's way into linux-next and it seems to cause imx socs
> to almost always hang around their max frequency with the ondemand
> governor, even when almost completely idle. The lowest frequency is
> never reached. This seems wrong?

Sure thing. Though I tried to reproduce it on Hikey today and it all
worked pretty fine with ondemand governor. The latency is around 500
us here. I don't have a clue right now on what's wrong in your setup.

> This driver calculates transition_latency at probe time, the value is
> not terribly accurate but it reaches values like latency = 109 us, so

So this is the value that is stored in the global variable
"transition_latency" in the imx6q-cpufreq.c file? i.e.
transition_latency = 109000 (ns) to be exact ?

> this patch clamps it at about 10% of the value.

Without this patch the sampling rate of ondemand governor will be 109
ms. And after this patch it would be capped at 10 ms. Why would that
screw up anyone's setup ? I don't have an answer to that right now.

> It's worth noting that the default IMX config has HZ=100 and
> NO_HZ_IDLE=y, so maybe doing idle checks at a rate comparable to the
> jiffie tick screws stuff up?

Maybe, but I am not sure at all.

Can you try few things ?

- Don't use this patch and try to change ondemand's sampling rate from
sysfs. Try setting it to 10000 and see if the behavior is identical
to after this patch.

- Find how much time does it really take to change the frequency of
the CPU. I don't really thing 109 us is the right transition
latency. Use attached patch for that and look for the print message.

--
viresh
From 95d830ad8765d6c35fb9e91d5028bf3cf1ff2451 Mon Sep 17 00:00:00 2001
Message-Id: <95d830ad8765d6c35fb9e91d5028bf3cf1ff2451.1501049147.git.viresh.kumar@linaro.org>
From: Viresh Kumar <viresh.kumar@linaro.org>
Date: Fri, 2 Jun 2017 15:00:58 +0530
Subject: [PATCH] cpufreq: Find transition latency dynamically

Test patch to find latency dynamically.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
drivers/cpufreq/cpufreq.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 0d6fbb3099b4..e62d670dffd2 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1076,6 +1076,62 @@ __weak struct cpufreq_governor *cpufreq_default_governor(void)
return NULL;
}

+static int find_dvfs_latency(struct cpufreq_policy *policy, unsigned long freq,
+ unsigned int *latency_ns)
+{
+ u64 time;
+ int ret;
+
+ time = local_clock();
+ ret = __cpufreq_driver_target(policy, freq, CPUFREQ_RELATION_L);
+ *latency_ns = local_clock() - time;
+
+ return ret;
+}
+
+/*
+ * Find the transition latency dynamically by:
+ * - Switching to min freq first.
+ * - Then switching to max freq.
+ * - And finally switching back to the initial freq.
+ *
+ * The maximum duration of the above three freq changes should be good enough to
+ * find the maximum transition latency for a platform.
+ */
+static void cpufreq_find_target_latency(struct cpufreq_policy *policy)
+{
+ unsigned long initial_freq = policy->cur;
+ unsigned int latency_ns, latency_max_ns;
+ int ret;
+
+ if (!has_target())
+ return;
+
+ /* Go to min frequency first */
+ ret = find_dvfs_latency(policy, policy->cpuinfo.min_freq, &latency_ns);
+ if (ret)
+ return;
+
+ latency_max_ns = latency_ns;
+
+ /* Go to max frequency then.. */
+ ret = find_dvfs_latency(policy, policy->cpuinfo.max_freq, &latency_ns);
+ if (ret)
+ return;
+
+ latency_max_ns = max(latency_max_ns, latency_ns);
+
+ /* And finally switch back to where we started from */
+ ret = find_dvfs_latency(policy, initial_freq, &latency_ns);
+ if (ret)
+ return;
+
+ policy->cpuinfo.transition_latency = max(latency_max_ns, latency_ns);
+
+ pr_info("%s: Setting transition latency to %u ns for policy of CPU%d\n",
+ __func__, policy->cpuinfo.transition_latency, policy->cpu);
+}
+
static int cpufreq_init_policy(struct cpufreq_policy *policy)
{
struct cpufreq_governor *gov = NULL;
@@ -1345,6 +1401,8 @@ static int cpufreq_online(unsigned int cpu)
}

if (new_policy) {
+ cpufreq_find_target_latency(policy);
+
ret = cpufreq_add_dev_interface(policy);
if (ret)
goto out_exit_policy;
--
2.13.0.71.gd7076ec9c9cb
\
 
 \ /
  Last update: 2017-07-26 08:07    [W:0.271 / U:0.116 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site