linux/arch
Sean Christopherson e64419d991 KVM: x86: Move "flush guest's TLB" logic to separate kvm_x86_ops hook
Add a dedicated hook to handle flushing TLB entries on behalf of the
guest, i.e. for a paravirtualized TLB flush, and use it directly instead
of bouncing through kvm_vcpu_flush_tlb().

For VMX, change the effective implementation implementation to never do
INVEPT and flush only the current context, i.e. to always flush via
INVVPID(SINGLE_CONTEXT).  The INVEPT performed by __vmx_flush_tlb() when
@invalidate_gpa=false and enable_vpid=0 is unnecessary, as it will only
flush guest-physical mappings; linear and combined mappings are flushed
by VM-Enter when VPID is disabled, and changes in the guest pages tables
do not affect guest-physical mappings.

When EPT and VPID are enabled, doing INVVPID is not required (by Intel's
architecture) to invalidate guest-physical mappings, i.e. TLB entries
that cache guest-physical mappings can live across INVVPID as the
mappings are associated with an EPTP, not a VPID.  The intent of
@invalidate_gpa is to inform vmx_flush_tlb() that it must "invalidate
gpa mappings", i.e. do INVEPT and not simply INVVPID.  Other than nested
VPID handling, which now calls vpid_sync_context() directly, the only
scenario where KVM can safely do INVVPID instead of INVEPT (when EPT is
enabled) is if KVM is flushing TLB entries from the guest's perspective,
i.e. is only required to invalidate linear mappings.

For SVM, flushing TLB entries from the guest's perspective can be done
by flushing the current ASID, as changes to the guest's page tables are
associated only with the current ASID.

Adding a dedicated ->tlb_flush_guest() paves the way toward removing
@invalidate_gpa, which is a potentially dangerous control flag as its
meaning is not exactly crystal clear, even for those who are familiar
with the subtleties of what mappings Intel CPUs are/aren't allowed to
keep across various invalidation scenarios.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Message-Id: <20200320212833.3507-15-sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2020-04-20 17:26:10 -04:00
..
alpha mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
arc mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
arm ARM: 2020-04-02 15:13:15 -07:00
arm64 ARM: 2020-04-02 15:13:15 -07:00
c6x asm-generic: make more kernel-space headers mandatory 2020-04-02 09:35:25 -07:00
csky asm-generic: make more kernel-space headers mandatory 2020-04-02 09:35:25 -07:00
h8300 asm-generic: make more kernel-space headers mandatory 2020-04-02 09:35:25 -07:00
hexagon mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
ia64 mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
m68k mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
microblaze mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
mips ARM: 2020-04-02 15:13:15 -07:00
nds32 mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
nios2 mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
openrisc mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
parisc mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
powerpc ARM: 2020-04-02 15:13:15 -07:00
riscv mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
s390 KVM: s390: Return last valid slot if approx index is out-of-bounds 2020-04-14 10:39:57 -04:00
sh Merge branch 'akpm' (patches from Andrew) 2020-04-02 13:55:34 -07:00
sparc mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
um Merge branch 'akpm' (patches from Andrew) 2020-04-02 13:55:34 -07:00
unicore32 mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
x86 KVM: x86: Move "flush guest's TLB" logic to separate kvm_x86_ops hook 2020-04-20 17:26:10 -04:00
xtensa mm: allow VM_FAULT_RETRY for multiple times 2020-04-02 09:35:30 -07:00
.gitignore
Kconfig NOHZ full updates: 2020-03-30 18:29:05 -07:00