summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcperciva <cperciva@FreeBSD.org>2014-05-15 18:07:35 +0000
committercperciva <cperciva@FreeBSD.org>2014-05-15 18:07:35 +0000
commitec1799d21351b5f724b923379f107744ce518cdb (patch)
tree823aff1ee8e4a8105967d6d7b8909c0b3b6ee35a
parent3baa8a1f959d0dfa87ffc9b867df37f1bc3a81e7 (diff)
downloadFreeBSD-src-ec1799d21351b5f724b923379f107744ce518cdb.zip
FreeBSD-src-ec1799d21351b5f724b923379f107744ce518cdb.tar.gz
MFC r265876:
In cf_get_method, when we don't already know what clock speed the CPU is running at, guess the nearest value instead of looking for a value within 25 MHz of the observed frequency. Prior to this change, if a system booted with Intel Turbo Boost enabled, the dev.cpu.0.freq sysctl is nonfunctional, since the ACPI-reported frequency for Turbo Boost states does not match the actual clock frequency (and thus no levels are within 25 MHz of the observed frequency) and the current performance level is read before a new level is set. Relnotes: Bug fix in power management on CPUs with Intel Turbo Boost
-rw-r--r--sys/kern/kern_cpu.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/kern/kern_cpu.c b/sys/kern/kern_cpu.c
index b4ba635..7206c38 100644
--- a/sys/kern/kern_cpu.c
+++ b/sys/kern/kern_cpu.c
@@ -418,7 +418,7 @@ cf_get_method(device_t dev, struct cf_level *level)
struct cf_setting *curr_set, set;
struct pcpu *pc;
device_t *devs;
- int count, error, i, n, numdevs;
+ int bdiff, count, diff, error, i, n, numdevs;
uint64_t rate;
sc = device_get_softc(dev);
@@ -494,14 +494,15 @@ cf_get_method(device_t dev, struct cf_level *level)
}
cpu_est_clockrate(pc->pc_cpuid, &rate);
rate /= 1000000;
+ bdiff = 1 << 30;
for (i = 0; i < count; i++) {
- if (CPUFREQ_CMP(rate, levels[i].total_set.freq)) {
+ diff = abs(levels[i].total_set.freq - rate);
+ if (diff < bdiff) {
+ bdiff = diff;
sc->curr_level = levels[i];
- CF_DEBUG("get estimated freq %d\n", curr_set->freq);
- goto out;
}
}
- error = ENXIO;
+ CF_DEBUG("get estimated freq %d\n", curr_set->freq);
out:
if (error == 0)
OpenPOWER on IntegriCloud