lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <PFDD7S.4NAT8RZ4C0PR2@ljones.dev>
Date: Wed, 17 Jan 2024 08:43:01 +1300
From: Luke Jones <luke@...nes.dev>
To: Hans de Goede <hdegoede@...hat.com>
Cc: Andrei Sabalenka <mechakotik@...il.com>, corentin.chary@...il.com,
	ilpo.jarvinen@...ux.intel.com, acpi4asus-user@...ts.sourceforge.net,
	platform-driver-x86@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] platform/x86: asus-wmi: Re-enable custom fan curves after
 setting throttle_thermal_policy



On Tue, Jan 16 2024 at 11:25:41 +01:00:00, Hans de Goede 
<hdegoede@...hat.com> wrote:
> Hi Luke,
> 
> On 1/15/24 21:25, Luke Jones wrote:
>> 
>> 
>>  On Mon, Jan 15 2024 at 13:38:16 +01:00:00, Hans de Goede 
>> <hdegoede@...hat.com> wrote:
>>>  Hi,
>>> 
>>>  On 1/15/24 13:22, Andrei Sabalenka wrote:
>>>>   When changing throttle_thermal_policy, all the custom fan curves 
>>>> are getting disabled. This patch re-enables all the custom fan 
>>>> curves that were enabled before changing throttle_thermal_policy.
>>>> 
>>>>   I believe it makes asus-wmi sysfs interface more convenient, as 
>>>> it allows userspace to manage fan curves independently from 
>>>> platform_profile and throttle_thermal_policy. At the kernel level, 
>>>> custom fan curves should not be tied to "power profiles" scheme in 
>>>> any way, as it gives the user less freedom of controlling them.
>>> 
>>>  Setting a high performance power-profile typically also involves 
>>> ramping up
>>>  the fans harder. So I don't think this patch is a good idea.
>>> 
>>>  If you really want this behavior then you can always re-enable the 
>>> custom
>>>  curve after changing the profile.
>>> 
>>>  Luke, do you have any opinion on this?
>> 
>>  I see some misconceptions that should be addressed:
>>  1. ASUS themselves set separate fan curves per "platform profile", 
>> both standard and custom
>>  2. fan curves are not tied to platform profiles, they are tied to 
>> the throttle_thermal_policy, and this is actually done in the acpi - 
>> so the code here is a mirror of that
>>  3. platform-profiles are tied to throttle_thermal_policy
>> 
>>  There is no lack of user control at all, a decent tool (like 
>> asusctl) can set fan curves without issues but it's perhaps not 
>> convenient for manually setting via a script etc.
>> 
>>  The main reason that a curve is disabled for the policy being 
>> switched to is for safety. It was a paranoid choice I made at the 
>> time. The kernel (and acpi) can't guarantee that a user set a 
>> reasonable default for that policy so the safest thing is to force 
>> an explicit re-enable of it.
>> 
>>  Having said that: I know that the curve was previously set for that 
>> profile/policy and in theory should be fine plus it is already used 
>> by the user, it is also not possible to set a curve for a different 
>> profile to the one a user is currently in -  this is forced in ACPI 
>> as you can set only the curve for the profile you are in (the kernel 
>> code also mirrors this).
>> 
>>  So this patch should be fine.
>> 
>>  Signed-off-by: Luke D. Jones <luke@...nes.dev>
> 
> So I just checked asus-wmi.c again and there seems to be only 1 custom
> curve per fan, one curve for CPU one for GPU and one for MID.

I misread sorry. Yes this is correct. The ACPI only allows fetching the 
defaults for the currently loaded profile so this was a result of that.

> And while the custom curve may be fine for e.g. low-power mode,
> that same custom curve may lead to overheating/throttling with
> performance mode since performance mode typically requires
> higher fan speeds.
> 
> As you write yourself: 'ASUS themselves set separate fan curves per
> "platform profile", both standard and custom', but there is only 1
> custom/user curve (in the kernel), not 1 per platform-profile.
> 
> So IMHO disabling the custom curve on profile switching is
> the correct thing to do. Then userspace can do something like:
> 

Yes agreed. And that is indeed why I set them to off originally when 
changing profile.

