From: Borislav Petkov <bp@xxxxxxxxx> When Cool'n'Quiet is disabled in the BIOS we're missing _PSS objects and powernow-k8 fails loading with a juicy firmware bug message. However, on machines with boosting cpus, it forgets to unreg from the cpu notifier chain leading to oops. See also https://bugzilla.novell.com/show_bug.cgi?id=655215 Fix error path accordingly. Originally-by: Neil Brown <neilb@xxxxxxx> Signed-off-by: Borislav Petkov <borislav.petkov@xxxxxxx> --- arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index d2e53ac..ccfc68b 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c @@ -1540,6 +1540,7 @@ static struct notifier_block cpb_nb = { static int __cpuinit powernowk8_init(void) { unsigned int i, supported_cpus = 0, cpu; + int err = 0; for_each_online_cpu(i) { int rc; @@ -1560,10 +1561,11 @@ static int __cpuinit powernowk8_init(void) register_cpu_notifier(&cpb_nb); + err = -ENOMEM; msrs = msrs_alloc(); if (!msrs) { printk(KERN_ERR "%s: Error allocating msrs!\n", __func__); - return -ENOMEM; + goto unreg; } rdmsr_on_cpus(cpu_online_mask, MSR_K7_HWCR, msrs); @@ -1577,7 +1579,15 @@ static int __cpuinit powernowk8_init(void) (cpb_enabled ? "on" : "off")); } - return cpufreq_register_driver(&cpufreq_amd64_driver); + err = cpufreq_register_driver(&cpufreq_amd64_driver); + if (!err) + goto out; + +unreg: + if (cpb_capable) + unregister_cpu_notifier(&cpb_nb); +out: + return err; } /* driver entry point for term */ @@ -1585,7 +1595,7 @@ static void __exit powernowk8_exit(void) { dprintk("exit\n"); - if (boot_cpu_has(X86_FEATURE_CPB)) { + if (cpb_capable) { msrs_free(msrs); msrs = NULL; -- 1.7.3.1.50.g1e633 -- 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