diff mbox series

[v1,05/10] cpufreq: intel_pstate: Rearrange max frequency updates handling code

Message ID 2315023.iZASKD2KPV@rjwysocki.net
State New
Headers show
Series cpufreq: cpufreq_update_limits() fix and some cleanups | expand

Commit Message

Rafael J. Wysocki March 28, 2025, 8:43 p.m. UTC
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Rename __intel_pstate_update_max_freq() to intel_pstate_update_max_freq()
and move the cpufreq policy reference counting and locking into it (and
implement the locking with the recently introduced cpufreq policy "write"
locking guard).

No intentional functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 drivers/cpufreq/intel_pstate.c |   52 +++++++++++++----------------------------
 1 file changed, 17 insertions(+), 35 deletions(-)

Comments

Rafael J. Wysocki April 7, 2025, 6:46 p.m. UTC | #1
On Fri, Mar 28, 2025 at 9:58 PM Rafael J. Wysocki <rjw@rjwysocki.net> wrote:
>
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>
> Rename __intel_pstate_update_max_freq() to intel_pstate_update_max_freq()
> and move the cpufreq policy reference counting and locking into it (and
> implement the locking with the recently introduced cpufreq policy "write"
> locking guard).
>
> No intentional functional impact.
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Hi Srinivas,

If you have any concerns regarding this patch, please let me know.

> ---
>  drivers/cpufreq/intel_pstate.c |   52 +++++++++++++----------------------------
>  1 file changed, 17 insertions(+), 35 deletions(-)
>
> --- a/drivers/cpufreq/intel_pstate.c
> +++ b/drivers/cpufreq/intel_pstate.c
> @@ -1353,9 +1353,16 @@
>                 cpufreq_update_policy(cpu);
>  }
>
> -static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
> -                                          struct cpufreq_policy *policy)
> +static bool intel_pstate_update_max_freq(struct cpudata *cpudata)
>  {
> +       struct cpufreq_policy *policy __free(put_cpufreq_policy);
> +
> +       policy = cpufreq_cpu_get(cpudata->cpu);
> +       if (!policy)
> +               return false;
> +
> +       guard(cpufreq_policy_write)(policy);
> +
>         if (hwp_active)
>                 intel_pstate_get_hwp_cap(cpudata);
>
> @@ -1363,44 +1370,24 @@
>                         cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;
>
>         refresh_frequency_limits(policy);
> +
> +       return true;
>  }
>
>  static void intel_pstate_update_limits(unsigned int cpu)
>  {
> -       struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpu);
> -       struct cpudata *cpudata;
> -
> -       if (!policy)
> -               return;
> -
> -       cpudata = all_cpu_data[cpu];
> -
> -       __intel_pstate_update_max_freq(cpudata, policy);
> -
> -       /* Prevent the driver from being unregistered now. */
> -       mutex_lock(&intel_pstate_driver_lock);
> +       struct cpudata *cpudata = all_cpu_data[cpu];
>
> -       cpufreq_cpu_release(policy);
> -
> -       hybrid_update_capacity(cpudata);
> -
> -       mutex_unlock(&intel_pstate_driver_lock);
> +       if (intel_pstate_update_max_freq(cpudata))
> +               hybrid_update_capacity(cpudata);
>  }
>
>  static void intel_pstate_update_limits_for_all(void)
>  {
>         int cpu;
>
> -       for_each_possible_cpu(cpu) {
> -               struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpu);
> -
> -               if (!policy)
> -                       continue;
> -
> -               __intel_pstate_update_max_freq(all_cpu_data[cpu], policy);
> -
> -               cpufreq_cpu_release(policy);
> -       }
> +       for_each_possible_cpu(cpu)
> +               intel_pstate_update_max_freq(all_cpu_data[cpu]);
>
>         mutex_lock(&hybrid_capacity_lock);
>
> @@ -1840,13 +1827,8 @@
>  {
>         struct cpudata *cpudata =
>                 container_of(to_delayed_work(work), struct cpudata, hwp_notify_work);
> -       struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpudata->cpu);
> -
> -       if (policy) {
> -               __intel_pstate_update_max_freq(cpudata, policy);
> -
> -               cpufreq_cpu_release(policy);
>
> +       if (intel_pstate_update_max_freq(cpudata)) {
>                 /*
>                  * The driver will not be unregistered while this function is
>                  * running, so update the capacity without acquiring the driver
>
>
>
>
diff mbox series

Patch

--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -1353,9 +1353,16 @@ 
 		cpufreq_update_policy(cpu);
 }
 
-static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
-					   struct cpufreq_policy *policy)
+static bool intel_pstate_update_max_freq(struct cpudata *cpudata)
 {
+	struct cpufreq_policy *policy __free(put_cpufreq_policy);
+
+	policy = cpufreq_cpu_get(cpudata->cpu);
+	if (!policy)
+		return false;
+
+	guard(cpufreq_policy_write)(policy);
+
 	if (hwp_active)
 		intel_pstate_get_hwp_cap(cpudata);
 
@@ -1363,44 +1370,24 @@ 
 			cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;
 
 	refresh_frequency_limits(policy);
+
+	return true;
 }
 
 static void intel_pstate_update_limits(unsigned int cpu)
 {
-	struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpu);
-	struct cpudata *cpudata;
-
-	if (!policy)
-		return;
-
-	cpudata = all_cpu_data[cpu];
-
-	__intel_pstate_update_max_freq(cpudata, policy);
-
-	/* Prevent the driver from being unregistered now. */
-	mutex_lock(&intel_pstate_driver_lock);
+	struct cpudata *cpudata = all_cpu_data[cpu];
 
-	cpufreq_cpu_release(policy);
-
-	hybrid_update_capacity(cpudata);
-
-	mutex_unlock(&intel_pstate_driver_lock);
+	if (intel_pstate_update_max_freq(cpudata))
+		hybrid_update_capacity(cpudata);
 }
 
 static void intel_pstate_update_limits_for_all(void)
 {
 	int cpu;
 
-	for_each_possible_cpu(cpu) {
-		struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpu);
-
-		if (!policy)
-			continue;
-
-		__intel_pstate_update_max_freq(all_cpu_data[cpu], policy);
-
-		cpufreq_cpu_release(policy);
-	}
+	for_each_possible_cpu(cpu)
+		intel_pstate_update_max_freq(all_cpu_data[cpu]);
 
 	mutex_lock(&hybrid_capacity_lock);
 
@@ -1840,13 +1827,8 @@ 
 {
 	struct cpudata *cpudata =
 		container_of(to_delayed_work(work), struct cpudata, hwp_notify_work);
-	struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpudata->cpu);
-
-	if (policy) {
-		__intel_pstate_update_max_freq(cpudata, policy);
-
-		cpufreq_cpu_release(policy);
 
+	if (intel_pstate_update_max_freq(cpudata)) {
 		/*
 		 * The driver will not be unregistered while this function is
 		 * running, so update the capacity without acquiring the driver