All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 00/38] KVM: x86: hyper-v: Fine-grained TLB flush + L2 TLB flush features
@ 2022-06-06  8:36 Vitaly Kuznetsov
  2022-06-06  8:36 ` [PATCH v6 01/38] KVM: x86: Rename 'enable_direct_tlbflush' to 'enable_l2_tlb_flush' Vitaly Kuznetsov
                   ` (37 more replies)
  0 siblings, 38 replies; 58+ messages in thread
From: Vitaly Kuznetsov @ 2022-06-06  8:36 UTC (permalink / raw)
  To: kvm, Paolo Bonzini
  Cc: Sean Christopherson, Wanpeng Li, Jim Mattson, Michael Kelley,
	Siddharth Chandrasekaran, Yuan Yao, Maxim Levitsky, linux-hyperv,
	linux-kernel

Changes since v5:
- Rebase to the latest kvm/queue [55371f1d0c01].
- "KVM: nVMX: hyper-v: Cache VP assist page in 'struct kvm_vcpu_hv'"
  patch added. This is later used for both nSVM and nVMX to avoid
  reading VP assist page from atomic contexts.

Original description:

Currently, KVM handles HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST{,EX} requests
by flushing the whole VPID and this is sub-optimal. This series introduces
the required mechanism to make handling of these requests more 
fine-grained by flushing individual GVAs only (when requested). On this
foundation, "Direct Virtual Flush" Hyper-V feature is implemented. The 
feature allows L0 to handle Hyper-V TLB flush hypercalls directly at
L0 without the need to reflect the exit to L1. This has at least two
benefits: reflecting vmexit and the consequent vmenter are avoided + L0
has precise information whether the target vCPU is actually running (and
thus requires a kick).

Sean Christopherson (1):
  KVM: x86: hyper-v: Add helper to read hypercall data for array

