Re: [PATCH] cpufreq/cppc: fix perf_to_khz conversion exception

From: liwei (JK)
Date: Sun May 05 2024 - 22:55:24 EST


Hello Pierre,

Thanks for your reminder.

在 2024/5/3 15:42, Pierre Gondois 写道:
Hello Liwei,

Thanks for the fix. I think there might be a similar issue
in cppc_khz_to_perf(),

Regards,
Pierre


cppc_khz_to_perf() also has similar issue, I will modify the patch again.

Liwei

On 4/30/24 12:12, liwei wrote:
When the nominal_freq recorded by the kernel is equal to lowest_freq and
the frequency reduction operation is triggered externally, there is a
conversion logic error in cppc_perf_to_khz(), causing the kernel to be
unable to feedback the true frequency.

Fix this by adding the branch processing logic when nominal_freq is equal
to lowest_freq.

Fixes: ec1c7ad47664 ("cpufreq: CPPC: Fix performance/frequency conversion")
Signed-off-by: liwei <liwei728@xxxxxxxxxx>
---
  drivers/acpi/cppc_acpi.c | 10 ++++++++--
  1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index a40b6f3946ef..92aac6974e0e 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -1869,9 +1869,15 @@ unsigned int cppc_perf_to_khz(struct cppc_perf_caps *caps, unsigned int perf)
      u64 mul, div;
      if (caps->lowest_freq && caps->nominal_freq) {
-        mul = caps->nominal_freq - caps->lowest_freq;
+        /* Avoid the special case when nominal_freq is equal to lowest_freq */
+        if (caps->lowest_freq == caps->nominal_freq) {
+            mul = caps->nominal_freq;
+            div = caps->nominal_perf;
+        } else {
+            mul = caps->nominal_freq - caps->lowest_freq;
+            div = caps->nominal_perf - caps->lowest_perf;
+        }
          mul *= KHZ_PER_MHZ;
-        div = caps->nominal_perf - caps->lowest_perf;
          offset = caps->nominal_freq * KHZ_PER_MHZ -
               div64_u64(caps->nominal_perf * mul, div);
      } else {