Skip to contentSkip to conversation

cpufreq: amd-pstate: Register driver after static call update

PATCH In review Mario Limonciello 2 participants 3 messages Oct 27, 2024 – Oct 28, 2024

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

PATCH 1/1 cpufreq: amd-pstate: Register driver after static call update

From: Mario Limonciello <[email protected]>

The driver must be registered specifically after the static call update.

Fixes e238968a2087 ("cpufreq/amd-pstate: Remove the redundant amd_pstate_set_driver() call")
Reported-and-tested-by Klara Modin <[email protected]>
---
 drivers/cpufreq/amd-pstate.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/cpufreq/amd-pstate.c +6 -6
index 206725219d8c9..2f0e29b05963d 100644
@@ -1857,12 +1857,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");
@@ -1881,6 +1875,12 @@ static int __init amd_pstate_init(void)
 			return ret;
 	}
 
+	ret = amd_pstate_register_driver(cppc_state);
+	if (ret) {
+		pr_err("failed to register with return %d\n", ret);
+		return ret;
+	}
+
 	dev_root = bus_get_dev_root(&cpu_subsys);
 	if (dev_root) {
 		ret = sysfs_create_group(&dev_root->kobj, &amd_pstate_global_attr_group);
Signature · 1 line
2.43.0
#1 lore raw

Hello Mario,

Quoted 20 lines · Mario Limonciello

From: Mario Limonciello <[email protected]>

The driver must be registered specifically after the static call update.

Fixes e238968a2087 ("cpufreq/amd-pstate: Remove the redundant amd_pstate_set_driver() call")
Reported-and-tested-by Klara Modin <[email protected]>
---
 drivers/cpufreq/amd-pstate.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/cpufreq/amd-pstate.c +0 -0
index 206725219d8c9..2f0e29b05963d 100644
@@ -1857,12 +1857,6 @@ static int __init amd_pstate_init(void)
 		return -ENODEV;
 	}

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

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +0 -6
 
-	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");

1865 if (cppc_state != AMD_PSTATE_ACTIVE)
1866 current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;

If we move the "amd_pstate_register_driver()" call to the below point, wont the above dereference (current_pstate_driver->) cause a null pointer error in MSR based systems with amd_pstate=passive/guided boot param. As we initialize "current_pstate_driver" in amd_pstate_register_driver().

We probably need to break up the if-else condition and handle the MSR based "if" part after the register call and "else" part before the "amd_pstate_register_driver()" call.

Something like,

	if (!cpu_feature_enabled(X86_FEATURE_CPPC)) {
                 pr_debug("AMD CPPC shared memory based functionality is supported\n");
                 static_call_update(amd_pstate_enable, shmem_enable);
                 static_call_update(amd_pstate_init_perf, shmem_init_perf);
                 static_call_update(amd_pstate_update_perf, shmem_update_perf);  	<---- static call updates done
    	}
	
	ret = amd_pstate_register_driver(cppc_state);					<---- Initializes "current_pstate_driver"
	if (ret) {
		pr_err("failed to register with return %d\n", ret);
		return ret;
	}
	
	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;	<---- Now we dereference "current_pstate_driver"
	}

What do you think?

Thanks,
Dhananjay

Quoted 13 lines
drivers/cpufreq/amd-pstate.c +6 -0
@@ -1881,6 +1875,12 @@ static int __init amd_pstate_init(void)
 			return ret;
 	}
 
+	ret = amd_pstate_register_driver(cppc_state);
+	if (ret) {
+		pr_err("failed to register with return %d\n", ret);
+		return ret;
+	}
+
 	dev_root = bus_get_dev_root(&cpu_subsys);
 	if (dev_root) {
 		ret = sysfs_create_group(&dev_root->kobj, &amd_pstate_global_attr_group);
#2 lore raw
Quoted 65 lines · Dhananjay Ugwekar

Hello Mario,

Quoted 20 lines · Mario Limonciello

From: Mario Limonciello <[email protected]>

The driver must be registered specifically after the static call update.

Fixes e238968a2087 ("cpufreq/amd-pstate: Remove the redundant amd_pstate_set_driver() call")
Reported-and-tested-by Klara Modin <[email protected]>
---
  drivers/cpufreq/amd-pstate.c | 12 ++++++------
  1 file changed, 6 insertions(+), 6 deletions(-)
drivers/cpufreq/amd-pstate.c +0 -0
index 206725219d8c9..2f0e29b05963d 100644
@@ -1857,12 +1857,6 @@ static int __init amd_pstate_init(void)
  		return -ENODEV;
  	}

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

Quoted 10 lines
drivers/cpufreq/amd-pstate.c +0 -6
 
-	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");

1865 if (cppc_state != AMD_PSTATE_ACTIVE)
1866 current_pstate_driver->adjust_perf = amd_pstate_adjust_perf;

If we move the "amd_pstate_register_driver()" call to the below point, wont the above dereference (current_pstate_driver->) cause a null pointer error in MSR based systems with amd_pstate=passive/guided boot param. As we initialize "current_pstate_driver" in amd_pstate_register_driver().

We probably need to break up the if-else condition and handle the MSR based "if" part after the register call and "else" part before the "amd_pstate_register_driver()" call.

Something like,

	if (!cpu_feature_enabled(X86_FEATURE_CPPC)) {
                  pr_debug("AMD CPPC shared memory based functionality is supported\n");
                  static_call_update(amd_pstate_enable, shmem_enable);
                  static_call_update(amd_pstate_init_perf, shmem_init_perf);
                  static_call_update(amd_pstate_update_perf, shmem_update_perf);  	<---- static call updates done
     	}
	
	ret = amd_pstate_register_driver(cppc_state);					<---- Initializes "current_pstate_driver"
	if (ret) {
		pr_err("failed to register with return %d\n", ret);
		return ret;
	}
	
	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;	<---- Now we dereference "current_pstate_driver"
	}
Quoted 1 line

What do you think?

Makes sense, I'll send out a v2 like this, thanks for the suggestion.

Quoted 17 lines

Thanks,
Dhananjay

Quoted 13 lines
drivers/cpufreq/amd-pstate.c +6 -0
@@ -1881,6 +1875,12 @@ static int __init amd_pstate_init(void)
  			return ret;
  	}
 
+	ret = amd_pstate_register_driver(cppc_state);
+	if (ret) {
+		pr_err("failed to register with return %d\n", ret);
+		return ret;
+	}
+
  	dev_root = bus_get_dev_root(&cpu_subsys);
  	if (dev_root) {
  		ret = sysfs_create_group(&dev_root->kobj, &amd_pstate_global_attr_group);