Vitaly Kuznetsov (37):
  KVM: x86: Rename 'enable_direct_tlbflush' to 'enable_l2_tlb_flush'
  KVM: x86: hyper-v: Resurrect dedicated KVM_REQ_HV_TLB_FLUSH flag
  KVM: x86: hyper-v: Introduce TLB flush fifo
  KVM: x86: hyper-v: Handle HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST{,EX} calls
    gently
  KVM: x86: hyper-v: Expose support for extended gva ranges for flush
    hypercalls
  KVM: x86: Prepare kvm_hv_flush_tlb() to handle L2's GPAs
  x86/hyperv: Introduce
    HV_MAX_SPARSE_VCPU_BANKS/HV_VCPUS_PER_SPARSE_BANK constants
  KVM: x86: hyper-v: Use
    HV_MAX_SPARSE_VCPU_BANKS/HV_VCPUS_PER_SPARSE_BANK instead of raw
    '64'
  KVM: x86: hyper-v: Don't use sparse_set_to_vcpu_mask() in
    kvm_hv_send_ipi()
  KVM: x86: hyper-v: Create a separate fifo for L2 TLB flush
  KVM: x86: hyper-v: Use preallocated buffer in 'struct kvm_vcpu_hv'
    instead of on-stack 'sparse_banks'
  KVM: nVMX: Keep track of hv_vm_id/hv_vp_id when eVMCS is in use
  KVM: nSVM: Keep track of Hyper-V hv_vm_id/hv_vp_id
  KVM: x86: Introduce .hv_inject_synthetic_vmexit_post_tlb_flush()
    nested hook
  KVM: x86: hyper-v: Introduce kvm_hv_is_tlb_flush_hcall()
  KVM: x86: hyper-v: L2 TLB flush
  KVM: x86: hyper-v: Introduce fast guest_hv_cpuid_has_l2_tlb_flush()
    check
  x86/hyperv: Fix 'struct hv_enlightened_vmcs' definition
  KVM: nVMX: hyper-v: Cache VP assist page in 'struct kvm_vcpu_hv'
  KVM: nVMX: hyper-v: Enable L2 TLB flush
  KVM: nSVM: hyper-v: Enable L2 TLB flush
  KVM: x86: Expose Hyper-V L2 TLB flush feature
  KVM: selftests: Better XMM read/write helpers
  KVM: selftests: Move HYPERV_LINUX_OS_ID definition to a common header
  KVM: selftests: Move the function doing Hyper-V hypercall to a common
    header
  KVM: selftests: Hyper-V PV IPI selftest
  KVM: selftests: Fill in vm->vpages_mapped bitmap in virt_map() too
  KVM: selftests: Export vm_vaddr_unused_gap() to make it possible to
    request unmapped ranges
  KVM: selftests: Export _vm_get_page_table_entry()
  KVM: selftests: Hyper-V PV TLB flush selftest
  KVM: selftests: Sync 'struct hv_enlightened_vmcs' definition with
    hyperv-tlfs.h
  KVM: selftests: nVMX: Allocate Hyper-V partition assist page
  KVM: selftests: nSVM: Allocate Hyper-V partition assist and VP assist
    pages
  KVM: selftests: Sync 'struct hv_vp_assist_page' definition with
    hyperv-tlfs.h
  KVM: selftests: evmcs_test: Introduce L2 TLB flush test
  KVM: selftests: Move Hyper-V VP assist page enablement out of evmcs.h
  KVM: selftests: hyperv_svm_test: Introduce L2 TLB flush test

 arch/x86/include/asm/hyperv-tlfs.h            |   6 +-
 arch/x86/include/asm/kvm-x86-ops.h            |   2 +-
 arch/x86/include/asm/kvm_host.h               |  43 +-
 arch/x86/kvm/Makefile                         |   3 +-
 arch/x86/kvm/hyperv.c                         | 334 +++++++--
 arch/x86/kvm/hyperv.h                         |  53 +-
 arch/x86/kvm/svm/hyperv.c                     |  18 +
 arch/x86/kvm/svm/hyperv.h                     |  48 ++
 arch/x86/kvm/svm/nested.c                     |  39 +-
 arch/x86/kvm/svm/svm_onhyperv.c               |   2 +-
 arch/x86/kvm/svm/svm_onhyperv.h               |   6 +-
 arch/x86/kvm/trace.h                          |  21 +-
 arch/x86/kvm/vmx/evmcs.c                      |  42 +-
 arch/x86/kvm/vmx/evmcs.h                      |  13 +-
 arch/x86/kvm/vmx/nested.c                     |  44 +-
 arch/x86/kvm/vmx/vmx.c                        |   6 +-
 arch/x86/kvm/x86.c                            |  18 +-
 arch/x86/kvm/x86.h                            |   1 +
 include/asm-generic/hyperv-tlfs.h             |   5 +
 include/asm-generic/mshyperv.h                |  11 +-
 tools/testing/selftests/kvm/.gitignore        |   2 +
 tools/testing/selftests/kvm/Makefile          |   4 +-
 .../selftests/kvm/include/kvm_util_base.h     |   1 +
 .../selftests/kvm/include/x86_64/evmcs.h      |  40 +-
 .../selftests/kvm/include/x86_64/hyperv.h     |  62 ++
 .../selftests/kvm/include/x86_64/processor.h  |  71 +-
 .../selftests/kvm/include/x86_64/svm_util.h   |  10 +
 .../selftests/kvm/include/x86_64/vmx.h        |   4 +
 tools/testing/selftests/kvm/lib/kvm_util.c    |   7 +-
 .../testing/selftests/kvm/lib/x86_64/hyperv.c |  21 +
 .../selftests/kvm/lib/x86_64/processor.c      |   3 +-
 tools/testing/selftests/kvm/lib/x86_64/svm.c  |  10 +
 tools/testing/selftests/kvm/lib/x86_64/vmx.c  |   7 +
 .../testing/selftests/kvm/x86_64/evmcs_test.c |  43 +-
 .../selftests/kvm/x86_64/hyperv_features.c    |  22 +-
 .../testing/selftests/kvm/x86_64/hyperv_ipi.c | 352 ++++++++++
 .../selftests/kvm/x86_64/hyperv_svm_test.c    |  54 +-
 .../selftests/kvm/x86_64/hyperv_tlb_flush.c   | 660 ++++++++++++++++++
 38 files changed, 1887 insertions(+), 201 deletions(-)
 create mode 100644 arch/x86/kvm/svm/hyperv.c
 create mode 100644 tools/testing/selftests/kvm/lib/x86_64/hyperv.c
 create mode 100644 tools/testing/selftests/kvm/x86_64/hyperv_ipi.c
 create mode 100644 tools/testing/selftests/kvm/x86_64/hyperv_tlb_flush.c

-- 
2.35.3


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

end of thread, other threads:[~2022-06-13 17:35 UTC | newest]

