linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [RFC 00/11] PCID and improved laziness
@ 2017-06-05 22:36 Andy Lutomirski
  2017-06-05 22:36 ` [RFC 01/11] x86/ldt: Simplify LDT switching logic Andy Lutomirski
                   ` (10 more replies)
  0 siblings, 11 replies; 31+ messages in thread
From: Andy Lutomirski @ 2017-06-05 22:36 UTC (permalink / raw)
  To: X86 ML
  Cc: Borislav Petkov, Linus Torvalds, Andrew Morton, Mel Gorman,
	linux-mm, Nadav Amit, Rik van Riel, Andy Lutomirski

I think that this is in good enough shape to review.  I'm hoping to get
it in for 4.13.

There are three performance benefits here:

1. TLB flushing is slow.  (I.e. the flush itself takes a while.)
   This avoids many of them when switching tasks by using PCID.  In
   a stupid little benchmark I did, it saves about 100ns on my laptop
   per context switch.  I'll try to improve that benchmark.

2. Mms that have been used recently on a given CPU might get to keep
   their TLB entries alive across process switches with this patch
   set.  TLB fills are pretty fast on modern CPUs, but they're even
   faster when they don't happen.

3. Lazy TLB is way better.  We used to do two stupid things when we
   ran kernel threads: we'd send IPIs to flush user contexts on their
   CPUs and then we'd write to CR3 for no particular reason as an excuse
   to stop further IPIs.  With this patch, we do neither.

This will, in general, perform suboptimally if paravirt TLB flushing
is in use (currently just Xen, I think, but Hyper-V is in the works).
The code is structured so we could fix it in one of two ways: we
could take a spinlock when touching the percpu state so we can update
it remotely after a paravirt flush, or we could be more careful about
our exactly how we access the state and use cmpxchg16b to do atomic
remote updates.  (On SMP systems without cmpxchg16b, we'd just skip
the optimization entirely.)

This code is running on my laptop right now and it hasn't blown up
yet, so it's obviously entirely bug-free. :)

What do you all think?

This is based on tip:x86/mm.  The branch is here if you want to play:
https://git.kernel.org/pub/scm/linux/kernel/git/luto/linux.git/log/?h=x86/pcid

Andy Lutomirski (11):
  x86/ldt: Simplify LDT switching logic
  x86/mm: Remove reset_lazy_tlbstate()
  x86/mm: Give each mm TLB flush generation a unique ID
  x86/mm: Track the TLB's tlb_gen and update the flushing algorithm
  x86/mm: Rework lazy TLB mode and TLB freshness tracking
  x86/mm: Stop calling leave_mm() in idle code
  x86/mm: Disable PCID on 32-bit kernels
  x86/mm: Add nopcid to turn off PCID
  x86/mm: Teach CR3 readers about PCID
  x86/mm: Enable CR4.PCIDE on supported systems
  x86/mm: Try to preserve old TLB entries using PCID

 Documentation/admin-guide/kernel-parameters.txt |   2 +
 arch/ia64/include/asm/acpi.h                    |   2 -
 arch/x86/boot/compressed/pagetable.c            |   2 +-
 arch/x86/include/asm/acpi.h                     |   2 -
 arch/x86/include/asm/disabled-features.h        |   4 +-
 arch/x86/include/asm/efi.h                      |   2 +-
 arch/x86/include/asm/mmu.h                      |  25 +-
 arch/x86/include/asm/mmu_context.h              |  41 ++-
 arch/x86/include/asm/paravirt.h                 |   2 +-
 arch/x86/include/asm/processor-flags.h          |  32 +++
 arch/x86/include/asm/processor.h                |   8 +
 arch/x86/include/asm/special_insns.h            |  10 +-
 arch/x86/include/asm/tlbflush.h                 |  91 +++++-
 arch/x86/kernel/cpu/bugs.c                      |   8 +
 arch/x86/kernel/cpu/common.c                    |  33 +++
 arch/x86/kernel/head64.c                        |   3 +-
 arch/x86/kernel/paravirt.c                      |   2 +-
 arch/x86/kernel/process_32.c                    |   2 +-
 arch/x86/kernel/process_64.c                    |   2 +-
 arch/x86/kernel/smpboot.c                       |   1 -
 arch/x86/kvm/vmx.c                              |   2 +-
 arch/x86/mm/fault.c                             |  10 +-
 arch/x86/mm/init.c                              |   2 +-
 arch/x86/mm/ioremap.c                           |   2 +-
 arch/x86/mm/tlb.c                               | 351 +++++++++++++++---------
 arch/x86/platform/efi/efi_64.c                  |   4 +-
 arch/x86/platform/olpc/olpc-xo1-pm.c            |   2 +-
 arch/x86/power/cpu.c                            |   2 +-
 arch/x86/power/hibernate_64.c                   |   3 +-
 arch/x86/xen/mmu_pv.c                           |   6 +-
 arch/x86/xen/setup.c                            |   6 +
 drivers/acpi/processor_idle.c                   |   2 -
 drivers/idle/intel_idle.c                       |   8 +-
 33 files changed, 483 insertions(+), 191 deletions(-)

