cpufreq: intel_pstate: Assorted cleanups
Subsystems (2)
cover cpufreq: intel_pstate: Assorted cleanups
Hi,
These three patches clean up intel_pstate a bit:
[1/3] makes it always use READ_ONCE() for reading hwp_cap_cached [2/3] changes the first argument of intel_pstate_get_hwp_max() [3/3] renames to functions (to avoid possible confusion).
Please see patch changelogs for details.
Thanks!
PATCH 1/3 cpufreq: intel_pstate: Always read hwp_cap_cached with READ_ONCE()
From: Rafael J. Wysocki <[email protected]>
Because intel_pstate_get_hwp_max() which updates hwp_cap_cached may run in parallel with the readers of it, annotate all of the read accesses to it with READ_ONCE().
--- drivers/cpufreq/intel_pstate.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/cpufreq/intel_pstate.c +7 -6
@@ -914,7 +914,7 @@ static void intel_pstate_hwp_offline(str } value &= ~GENMASK_ULL (31 ,0 ); - min_perf =HWP_LOWEST_PERF (cpu->hwp_cap_cached); + min_perf =HWP_LOWEST_PERF (READ_ONCE (cpu->hwp_cap_cached));/* Set hwp_max = hwp_min */ value |=HWP_MAX_PERF (min_perf);
@@ -1750,6 +1750,7 @@ static int hwp_boost_hold_time_ns = 3 *static inline void intel_pstate_hwp_boost_up (struct cpudata *cpu) {u64 hwp_req =READ_ONCE (cpu->hwp_req_cached); +u64 hwp_cap =READ_ONCE (cpu->hwp_cap_cached);u32 max_limit = (hwp_req &0xff00 ) >>8 ;u32 min_limit = (hwp_req &0xff );u32 boost_level1;
@@ -1776,14 +1777,14 @@ static inline void intel_pstate_hwp_boos cpu->hwp_boost_min = min_limit;/* level at half way mark between min and guranteed */ - boost_level1 = (HWP_GUARANTEED_PERF (cpu->hwp_cap_cached) + min_limit) >>1 ; + boost_level1 = (HWP_GUARANTEED_PERF (hwp_cap) + min_limit) >>1 ;if (cpu->hwp_boost_min < boost_level1) cpu->hwp_boost_min = boost_level1; -else if (cpu->hwp_boost_min <HWP_GUARANTEED_PERF (cpu->hwp_cap_cached)) - cpu->hwp_boost_min =HWP_GUARANTEED_PERF (cpu->hwp_cap_cached); -else if (cpu->hwp_boost_min ==HWP_GUARANTEED_PERF (cpu->hwp_cap_cached) && - max_limit !=HWP_GUARANTEED_PERF (cpu->hwp_cap_cached)) +else if (cpu->hwp_boost_min <HWP_GUARANTEED_PERF (hwp_cap)) + cpu->hwp_boost_min =HWP_GUARANTEED_PERF (hwp_cap); +else if (cpu->hwp_boost_min ==HWP_GUARANTEED_PERF (hwp_cap) && + max_limit !=HWP_GUARANTEED_PERF (hwp_cap)) cpu->hwp_boost_min = max_limit;else return ;
Re: [PATCH v1 1/3] cpufreq: intel_pstate: Always read hwp_cap_cached with READ_ONCE()
Quoted 7 lines · Rafael J. Wysocki
From: Rafael J. Wysocki <[email protected]>
Because
intel_pstate_get_hwp_max()which updateshwp_cap_cachedmay run in parallel with the readers of it, annotate all of the read accesses to it withREAD_ONCE().Signed-off-by Rafael J. Wysocki <[email protected]>
thanks,
Chenyu
PATCH 2/3 cpufreq: intel_pstate: Change intel_pstate_get_hwp_max() argument
In reply to Rafael J. WysockiFrom: Rafael J. Wysocki <[email protected]>
All of the callers of intel_pstate_get_hwp_max() access the struct cpudata object that corresponds to the given CPU already and the function itself needs to access that object (in order to update hwp_cap_cached), so modify the code to pass a struct cpudata pointer to it instead of the CPU number.
--- drivers/cpufreq/intel_pstate.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/cpufreq/intel_pstate.c +8 -8
@@ -819,13 +819,13 @@ static struct freq_attr *hwp_cpufreq_att NULL, }; -static void intel_pstate_get_hwp_max (unsigned int cpu,int *phy_max, +static void intel_pstate_get_hwp_max (struct cpudata *cpu,int *phy_max,int *current_max) {u64 cap; -rdmsrl_on_cpu (cpu,MSR_HWP_CAPABILITIES , &cap); -WRITE_ONCE (all_cpu_data[cpu]->hwp_cap_cached, cap); +rdmsrl_on_cpu (cpu->cpu,MSR_HWP_CAPABILITIES , &cap); +WRITE_ONCE (cpu->hwp_cap_cached, cap);if (global.no_turbo || global.turbo_disabled) *current_max =HWP_GUARANTEED_PERF (cap);else
@@ -1213,7 +1213,7 @@ static void update_qos_request(enum freqcontinue ;if (hwp_active) -intel_pstate_get_hwp_max (i, &turbo_max, &max_state); +intel_pstate_get_hwp_max (cpu, &turbo_max, &max_state);else turbo_max = cpu->pstate.turbo_pstate;
@@ -1723,7 +1723,7 @@ static void intel_pstate_get_cpu_pstatesif (hwp_active && !hwp_mode_bdw) {unsigned int phy_max, current_max; -intel_pstate_get_hwp_max (cpu->cpu, &phy_max, ¤t_max); +intel_pstate_get_hwp_max (cpu, &phy_max, ¤t_max); cpu->pstate.turbo_freq = phy_max * cpu->pstate.scaling; cpu->pstate.turbo_pstate = phy_max; }else {
@@ -2208,7 +2208,7 @@ static void intel_pstate_update_perf_lim* rather than pure ratios. */ if (hwp_active) { -intel_pstate_get_hwp_max (cpu->cpu, &turbo_max, &max_state); +intel_pstate_get_hwp_max (cpu, &turbo_max, &max_state); }else { max_state = global.no_turbo || global.turbo_disabled ? cpu->pstate.max_pstate : cpu->pstate.turbo_pstate;
@@ -2323,7 +2323,7 @@ static void intel_pstate_verify_cpu_poliif (hwp_active) {int max_state, turbo_max; -intel_pstate_get_hwp_max (cpu->cpu, &turbo_max, &max_state); +intel_pstate_get_hwp_max (cpu, &turbo_max, &max_state); max_freq = max_state * cpu->pstate.scaling; }else { max_freq =intel_pstate_get_max_freq (cpu);
@@ -2710,7 +2710,7 @@ static int intel_cpufreq_cpu_init(structif (hwp_active) {u64 value; -intel_pstate_get_hwp_max (policy->cpu, &turbo_max, &max_state); +intel_pstate_get_hwp_max (cpu, &turbo_max, &max_state); policy->transition_delay_us =INTEL_CPUFREQ_TRANSITION_DELAY_HWP ;rdmsrl_on_cpu (cpu->cpu,MSR_HWP_REQUEST , &value);WRITE_ONCE (cpu->hwp_req_cached, value);
Re: [PATCH v1 2/3] cpufreq: intel_pstate: Change intel_pstate_get_hwp_max() argument
Quoted 9 lines · Rafael J. Wysocki
From: Rafael J. Wysocki <[email protected]>
All of the callers of
intel_pstate_get_hwp_max()access the struct cpudata object that corresponds to the given CPU already and the function itself needs to access that object (in order to updatehwp_cap_cached), so modify the code to pass a struct cpudata pointer to it instead of the CPU number.Signed-off-by Rafael J. Wysocki <[email protected]>
thanks,
Chenyu
PATCH 3/3 cpufreq: intel_pstate: Rename two functions
In reply to Rafael J. WysockiFrom: Rafael J. Wysocki <[email protected]>
Rename intel_cpufreq_adjust_hwp() and intel_cpufreq_adjust_perf_ctl() to intel_cpufreq_hwp_update() and intel_cpufreq_perf_ctl_update(), respectively, to avoid possible confusion with the ->adjist_perf() callback function, intel_cpufreq_adjust_perf().
--- drivers/cpufreq/intel_pstate.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/cpufreq/intel_pstate.c +5 -5
@@ -2527,7 +2527,7 @@ static void intel_cpufreq_trace(struct c fp_toint(cpu->iowait_boost * 100)); } -static void intel_cpufreq_adjust_hwp (struct cpudata *cpu,u32 min,u32 max, +static void intel_cpufreq_hwp_update (struct cpudata *cpu,u32 min,u32 max,u32 desired,bool fast_switch) {u64 prev =READ_ONCE (cpu->hwp_req_cached), value = prev;
@@ -2551,7 +2551,7 @@ static void intel_cpufreq_adjust_hwp(strwrmsrl_on_cpu (cpu->cpu,MSR_HWP_REQUEST , value); } -static void intel_cpufreq_adjust_perf_ctl (struct cpudata *cpu, +static void intel_cpufreq_perf_ctl_update (struct cpudata *cpu,u32 target_pstate,bool fast_switch) {if (fast_switch)
@@ -2573,10 +2573,10 @@ static int intel_cpufreq_update_pstate(sint max_pstate = policy->strict_target ? target_pstate : cpu->max_perf_ratio; -intel_cpufreq_adjust_hwp (cpu, target_pstate, max_pstate,0 , +intel_cpufreq_hwp_update (cpu, target_pstate, max_pstate,0 , fast_switch); }else if (target_pstate != old_pstate) { -intel_cpufreq_adjust_perf_ctl (cpu, target_pstate, fast_switch); +intel_cpufreq_perf_ctl_update (cpu, target_pstate, fast_switch); } cpu->pstate.current_pstate = target_pstate;
@@ -2674,7 +2674,7 @@ static void intel_cpufreq_adjust_perf(un target_pstate =clamp_t (int, target_pstate, min_pstate, max_pstate); -intel_cpufreq_adjust_hwp (cpu, min_pstate, max_pstate, target_pstate, true); +intel_cpufreq_hwp_update (cpu, min_pstate, max_pstate, target_pstate, true); cpu->pstate.current_pstate = target_pstate;intel_cpufreq_trace (cpu,INTEL_PSTATE_TRACE_FAST_SWITCH , old_pstate);
Re: [PATCH v1 3/3] cpufreq: intel_pstate: Rename two functions
Quoted 9 lines · Rafael J. Wysocki
From: Rafael J. Wysocki <[email protected]>
Rename
intel_cpufreq_adjust_hwp()andintel_cpufreq_adjust_perf_ctl()tointel_cpufreq_hwp_update()andintel_cpufreq_perf_ctl_update(), respectively, to avoid possible confusion with the ->adjist_perf() callback function,intel_cpufreq_adjust_perf().Signed-off-by Rafael J. Wysocki <[email protected]>---