FAILED: patch "[PATCH] cpufreq: amd-pstate: Add ->fast_switch() callback" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 4badf2eb1e986bdbf34dd2f5d4c979553a86fe54
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023052858-overgrown-profile-8066@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
4badf2eb1e98 ("cpufreq: amd-pstate: Add ->fast_switch() callback")2dd6d0ebf740 ("cpufreq: amd-pstate: Add guided autonomous mode")3e6e07805764 ("Documentation: cpufreq: amd-pstate: Move amd_pstate param to alphabetical order") 5014603e409b ("Documentation: introduce amd pstate active mode kernel command line options") ffa5096a7c33 ("cpufreq: amd-pstate: implement Pstate EPP support for the AMD processors") 36c5014e5460 ("cpufreq: amd-pstate: optimize driver working mode selection in amd_pstate_param()") 4f3085f87b51 ("cpufreq: amd-pstate: fix kernel hang issue while amd-pstate unregistering")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4badf2eb1e986bdbf34dd2f5d4c979553a86fe54 Mon Sep 17 00:00:00 2001
From: "Gautham R. Shenoy" <[email protected]>
Date: Wed, 17 May 2023 16:28:15 +0000
Subject: [PATCH] cpufreq: amd-pstate: Add ->fast_switch() callback
Schedutil normally calls the adjust_perf callback for drivers with adjust_perf callback available and fast_switch_possible flag set. However, when frequency invariance is disabled and schedutil tries to invoke fast_switch. So, there is a chance of kernel crash if this function pointer is not set. To protect against this scenario add fast_switch callback to amd_pstate driver.
drivers/cpufreq/amd-pstate.c +30 -6
@@ -444,9 +444,8 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy)return 0 ; } -static int amd_pstate_target (struct cpufreq_policy *policy, -unsigned int target_freq, -unsigned int relation) +static int amd_pstate_update_freq (struct cpufreq_policy *policy, +unsigned int target_freq,bool fast_switch) {struct cpufreq_freqs freqs;struct amd_cpudata *cpudata = policy->driver_data;
@@ -465,14 +464,37 @@ static int amd_pstate_target(struct cpufreq_policy *policy, des_perf =DIV_ROUND_CLOSEST (target_freq * cap_perf, cpudata->max_freq); -cpufreq_freq_transition_begin (policy, &freqs); +WARN_ON (fast_switch && !policy->fast_switch_enabled); +/* +* If fast_switch is desired, then there aren't any registered +* transition notifiers. See comment for +* cpufreq_enable_fast_switch(). +*/ +if (!fast_switch) +cpufreq_freq_transition_begin (policy, &freqs); +amd_pstate_update (cpudata, min_perf, des_perf, - max_perf, false, policy->governor->flags); -cpufreq_freq_transition_end (policy, &freqs, false); + max_perf, fast_switch, policy->governor->flags); + +if (!fast_switch) +cpufreq_freq_transition_end (policy, &freqs, false);return 0 ; } +static int amd_pstate_target (struct cpufreq_policy *policy, +unsigned int target_freq, +unsigned int relation) +{ +return amd_pstate_update_freq (policy, target_freq, false); +} + +static unsigned int amd_pstate_fast_switch (struct cpufreq_policy *policy, +unsigned int target_freq) +{ +return amd_pstate_update_freq (policy, target_freq, true); +} + static void amd_pstate_adjust_perf(unsigned int cpu, unsigned long _min_perf, unsigned long target_perf,
@@ -715,6 +737,7 @@ static int amd_pstate_cpu_exit(struct cpufreq_policy *policy)freq_qos_remove_request (&cpudata->req[1 ]);freq_qos_remove_request (&cpudata->req[0 ]); + policy->fast_switch_possible = false;kfree (cpudata);return 0 ;
@@ -1309,6 +1332,7 @@ static struct cpufreq_driver amd_pstate_driver = { .flags = CPUFREQ_CONST_LOOPS | CPUFREQ_NEED_UPDATE_LIMITS, .verify = amd_pstate_verify, .target = amd_pstate_target, + .fast_switch = amd_pstate_fast_switch, .init = amd_pstate_cpu_init, .exit = amd_pstate_cpu_exit, .suspend = amd_pstate_cpu_suspend,
PATCH 1/1 cpufreq: amd-pstate: Add ->fast_switch() callback
From: "Gautham R. Shenoy" <[email protected]>
[ Upstream commit 4badf2eb1e986bdbf34dd2f5d4c979553a86fe54 ]
Schedutil normally calls the adjust_perf callback for drivers with adjust_perf callback available and fast_switch_possible flag set. However, when frequency invariance is disabled and schedutil tries to invoke fast_switch. So, there is a chance of kernel crash if this function pointer is not set. To protect against this scenario add fast_switch callback to amd_pstate driver.
--- drivers/cpufreq/amd-pstate.c | 37 +++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-)
drivers/cpufreq/amd-pstate.c +30 -7
@@ -249,9 +249,8 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy)return 0 ; } -static int amd_pstate_target (struct cpufreq_policy *policy, -unsigned int target_freq, -unsigned int relation) +static int amd_pstate_update_freq (struct cpufreq_policy *policy, +unsigned int target_freq,bool fast_switch) {struct cpufreq_freqs freqs;struct amd_cpudata *cpudata = policy->driver_data;
@@ -270,14 +269,36 @@ static int amd_pstate_target(struct cpufreq_policy *policy, des_perf =DIV_ROUND_CLOSEST (target_freq * cap_perf, cpudata->max_freq); -cpufreq_freq_transition_begin (policy, &freqs); -amd_pstate_update (cpudata, min_perf, des_perf, - max_perf, false); -cpufreq_freq_transition_end (policy, &freqs, false); +WARN_ON (fast_switch && !policy->fast_switch_enabled); +/* +* If fast_switch is desired, then there aren't any registered +* transition notifiers. See comment for +* cpufreq_enable_fast_switch(). +*/ +if (!fast_switch) +cpufreq_freq_transition_begin (policy, &freqs); + +amd_pstate_update (cpudata, min_perf, des_perf, max_perf, fast_switch); + +if (!fast_switch) +cpufreq_freq_transition_end (policy, &freqs, false);return 0 ; } +static int amd_pstate_target (struct cpufreq_policy *policy, +unsigned int target_freq, +unsigned int relation) +{ +return amd_pstate_update_freq (policy, target_freq, false); +} + +static unsigned int amd_pstate_fast_switch (struct cpufreq_policy *policy, +unsigned int target_freq) +{ +return amd_pstate_update_freq (policy, target_freq, true); +} + static void amd_pstate_adjust_perf(unsigned int cpu, unsigned long _min_perf, unsigned long target_perf,
@@ -517,6 +538,7 @@ static int amd_pstate_cpu_exit(struct cpufreq_policy *policy)freq_qos_remove_request (&cpudata->req[1 ]);freq_qos_remove_request (&cpudata->req[0 ]); + policy->fast_switch_possible = false;kfree (cpudata);return 0 ;
@@ -608,6 +630,7 @@ static struct cpufreq_driver amd_pstate_driver = { .flags = CPUFREQ_CONST_LOOPS | CPUFREQ_NEED_UPDATE_LIMITS, .verify = amd_pstate_verify, .target = amd_pstate_target, + .fast_switch = amd_pstate_fast_switch, .init = amd_pstate_cpu_init, .exit = amd_pstate_cpu_exit, .suspend = amd_pstate_cpu_suspend,
Signature · 1 line
2.34.1