Skip to content
  • Andy Lutomirski's avatar
    x86/mm: Don't reenter flush_tlb_func_common() · bc0d5a89
    Andy Lutomirski authored
    
    
    It was historically possible to have two concurrent TLB flushes
    targetting the same CPU: one initiated locally and one initiated
    remotely.  This can now cause an OOPS in leave_mm() at
    arch/x86/mm/tlb.c:47:
    
            if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK)
                    BUG();
    
    with this call trace:
     flush_tlb_func_local arch/x86/mm/tlb.c:239 [inline]
     flush_tlb_mm_range+0x26d/0x370 arch/x86/mm/tlb.c:317
    
    Without reentrancy, this OOPS is impossible: leave_mm() is only
    called if we're not in TLBSTATE_OK, but then we're unexpectedly
    in TLBSTATE_OK in leave_mm().
    
    This can be caused by flush_tlb_func_remote() happening between
    the two checks and calling leave_mm(), resulting in two consecutive
    leave_mm() calls on the same CPU with no intervening switch_mm()
    calls.
    
    We never saw this OOPS before because the old leave_mm()
    implementation didn't put us back in TLBSTATE_OK, so the assertion
    didn't fire.
    
    Nadav noticed the reentrancy issue in a different context, but
    neither of us realized that it caused a problem yet.
    
    Reported-by: default avatarLevin, Alexander (Sasha Levin) <alexander.levin@verizon.com>
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Reviewed-by: default avatarNadav Amit <nadav.amit@gmail.com>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Arjan van de Ven <arjan@linux.intel.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: linux-mm@kvack.org
    Fixes: 3d28ebce ("x86/mm: Rework lazy TLB to track the actual loaded mm")
    Link: http://lkml.kernel.org/r/855acf733268d521c9f2e191faee2dcc23a29729.1498751203.git.luto@kernel.org
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    bc0d5a89