• A
    x86/mm/64: Initialize CR4.PCIDE early · c7ad5ad2
    Andy Lutomirski 提交于
    cpu_init() is weird: it's called rather late (after early
    identification and after most MMU state is initialized) on the boot
    CPU but is called extremely early (before identification) on secondary
    CPUs.  It's called just late enough on the boot CPU that its CR4 value
    isn't propagated to mmu_cr4_features.
    
    Even if we put CR4.PCIDE into mmu_cr4_features, we'd hit two
    problems.  First, we'd crash in the trampoline code.  That's
    fixable, and I tried that.  It turns out that mmu_cr4_features is
    totally ignored by secondary_start_64(), though, so even with the
    trampoline code fixed, it wouldn't help.
    
    This means that we don't currently have CR4.PCIDE reliably initialized
    before we start playing with cpu_tlbstate.  This is very fragile and
    tends to cause boot failures if I make even small changes to the TLB
    handling code.
    
    Make it more robust: initialize CR4.PCIDE earlier on the boot CPU
    and propagate it to secondary CPUs in start_secondary().
    
    ( Yes, this is ugly.  I think we should have improved mmu_cr4_features
      to actually control CR4 during secondary bootup, but that would be
      fairly intrusive at this stage. )
    Signed-off-by: NAndy Lutomirski <luto@kernel.org>
    Reported-by: NSai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
    Tested-by: NSai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
    Cc: Borislav Petkov <bpetkov@suse.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kernel@vger.kernel.org
    Fixes: 660da7c9 ("x86/mm: Enable CR4.PCIDE on supported systems")
    Signed-off-by: NIngo Molnar <mingo@kernel.org>
    c7ad5ad2
init.c 24.8 KB