Skip to contentSkip to conversation

cpufreq/amd-pstate: Push adjust_perf vfunc init into cpu_init

PATCH In review Mario Limonciello 3 participants 5 messages Oct 28, 2024 – Oct 29, 2024

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/2 cpufreq/amd-pstate: Push adjust_perf vfunc init into cpu_init

From: Mario Limonciello <[email protected]>

As the driver can be changed in and out of different modes it's possible that adjust_perf is assigned when it shouldn't be.

This could happen if an MSR design is started up in passive mode and then switches to active mode.

To solve this explicitly clear adjust_perf in amd_pstate_epp_cpu_init().

---
Cc: Klara Modin <[email protected]>

 drivers/cpufreq/amd-pstate.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/cpufreq/amd-pstate.c +2 -2
index 206725219d8c9..e480da818d6f5 100644
@@ -1504,6 +1504,8 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
 		WRITE_ONCE(cpudata->cppc_cap1_cached, value);
 	}
 
+	current_pstate_driver->adjust_perf = NULL;
+
 	return 0;
 
 free_cpudata1:
@@ -1866,8 +1868,6 @@ static int __init amd_pstate_init(void)
 	/* capability check */
 	if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
 		pr_debug("AMD CPPC MSR based functionality is supported\n");
-		if (cppc_state != AMD_PSTATE_ACTIVE)
-			current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
 	} else {
 		pr_debug("AMD CPPC shared memory based functionality is supported\n");
 		static_call_update(amd_pstate_cppc_enable, shmem_cppc_enable);
Signature · 1 line
2.43.0
#1 lore raw

PATCH v2 2/2 cpufreq/amd-pstate: Move registration after static function call update

From: Mario Limonciello <[email protected]>

On shared memory designs the static functions need to work before registration is done or the system can hang at bootup.

Move the registration later in amd_pstate_init() to solve this.

Fixes e238968a2087 ("cpufreq/amd-pstate: Remove the redundant amd_pstate_set_driver() call")
---
 drivers/cpufreq/amd-pstate.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/cpufreq/amd-pstate.c +6 -6
index e480da818d6f5..f834cc8205e2a 100644
@@ -1859,12 +1859,6 @@ static int __init amd_pstate_init(void)
 		return -ENODEV;
 	}
 
-	ret = amd_pstate_register_driver(cppc_state);
-	if (ret) {
-		pr_err("failed to register with return %d\n", ret);
-		return ret;
-	}
-
 	/* capability check */
 	if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
 		pr_debug("AMD CPPC MSR based functionality is supported\n");
@@ -1875,6 +1869,12 @@ static int __init amd_pstate_init(void)
 		static_call_update(amd_pstate_update_perf, shmem_update_perf);
 	}
 
+	ret = amd_pstate_register_driver(cppc_state);
+	if (ret) {
+		pr_err("failed to register with return %d\n", ret);
+		return ret;
+	}
+
 	if (amd_pstate_prefcore) {
 		ret = amd_detect_prefcore(&amd_pstate_prefcore);
 		if (ret)
Signature · 1 line
2.43.0
Tested-by on v2 2/2
#2 lore raw

Re: [PATCH v2 2/2] cpufreq/amd-pstate: Move registration after static function call update

Quoted 6 lines · Mario Limonciello

From: Mario Limonciello <[email protected]>

On shared memory designs the static functions need to work before registration is done or the system can hang at bootup.

Move the registration later in amd_pstate_init() to solve this.

Looks good to me.
Also,

Thanks,
Dhananjay

Quoted 39 lines
Fixes e238968a2087 ("cpufreq/amd-pstate: Remove the redundant amd_pstate_set_driver() call")
---
 drivers/cpufreq/amd-pstate.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/cpufreq/amd-pstate.c +6 -6
index e480da818d6f5..f834cc8205e2a 100644
@@ -1859,12 +1859,6 @@ static int __init amd_pstate_init(void)
 		return -ENODEV;
 	}
 