> 1. Have per platform-profile custom curves in some tool
> 2. Have that tool change (or monitor) platform-profile
> 3. Load new custom profile based on the new platform-profile
> 4. Enable the new (fitting to the new platform-profile)
>    custom fan curve.
> 
> I also see that fan_curve_get_factory_default() retrieves the
> defaults for a *specific* thermal-policy / platform-profile
> 
> So if a user somehow just enables custom-fancurves without
> actually changing the curve then this patch would lead
> to the following scenario:
> 
> 1. Driver loads, lets assume the system boots in balanced
> mode, balanced factory-default fan-curve is now loaded into
> the custom fan-curve by fan_curve_check_present()
> 
> 2. User calls fan_curve_enable_store() writing "1", because
> reasons.
> 
> 3. User changes platform-profile to performance,
> throttle_thermal_policy_write() calls asus_wmi_set_devstate(
> ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY) and the EC
> sets fan curve to performance factory-default fan-curve.
> 
> 4. Next throttle_thermal_policy_write() will now call
> fan_curve_write() restoring the balanced factory-default
> fan-curve even though we are in performance mode now.
> 
> This seems undesirable to me.
> 
> Restoring custom fan-curves automatically on platform-profile
> change IMHO requires also storing a separate custom curve
> per profile inside the kernel and populating all custom
> curves with the factory defaults at boot. If I read what
> you have written above this would also actually match
> what you wrote above about ASUS using separate custom curves
> per profile. If ASUS uses separate custom curves per profile
> then IMHO so should Linux.

This is correct yes.

> 
> Note custom fan-curves per profile still means that the custom
> curve will be overwritten when changing profiles, some new sysfs
> interface would be necessary to write the non-active custom
> curves so that the restored curve on profile switch can be
> custom too on the first switch.
> 
> (rather then having to switch to be able to write the custom
> curve for a profile other then the currently active profile).
> 
> Note this is not a 100% hard nack for this patch, but atm
> I'm leaning towards a nack.

I revert my signed-off. This is a nack. Everything a user may want can 
be done in userspace.

> 
> Regards,
> 
> Hans
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
>> 
>>> 
>>>> 
>>>>   Signed-off-by: Andrei Sabalenka <mechakotik@...il.com>
>>>>   ---
>>>>    drivers/platform/x86/asus-wmi.c | 29 
>>>> ++++++++++++++++++++++-------
>>>>    1 file changed, 22 insertions(+), 7 deletions(-)
>>>> 
>>>>   diff --git a/drivers/platform/x86/asus-wmi.c 
>>>> b/drivers/platform/x86/asus-wmi.c
>>>>   index 18be35fdb..c2e38f6d8 100644
>>>>   --- a/drivers/platform/x86/asus-wmi.c
>>>>   +++ b/drivers/platform/x86/asus-wmi.c
>>>>   @@ -3441,13 +3441,28 @@ static int 
>>>> throttle_thermal_policy_write(struct asus_wmi *asus)
>>>>            return -EIO;
>>>>        }
>>>> 
>>>>   -    /* Must set to disabled if mode is toggled */
>>>>   -    if (asus->cpu_fan_curve_available)
>>>>   -        asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = 
>>>> false;
>>>>   -    if (asus->gpu_fan_curve_available)
>>>>   -        asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled = 
>>>> false;
>>>>   -    if (asus->mid_fan_curve_available)
>>>>   -        asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled = 
>>>> false;
>>>>   +    /* Re-enable fan curves after profile change */
>>>>   +    if (asus->cpu_fan_curve_available && 
>>>> asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled) {
>>>>   +        err = fan_curve_write(asus, 
>>>> &asus->custom_fan_curves[FAN_CURVE_DEV_CPU]);
>>>>   +        if (err) {
>>>>   +            pr_warn("Failed to re-enable CPU fan curve: %d\n", 
>>>> err);
>>>>   +            return err;
>>>>   +        }
>>>>   +    }
>>>>   +    if (asus->gpu_fan_curve_available && 
>>>> asus->custom_fan_curves[FAN_CURVE_DEV_GPU].enabled) {
>>>>   +        err = fan_curve_write(asus, 
>>>> &asus->custom_fan_curves[FAN_CURVE_DEV_GPU]);
>>>>   +        if (err) {
>>>>   +            pr_warn("Failed to re-enable GPU fan curve: %d\n", 
>>>> err);
>>>>   +            return err;
>>>>   +        }
>>>>   +    }
>>>>   +    if (asus->mid_fan_curve_available && 
>>>> asus->custom_fan_curves[FAN_CURVE_DEV_MID].enabled) {
>>>>   +        err = fan_curve_write(asus, 
>>>> &asus->custom_fan_curves[FAN_CURVE_DEV_MID]);
>>>>   +        if (err) {
>>>>   +            pr_warn("Failed to re-enable MID fan curve: %d\n", 
>>>> err);
>>>>   +            return err;
>>>>   +        }
>>>>   +    }
>>>> 
>>>>        return 0;
>>>>    }
>>> 
>> 
>> 
> 



Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