On 01/22/2015 09:48 AM, Boris Ostrovsky wrote:
On 01/22/2015 03:20 AM, Borislav Petkov wrote:
Hmm,
and I thought we fixed all that fun. It seems not :-\
Boris, this paravirt_enabled() thing doesn't seem to work or why are we
even calling microcode_exit()?
Looks like something is unloading microcode driver (init scripts
perhaps) and so we are trying to unregister device that we never
registered (because we had early return from microcode_init() when we
loaded it).
I actually suspect the same bug would be triggered if dis_ucode_ldr is
true on baremetal.
So we need something like:
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -625,6 +625,9 @@ static void __exit microcode_exit(void)
{
struct cpuinfo_x86 *c = &cpu_data(0);
+ if (paravirt_enabled() || dis_ucode_ldr)
+ return 0;
Plain 'return', of course.
Alternatively, we could return an error (-EINVAL?) from microcode_init()
when either of these two conditions is true.
-boris
+
microcode_dev_exit();
unregister_hotcpu_notifier(&mc_cpu_notifier);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/