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.

MFC after:	3 days
Relnotes:	Bug fix in power management on CPUs with Intel Turbo Boost
This commit is contained in:
cperciva 2014-05-11 10:32:58 +00:00
parent 8e56ee9c85
commit e9e7ccdea5

View File

@ -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)