Skip to content
  • Sebastian Andrzej Siewior's avatar
    x86/mm/pat: Disable preemption around __flush_tlb_all() · f77084d9
    Sebastian Andrzej Siewior authored
    The WARN_ON_ONCE(__read_cr3() != build_cr3()) in switch_mm_irqs_off()
    triggers every once in a while during a snapshotted system upgrade.
    
    The warning triggers since commit decab088 ("x86/mm: Remove
    preempt_disable/enable() from __native_flush_tlb()"). The callchain is:
    
      get_page_from_freelist() -> post_alloc_hook() -> __kernel_map_pages()
    
    with CONFIG_DEBUG_PAGEALLOC enabled.
    
    Disable preemption during CR3 reset / __flush_tlb_all() and add a comment
    why preemption has to be disabled so it won't be removed accidentaly.
    
    Add another preemptible() check in __flush_tlb_all() to catch callers with
    enabled preemption when PGE is enabled, because PGE enabled does not
    trigger the warning in __native_flush_tlb(). Suggested by Andy Lutomirski.
    
    Fixes: decab088
    
     ("x86/mm: Remove preempt_disable/enable() from __native_flush_tlb()")
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/20181017103432.zgv46nlu3hc7k4rq@linutronix.de
    f77084d9