Re: PROBLEM: Performance drop

From: Jason Vas Dias
Date: Sat Jul 14 2012 - 07:12:16 EST


Hi - any progress on this or on the patch I submitted for it ? -
please see enclosed - apologies for my being forced to use gmail which
has mandatory line wrap -
Please do something about restoring correct thermal operation on
x86_64 K8's with HP BIOS !
Thanks & Regards,
Jason

Re: [PATCH: 1/1] ACPI: make evaluation of thermal trip points before
temperature or vice versa dependant on new "temp_b4_trip" module
parameter to support older AMD x86_64s
Kernel
x
Jason Vas Dias

Jul 9 (5 days ago)

Reply
to Rusty, linux-kernel, Andreas, Matthew, Len, Comrade
Thanks Rusty - sorry I didn't see your email until now - revised patch
addressing your comments attached -
BTW, sorry about the word wrap on the initial posting - should I
attach a '.patch' file or inline ? Trying both .

The Revised Patch (against :
commit bd0a521e88aa7a06ae7aabaed7ae196ed4ad867a
Author: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Date: Sat Jul 7 17:23:56 2012 -0700

Linux 3.5-rc6
) :
$ git diff bd0a521e88aa7a06ae7aabaed7ae196ed4ad867a >
/tmp/acpi_thermal_temp_b4_trip.patch
$ cat /tmp/acpi_thermal_temp_b4_trip.patch
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
index 7dbebea..13d3b22 100644
--- a/drivers/acpi/thermal.c
+++ b/drivers/acpi/thermal.c
@@ -96,6 +96,10 @@ static int psv;
module_param(psv, int, 0644);
MODULE_PARM_DESC(psv, "Disable or override all passive trip
points.");

+static bool temp_b4_trip;
+module_param(temp_b4_trip, bool, 0644);
+MODULE_PARM_DESC(temp_b4_trip, "Get the temperature before
initializing trip points.");
+
static int acpi_thermal_add(struct acpi_device *device);
static int acpi_thermal_remove(struct acpi_device *device, int type);
static int acpi_thermal_resume(struct acpi_device *device);
@@ -941,27 +945,41 @@ static int acpi_thermal_get_info(struct
acpi_thermal *tz)
if (!tz)
return -EINVAL;

- /* Get trip points [_CRT, _PSV, etc.] (required) */
- result = acpi_thermal_get_trip_points(tz);
- if (result)
+ if( temp_b4_trip )
+ { /* some CPUs, eg AMD K8 need temperature before trip points
can be obtained */
+ /* Get temperature [_TMP] (required) */
+ result = acpi_thermal_get_temperature(tz);
+ if (result)
return result;
-
- /* Get temperature [_TMP] (required) */
- result = acpi_thermal_get_temperature(tz);
- if (result)
+
+ /* Get trip points [_CRT, _PSV, etc.] (required) */
+ result = acpi_thermal_get_trip_points(tz);
+ if (result)
return result;
-
+ }else
+ { /* newer x86_64s need trip points set before temperature
obtained */
+ /* Get trip points [_CRT, _PSV, etc.] (required) */
+ result = acpi_thermal_get_trip_points(tz);
+ if (result)
+ return result;
+
+ /* Get temperature [_TMP] (required) */
+ result = acpi_thermal_get_temperature(tz);
+ if (result)
+ return result;
+ }
+
/* Set the cooling mode [_SCP] to active cooling (default) */
result = acpi_thermal_set_cooling_mode(tz,
ACPI_THERMAL_MODE_ACTIVE);
if (!result)
tz->flags.cooling_mode = 1;
-
+
/* Get default polling frequency [_TZP] (optional) */
if (tzp)
tz->polling_frequency = tzp;
else
acpi_thermal_get_polling_frequency(tz);
-
+
return 0;
}

@@ -1110,6 +1128,14 @@ static int thermal_psv(const struct
dmi_system_id *d) {
return 0;
}

+static int thermal_temp_b4_trip(const struct dmi_system_id *d) {
+
+ printk(KERN_NOTICE "ACPI: %s detected: : "
+ "getting temperature before trip point
initialisation\n", d->ident);
+ temp_b4_trip = TRUE;
+ return 0;
+}
+
static struct dmi_system_id thermal_dmi_table[] __initdata = {
/*
* Award BIOS on this AOpen makes thermal control almost
worthless.
@@ -1147,6 +1173,14 @@ static struct dmi_system_id thermal_dmi_table[]
__initdata = {
DMI_MATCH(DMI_BOARD_NAME, "7ZX"),
},
},
+ {
+ .callback = thermal_temp_b4_trip,
+ .ident = "HP 6715b laptop",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"),
+ },
+ },
{}
};

Incidentally, there are still plenty of cpufreq and temperature
related issues on this platform :
with the "ondemand" or "performance" governors, placing a large
load on system
( eg. building gcc-4.7.1 ) makes the CPU switch into highest
frequency, but not switch
down after the 65 degree trip point has been toggled once .
And once the trip point has been reached once and the temperature
falls below 65, returning CPU freq to 2GHz,
the reported temperature seems to be stuck at 62 degrees even
though the base of the laptop nearly burns my hand .
So I get emergency overheating reboots unless I manually run my
cpufreq & temperature monitoring scripts -
which, if the CPU freq is 2Ghz, now have to down the freqency to
800Khz for 2 seconds every 8 seconds
regardless of what temperature
is reported .


On Mon, Jul 9, 2012 at 1:30 AM, Rusty Russell <rusty@xxxxxxxxxx> wrote:
> On Sun, 8 Jul 2012 19:50:54 +0100, Jason Vas Dias <jason.vas.dias@xxxxxxxxx> wrote:
>> This patch adds a new acpi.thermal.temp_b4_trip = 1 settting, which
>> causes the temperature
>> to be set before evaluation of thermal trip points (the old default) ;
>> this mode should
>> be selected automatically by DMI match if the system identifies as "HP
>> Compaq 6715b" .
>>
>> Please consider applying a patch like that attached to fix the issue reported
>> in lkml thread "Re: PROBLEM: Performance drop" recently, whereby
>> it was found that HP 6715b laptops ( which have 2.2Ghz dual-core AMD
>> x86_64 k8 CPUs)
>> get stuck running the CPU at 800Khz and cannot switch frequency. I have verified
>> that this still the case with v3.4.4 tagged "stable" kernel.
>
>
>>
>> diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
>> index 7dbebea..de2b164 100644
>> --- a/drivers/acpi/thermal.c
>> +++ b/drivers/acpi/thermal.c
>> @@ -96,6 +96,10 @@ static int psv;
>> module_param(psv, int, 0644);
>> MODULE_PARM_DESC(psv, "Disable or override all passive trip points.");
>>
>> +static int temp_b4_trip;
>> +module_param(temp_b4_trip, int, 0);
>> +MODULE_PARM_DESC(temp_b4_trip, "Get the temperature before
>> initializing trip points.");
>> +
>
> Hi Jason,
>
> Two points: this is a bool, why not make it one? I know, the
> rest of the code is old-school, but this is a new parameter. Also, why
> not 0644 so it can be read and set at runtime?
>
> Cheers,
> Rusty.

On Wed, Jul 11, 2012 at 11:06 PM, Greg Kroah-Hartman
<gregkh@xxxxxxxxxxxxxxxxxxx> wrote:
> On Sat, Jul 07, 2012 at 03:40:58PM +0100, Jason Vas Dias wrote:
>> I can confirm that the AMD Turion X2 2.2Ghz HP Compaq 6715b
>> "business" x86_64 k8 dual-core laptops circa 2007
>> DO get stuck in 800Khz mode and cannot switch out of it after booting
>> the "stable" "v3.4.4" tagged kernel.
>>
>> I followed the containing post and reverted commit
>> ff74ae50f01ee67764564815c023c362c87ce18b :
>>
>> Commit d51cdad33bb5bb370c05129f7c7f3a16a55eff40
>> Author: root <root@xxxxxxxxxxxxxxxxxx>
>> Date: Fri Jul 6 18:57:03 2012 +0000
>>
>> Revert "ACPI: Evaluate thermal trip points before reading temperature"
>>
>> This reverts commit 9bcb8118965ab4631a65ee0726e6518f75cda6c5.
>>
>> commit ff74ae50f01ee67764564815c023c362c87ce18b
>> Author: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
>> Date: Fri Jun 22 11:37:50 2012 -0700
>>
>> And wow ! what a difference - back to a circa 2007 machine versus a
>> circa 1987 machine.
>>
>> Not too many of us left around trying to run the latest version of
>> linux on nearly 5-year-old hardware I guess, but still -
>> please can you restore correct Linux cpufreq & thermal operation on
>> old-style AMD k8 CPUs ?
>> They do seem to depend on the temperature being set BEFORE 1st entry .
>>
>> Thanks & Regards,
>> Jason Vas Dias (a Software Engineer) <jason.vas.dias@xxxxxxxxx>
>
> Any reason you didn't include the original developers of the
> 9bcb8118965ab4631a65ee0 patch?
>
> Matthew, Len, any ideas?
>
> greg k-h

Attachment: ACPI-Thermal-PROBLEM_performance_X86_64_K8.patch
Description: Binary data