Thread overview: 58+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-06  8:36 [PATCH v6 00/38] KVM: x86: hyper-v: Fine-grained TLB flush + L2 TLB flush features Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 01/38] KVM: x86: Rename 'enable_direct_tlbflush' to 'enable_l2_tlb_flush' Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 02/38] KVM: x86: hyper-v: Resurrect dedicated KVM_REQ_HV_TLB_FLUSH flag Vitaly Kuznetsov
2022-06-07  8:46   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 03/38] KVM: x86: hyper-v: Introduce TLB flush fifo Vitaly Kuznetsov
2022-06-07  8:57   ` Maxim Levitsky
2022-06-08  7:47     ` Vitaly Kuznetsov
2022-06-08  8:46       ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 04/38] KVM: x86: hyper-v: Add helper to read hypercall data for array Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 05/38] KVM: x86: hyper-v: Handle HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST{,EX} calls gently Vitaly Kuznetsov
2022-06-07  9:30   ` Maxim Levitsky
2022-06-13 12:58     ` Vitaly Kuznetsov
2022-06-08 10:18   ` Yuan Yao
2022-06-09  9:13     ` Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 06/38] KVM: x86: hyper-v: Expose support for extended gva ranges for flush hypercalls Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 07/38] KVM: x86: Prepare kvm_hv_flush_tlb() to handle L2's GPAs Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 08/38] x86/hyperv: Introduce HV_MAX_SPARSE_VCPU_BANKS/HV_VCPUS_PER_SPARSE_BANK constants Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 09/38] KVM: x86: hyper-v: Use HV_MAX_SPARSE_VCPU_BANKS/HV_VCPUS_PER_SPARSE_BANK instead of raw '64' Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 10/38] KVM: x86: hyper-v: Don't use sparse_set_to_vcpu_mask() in kvm_hv_send_ipi() Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 11/38] KVM: x86: hyper-v: Create a separate fifo for L2 TLB flush Vitaly Kuznetsov
2022-06-07  9:33   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 12/38] KVM: x86: hyper-v: Use preallocated buffer in 'struct kvm_vcpu_hv' instead of on-stack 'sparse_banks' Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 13/38] KVM: nVMX: Keep track of hv_vm_id/hv_vp_id when eVMCS is in use Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 14/38] KVM: nSVM: Keep track of Hyper-V hv_vm_id/hv_vp_id Vitaly Kuznetsov
2022-06-07  9:36   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 15/38] KVM: x86: Introduce .hv_inject_synthetic_vmexit_post_tlb_flush() nested hook Vitaly Kuznetsov
2022-06-07  9:41   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 16/38] KVM: x86: hyper-v: Introduce kvm_hv_is_tlb_flush_hcall() Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 17/38] KVM: x86: hyper-v: L2 TLB flush Vitaly Kuznetsov
2022-06-07  9:47   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 18/38] KVM: x86: hyper-v: Introduce fast guest_hv_cpuid_has_l2_tlb_flush() check Vitaly Kuznetsov
2022-06-07  9:48   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 19/38] x86/hyperv: Fix 'struct hv_enlightened_vmcs' definition Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 20/38] KVM: nVMX: hyper-v: Cache VP assist page in 'struct kvm_vcpu_hv' Vitaly Kuznetsov
2022-06-07  9:56   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 21/38] KVM: nVMX: hyper-v: Enable L2 TLB flush Vitaly Kuznetsov
2022-06-07 10:02   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 22/38] KVM: nSVM: " Vitaly Kuznetsov
2022-06-07 10:02   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 23/38] KVM: x86: Expose Hyper-V L2 TLB flush feature Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 24/38] KVM: selftests: Better XMM read/write helpers Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 25/38] KVM: selftests: Move HYPERV_LINUX_OS_ID definition to a common header Vitaly Kuznetsov
2022-06-07 10:03   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 26/38] KVM: selftests: Move the function doing Hyper-V hypercall " Vitaly Kuznetsov
2022-06-07 10:03   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 27/38] KVM: selftests: Hyper-V PV IPI selftest Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 28/38] KVM: selftests: Fill in vm->vpages_mapped bitmap in virt_map() too Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 29/38] KVM: selftests: Export vm_vaddr_unused_gap() to make it possible to request unmapped ranges Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 30/38] KVM: selftests: Export _vm_get_page_table_entry() Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 31/38] KVM: selftests: Hyper-V PV TLB flush selftest Vitaly Kuznetsov
2022-06-07 12:14   ` Maxim Levitsky
2022-06-06  8:36 ` [PATCH v6 32/38] KVM: selftests: Sync 'struct hv_enlightened_vmcs' definition with hyperv-tlfs.h Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 33/38] KVM: selftests: nVMX: Allocate Hyper-V partition assist page Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 34/38] KVM: selftests: nSVM: Allocate Hyper-V partition assist and VP assist pages Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 35/38] KVM: selftests: Sync 'struct hv_vp_assist_page' definition with hyperv-tlfs.h Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 36/38] KVM: selftests: evmcs_test: Introduce L2 TLB flush test Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 37/38] KVM: selftests: Move Hyper-V VP assist page enablement out of evmcs.h Vitaly Kuznetsov
2022-06-06  8:36 ` [PATCH v6 38/38] KVM: selftests: hyperv_svm_test: Introduce L2 TLB flush test Vitaly Kuznetsov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.