Skip to content
  • Baoquan He's avatar
    x86/apic: Fix restoring boot IRQ mode in reboot and kexec/kdump · 339b2ae0
    Baoquan He authored
    This is a regression fix.
    
    Before, to fix erratum AVR31, the following commit:
    
      522e6646
    
     ("x86/apic: Disable I/O APIC before shutdown of the local APIC")
    
    ... moved the lapic_shutdown() call to after disable_IO_APIC() in the reboot
    and kexec/kdump code paths.
    
    This introduced the following regression: disable_IO_APIC() not only clears
    the IO-APIC, but it also restores boot IRQ mode by setting the
    LAPIC/APIC/IMCR, calling lapic_shutdown() after disable_IO_APIC() will
    disable LAPIC and ruin the possible virtual wire mode setting which
    the code has been trying to do all along.
    
    The consequence is that a KVM guest kernel always prints the warning below
    during kexec/kdump as the kernel boots up:
    
      [    0.001000] WARNING: CPU: 0 PID: 0 at arch/x86/kernel/apic/apic.c:1467 setup_local_APIC+0x228/0x330
      [    ........]
      [    0.001000] Call Trace:
      [    0.001000]  apic_bsp_setup+0x56/0x74
      [    0.001000]  x86_late_time_init+0x11/0x16
      [    0.001000]  start_kernel+0x3c9/0x486
      [    0.001000]  secondary_startup_64+0xa5/0xb0
      [    ........]
      [    0.001000] masked ExtINT on CPU#0
    
    To fix this, just call clear_IO_APIC() to stop the IO-APIC where
    disable_IO_APIC() was called, and call restore_boot_irq_mode() to
    restore boot IRQ mode before a reboot or a kexec/kdump jump.
    
    Signed-off-by: default avatarBaoquan He <bhe@redhat.com>
    Reviewed-by: default avatarEric W. Biederman <ebiederm@xmission.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: douly.fnst@cn.fujitsu.com
    Cc: joro@8bytes.org
    Cc: prarit@redhat.com
    Cc: stable@vger.kernel.org
    Cc: uobergfe@redhat.com
    Fixes: commit 522e6646 ("x86/apic: Disable I/O APIC before shutdown of the local APIC")
    Link: http://lkml.kernel.org/r/20180214054656.3780-4-bhe@redhat.com
    
    
    [ Rewrote the changelog. ]
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    339b2ae0