-	ret = amd_pstate_register_driver(cppc_state);
-	if (ret) {
-		pr_err("failed to register with return %d\n", ret);
-		return ret;
-	}
-
 	/* capability check */
 	if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
 		pr_debug("AMD CPPC MSR based functionality is supported\n");
@@ -1875,6 +1869,12 @@ static int __init amd_pstate_init(void)
 		static_call_update(amd_pstate_update_perf, shmem_update_perf);
 	}
 
+	ret = amd_pstate_register_driver(cppc_state);
+	if (ret) {
+		pr_err("failed to register with return %d\n", ret);
+		return ret;
+	}
+
 	if (amd_pstate_prefcore) {
 		ret = amd_detect_prefcore(&amd_pstate_prefcore);
 		if (ret)
Tested-by on v2 1/2
#3 lore raw
In reply to Mario Limonciello
Quoted 30 lines · Mario Limonciello

From: Mario Limonciello <[email protected]>

As the driver can be changed in and out of different modes it's possible that adjust_perf is assigned when it shouldn't be.

This could happen if an MSR design is started up in passive mode and then switches to active mode.

To solve this explicitly clear adjust_perf in amd_pstate_epp_cpu_init().

---
Cc: Klara Modin <[email protected]>

  drivers/cpufreq/amd-pstate.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)
drivers/cpufreq/amd-pstate.c +2 -0
index 206725219d8c9..e480da818d6f5 100644
@@ -1504,6 +1504,8 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
  		WRITE_ONCE(cpudata->cppc_cap1_cached, value);
  	}
 
+	current_pstate_driver->adjust_perf = NULL;
+
  	return 0;
 
  free_cpudata1:

drivers/cpufreq/amd-pstate.c static int __init amd_pstate_init(void) · line 1873

Quoted 8 lines
drivers/cpufreq/amd-pstate.c +0 -2
@@ -1866,8 +1868,6 @@ static int __init amd_pstate_init(void)
  	/* capability check */
  	if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
  		pr_debug("AMD CPPC MSR based functionality is supported\n");
-		if (cppc_state != AMD_PSTATE_ACTIVE)
-			current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
  	} else {
  		pr_debug("AMD CPPC shared memory based functionality is supported\n");
  		static_call_update(amd_pstate_cppc_enable, shmem_cppc_enable);

Both of these patches together also fix the problem I had.

Thanks,

Tested-by on v2 1/2
#4 lore raw
In reply to Mario Limonciello
Quoted 10 lines · Mario Limonciello

From: Mario Limonciello <[email protected]>

As the driver can be changed in and out of different modes it's possible that adjust_perf is assigned when it shouldn't be.

This could happen if an MSR design is started up in passive mode and then switches to active mode.

To solve this explicitly clear adjust_perf in amd_pstate_epp_cpu_init().

Great, this solves the overlooked issue as well, looks good to me.

You may also add,

Thanks,
Dhananjay

Quoted 28 lines

---
Cc: Klara Modin <[email protected]>

 drivers/cpufreq/amd-pstate.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/cpufreq/amd-pstate.c +2 -2
index 206725219d8c9..e480da818d6f5 100644
@@ -1504,6 +1504,8 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)
 		WRITE_ONCE(cpudata->cppc_cap1_cached, value);
 	}
 
+	current_pstate_driver->adjust_perf = NULL;
+
 	return 0;
 
 free_cpudata1:
@@ -1866,8 +1868,6 @@ static int __init amd_pstate_init(void)
 	/* capability check */
 	if (cpu_feature_enabled(X86_FEATURE_CPPC)) {
 		pr_debug("AMD CPPC MSR based functionality is supported\n");
-		if (cppc_state != AMD_PSTATE_ACTIVE)
-			current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;
 	} else {
 		pr_debug("AMD CPPC shared memory based functionality is supported\n");
 		static_call_update(amd_pstate_cppc_enable, shmem_cppc_enable);