-- 
2.9.3

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2017-06-14  9:51 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-05 22:36 [RFC 00/11] PCID and improved laziness Andy Lutomirski
2017-06-05 22:36 ` [RFC 01/11] x86/ldt: Simplify LDT switching logic Andy Lutomirski
2017-06-05 22:40   ` Linus Torvalds
2017-06-05 22:44     ` Andy Lutomirski
2017-06-05 22:51     ` Linus Torvalds
2017-06-05 22:36 ` [RFC 02/11] x86/mm: Remove reset_lazy_tlbstate() Andy Lutomirski
2017-06-05 22:36 ` [RFC 03/11] x86/mm: Give each mm TLB flush generation a unique ID Andy Lutomirski
2017-06-05 22:36 ` [RFC 04/11] x86/mm: Track the TLB's tlb_gen and update the flushing algorithm Andy Lutomirski
2017-06-06  5:03   ` Nadav Amit
2017-06-06 22:45     ` Andy Lutomirski
2017-06-05 22:36 ` [RFC 05/11] x86/mm: Rework lazy TLB mode and TLB freshness tracking Andy Lutomirski
2017-06-06  1:39   ` Nadav Amit
2017-06-06 21:23     ` Andy Lutomirski
2017-06-06 19:11   ` Rik van Riel
2017-06-06 21:34     ` Andy Lutomirski
2017-06-07  3:33       ` Rik van Riel
2017-06-07  4:54         ` Andy Lutomirski
2017-06-07  5:11           ` Andy Lutomirski
2017-06-05 22:36 ` [RFC 06/11] x86/mm: Stop calling leave_mm() in idle code Andy Lutomirski
2017-06-05 22:36 ` [RFC 07/11] x86/mm: Disable PCID on 32-bit kernels Andy Lutomirski
2017-06-05 22:36 ` [RFC 08/11] x86/mm: Add nopcid to turn off PCID Andy Lutomirski
2017-06-06  3:22   ` Andi Kleen
2017-06-14  4:52     ` Andy Lutomirski
2017-06-14  9:51       ` Borislav Petkov
2017-06-05 22:36 ` [RFC 09/11] x86/mm: Teach CR3 readers about PCID Andy Lutomirski
2017-06-05 22:36 ` [RFC 10/11] x86/mm: Enable CR4.PCIDE on supported systems Andy Lutomirski
2017-06-06 21:31   ` Boris Ostrovsky
2017-06-06 21:35     ` Andy Lutomirski
2017-06-06 21:48       ` Boris Ostrovsky
2017-06-06 21:54         ` Andy Lutomirski
2017-06-05 22:36 ` [RFC 11/11] x86/mm: Try to preserve old TLB entries using PCID Andy Lutomirski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).