Commit cdc1719c authored by Chen Yu's avatar Chen Yu Committed by Rafael J. Wysocki

cpufreq: intel_pstate: Delete intel_pstate sysfs if failed to register the driver

There is a corner case that if the intel_pstate driver fails to be
registered (might be due to invalid MSR access) and acpi_cpufreq
takse over, the intel_pstate sysfs interface is still populated
which may confuse user space (turbostat for example):

grep . /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
acpi-cpufreq

grep . /sys/devices/system/cpu/intel_pstate/*
/sys/devices/system/cpu/intel_pstate/max_perf_pct:0
/sys/devices/system/cpu/intel_pstate/min_perf_pct:0
grep: /sys/devices/system/cpu/intel_pstate/no_turbo: Resource temporarily unavailable
grep: /sys/devices/system/cpu/intel_pstate/num_pstates: Resource temporarily unavailable
/sys/devices/system/cpu/intel_pstate/status:off
grep: /sys/devices/system/cpu/intel_pstate/turbo_pct: Resource temporarily unavailable

The mere presence of the intel_pstate sysfs interface does not mean
that intel_pstate is in use (for example, echo "off" to "status"),
but it should not be created in the failing case.

Fix this issue by deleting the intel_pstate sysfs if the driver
registration fails.
Reported-by: default avatarWendy Wang <wendy.wang@intel.com>
Suggested-by: default avatarZhang Rui <rui.zhang@intel.com>
Signed-off-by: default avatarChen Yu <yu.c.chen@intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com
[ rjw: Refactor code to avoid jumps, change function name, changelog edits ]
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 97148d0a
...@@ -1420,6 +1420,24 @@ static void __init intel_pstate_sysfs_expose_params(void) ...@@ -1420,6 +1420,24 @@ static void __init intel_pstate_sysfs_expose_params(void)
} }
} }
static void __init intel_pstate_sysfs_remove(void)
{
if (!intel_pstate_kobject)
return;
sysfs_remove_group(intel_pstate_kobject, &intel_pstate_attr_group);
if (!per_cpu_limits) {
sysfs_remove_file(intel_pstate_kobject, &max_perf_pct.attr);
sysfs_remove_file(intel_pstate_kobject, &min_perf_pct.attr);
if (x86_match_cpu(intel_pstate_cpu_ee_disable_ids))
sysfs_remove_file(intel_pstate_kobject, &energy_efficiency.attr);
}
kobject_put(intel_pstate_kobject);
}
static void intel_pstate_sysfs_expose_hwp_dynamic_boost(void) static void intel_pstate_sysfs_expose_hwp_dynamic_boost(void)
{ {
int rc; int rc;
...@@ -3063,8 +3081,10 @@ static int __init intel_pstate_init(void) ...@@ -3063,8 +3081,10 @@ static int __init intel_pstate_init(void)
mutex_lock(&intel_pstate_driver_lock); mutex_lock(&intel_pstate_driver_lock);
rc = intel_pstate_register_driver(default_driver); rc = intel_pstate_register_driver(default_driver);
mutex_unlock(&intel_pstate_driver_lock); mutex_unlock(&intel_pstate_driver_lock);
if (rc) if (rc) {
intel_pstate_sysfs_remove();
return rc; return rc;
}
if (hwp_active) { if (hwp_active) {
const struct x86_cpu_id *id; const struct x86_cpu_id *id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment