]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 29 Jan 2018 12:34:33 +0000 (13:34 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 29 Jan 2018 12:34:33 +0000 (13:34 +0100)
added patches:
cpufreq-governor-ensure-sufficiently-large-sampling-intervals.patch

queue-4.14/cpufreq-governor-ensure-sufficiently-large-sampling-intervals.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/cpufreq-governor-ensure-sufficiently-large-sampling-intervals.patch b/queue-4.14/cpufreq-governor-ensure-sufficiently-large-sampling-intervals.patch
new file mode 100644 (file)
index 0000000..4d0a7fa
--- /dev/null
@@ -0,0 +1,72 @@
+From 56026645e2b6f11ede34a5e6ab69d3eb56f9c8fc Mon Sep 17 00:00:00 2001
+From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Date: Mon, 18 Dec 2017 02:15:32 +0100
+Subject: cpufreq: governor: Ensure sufficiently large sampling intervals
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+commit 56026645e2b6f11ede34a5e6ab69d3eb56f9c8fc upstream.
+
+After commit aa7519af450d (cpufreq: Use transition_delay_us for legacy
+governors as well) the sampling_rate field of struct dbs_data may be
+less than the tick period which causes dbs_update() to produce
+incorrect results, so make the code ensure that the value of that
+field will always be sufficiently large.
+
+Fixes: aa7519af450d (cpufreq: Use transition_delay_us for legacy governors as well)
+Reported-by: Andy Tang <andy.tang@nxp.com>
+Reported-by: Doug Smythies <dsmythies@telus.net>
+Tested-by: Andy Tang <andy.tang@nxp.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/cpufreq/cpufreq_governor.c |   19 ++++++++++++++++---
+ 1 file changed, 16 insertions(+), 3 deletions(-)
+
+--- a/drivers/cpufreq/cpufreq_governor.c
++++ b/drivers/cpufreq/cpufreq_governor.c
+@@ -22,6 +22,8 @@
+ #include "cpufreq_governor.h"
++#define CPUFREQ_DBS_MIN_SAMPLING_INTERVAL     (2 * TICK_NSEC / NSEC_PER_USEC)
++
+ static DEFINE_PER_CPU(struct cpu_dbs_info, cpu_dbs);
+ static DEFINE_MUTEX(gov_dbs_data_mutex);
+@@ -47,11 +49,15 @@ ssize_t store_sampling_rate(struct gov_a
+ {
+       struct dbs_data *dbs_data = to_dbs_data(attr_set);
+       struct policy_dbs_info *policy_dbs;
++      unsigned int sampling_interval;
+       int ret;
+-      ret = sscanf(buf, "%u", &dbs_data->sampling_rate);
+-      if (ret != 1)
++
++      ret = sscanf(buf, "%u", &sampling_interval);
++      if (ret != 1 || sampling_interval < CPUFREQ_DBS_MIN_SAMPLING_INTERVAL)
+               return -EINVAL;
++      dbs_data->sampling_rate = sampling_interval;
++
+       /*
+        * We are operating under dbs_data->mutex and so the list and its
+        * entries can't be freed concurrently.
+@@ -430,7 +436,14 @@ int cpufreq_dbs_governor_init(struct cpu
+       if (ret)
+               goto free_policy_dbs_info;
+-      dbs_data->sampling_rate = cpufreq_policy_transition_delay_us(policy);
++      /*
++       * The sampling interval should not be less than the transition latency
++       * of the CPU and it also cannot be too small for dbs_update() to work
++       * correctly.
++       */
++      dbs_data->sampling_rate = max_t(unsigned int,
++                                      CPUFREQ_DBS_MIN_SAMPLING_INTERVAL,
++                                      cpufreq_policy_transition_delay_us(policy));
+       if (!have_governor_per_policy())
+               gov->gdbs_data = dbs_data;
index 7eda6773d41030b86c894994ba65a0a2b6de414e..5e47116012582cd082f9f31f3c8577004d44b2ff 100644 (file)
@@ -68,3 +68,4 @@ bpf-fix-divides-by-zero.patch
 bpf-fix-32-bit-divide-by-zero.patch
 bpf-reject-stores-into-ctx-via-st-and-xadd.patch
 bpf-arm64-fix-stack_depth-tracking-in-combination-with-tail-calls.patch
+cpufreq-governor-ensure-sufficiently-large-sampling-intervals.patch