If the hw support intel_pstate and acpi_cpufreq, intel_pstate will get loaded at first. acpi_cpufreq_init will call acpi_cpufreq_early_init() and it allocate perf data and init those perf data in ACPI core, (that will go over all cpus). but late it will free them as cpufreq_register_driver(acpi_cpufreq) will return fail as init_pstate already take over before. Use cpufreq_get_current_driver() to check if we can skip the acpi_cpufreq loading. Also there is racing in __acpi_processor_start ==> acpi_processor_load_module ==> request_module_nowait/requested = 1 before first pr path to have requested set, second cpu would request again. that will cause acpi_cpufreq_early_init to be called in parallel. that is cause for intermittent crashes. So add mutex to protect it. Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx> --- drivers/acpi/processor_perflib.c | 8 +++++++- drivers/cpufreq/acpi-cpufreq.c | 4 ++++ 2 files changed, 11 insertions(+), 1 deletion(-) Index: linux-2.6/drivers/cpufreq/acpi-cpufreq.c =================================================================== --- linux-2.6.orig/drivers/cpufreq/acpi-cpufreq.c +++ linux-2.6/drivers/cpufreq/acpi-cpufreq.c @@ -986,6 +986,10 @@ static int __init acpi_cpufreq_init(void { int ret; + /* don't keep reloading if cpufreq_driver exists */ + if (cpufreq_get_current_driver()) + return 0; + if (acpi_disabled) return 0; Index: linux-2.6/drivers/acpi/processor_perflib.c =================================================================== --- linux-2.6.orig/drivers/acpi/processor_perflib.c +++ linux-2.6/drivers/acpi/processor_perflib.c @@ -235,6 +235,7 @@ void acpi_processor_ppc_exit(void) acpi_processor_ppc_status &= ~PPC_REGISTERED; } +static DEFINE_MUTEX(acpi_cpufreq_load_lock); /* * Do a quick check if the systems looks like it should use ACPI * cpufreq. We look at a _PCT method being available, but don't @@ -246,8 +247,12 @@ void acpi_processor_load_module(struct a acpi_status status = 0; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; - if (!arch_has_acpi_pdc() || requested) + mutex_lock(&acpi_cpufreq_load_lock); + if (!arch_has_acpi_pdc() || requested ||cpufreq_get_current_driver()) { + mutex_unlock(&acpi_cpufreq_load_lock); return; + } + status = acpi_evaluate_object(pr->handle, "_PCT", NULL, &buffer); if (!ACPI_FAILURE(status)) { printk(KERN_INFO PREFIX "Requesting acpi_cpufreq\n"); @@ -255,6 +260,7 @@ void acpi_processor_load_module(struct a requested = 1; } kfree(buffer.pointer); + mutex_unlock(&acpi_cpufreq_load_lock); } static int acpi_processor_get_performance_control(struct acpi_processor *pr) -- To unsubscribe from this list: send the line "unsubscribe cpufreq" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html