• Andy Lutomirski's avatar
    Revert "x86/mm: Stop calling leave_mm() in idle code" · 67535736
    Andy Lutomirski authored
    This reverts commit 43858b4f.
    
    The reason I removed the leave_mm() calls in question is because the
    heuristic wasn't needed after that patch.  With the original version
    of my PCID series, we never flushed a "lazy cpu" (i.e. a CPU running
    kernel thread) due a flush on the loaded mm.
    
    Unfortunately, that caused architectural issues, so now I've
    reinstated these flushes on non-PCID systems in:
    
        commit b956575b ("x86/mm: Flush more aggressively in lazy TLB mode").
    
    That, in turn, gives us a power management and occasionally
    performance regression as compared to old kernels: a process that
    goes into a deep idle state on a given CPU and gets its mm flushed
    due to activity on a different CPU will wake the idle CPU.
    
    Reinstate the old ugly heuristic: if a CPU goes into ACPI C3 or an
    intel_idle state that is likely to cause a TLB flush gets its mm
    switched to init_mm before going idle.
    
    FWIW, this heuristic is lousy.  Whether we should change CR3 before
    idle isn't a good hint except insofar as the performance hit is a bit
    lower if the TLB is getting flushed by the idle code anyway.  What we
    really want to know is whether we anticipate being idle long enough
    that the mm is likely to be flushed before we wake up.  This is more a
    matter of the expected latency than the idle state that gets chosen.
    This heuristic also completely fails on systems that don't know
    whether the TLB will be flushed (e.g. AMD systems?).  OTOH it may be a
    bit obsolete anyway -- PCID systems don't presently benefit from this
    heuristic at all.
    
    We also shouldn't do this callback from innermost bit of the idle code
    due to the RCU nastiness it causes.  All the information need is
    available before rcu_idle_enter() needs to happen.
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Borislav Petkov <bpetkov@suse.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: 43858b4f "x86/mm: Stop calling leave_mm() in idle code"
    Link: http://lkml.kernel.org/r/c513bbd4e653747213e05bc7062de000bf0202a5.1509793738.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    67535736
intel_idle.c 36.4 KB