All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: kvm@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>,
	Sean Christopherson <seanjc@google.com>
Cc: Wanpeng Li <wanpengli@tencent.com>,
	Jim Mattson <jmattson@google.com>,
	Michael Kelley <mikelley@microsoft.com>,
	Siddharth Chandrasekaran <sidcha@amazon.de>,
	Yuan Yao <yuan.yao@linux.intel.com>,
	Maxim Levitsky <mlevitsk@redhat.com>,
	linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v11 00/46] KVM: x86: hyper-v: Fine-grained TLB flush + L2 TLB flush features
Date: Tue,  4 Oct 2022 14:39:10 +0200	[thread overview]
Message-ID: <20221004123956.188909-1-vkuznets@redhat.com> (raw)

Changes since v10 (Sean):
- New patches added:
  - "x86/hyperv: Move VMCB enlightenment definitions to hyperv-tlfs.h"
  - "KVM: selftests: Move "struct hv_enlightenments" to x86_64/svm.h"
  - "KVM: SVM: Add a proper field for Hyper-V VMCB enlightenments"
  - 'x86/hyperv: KVM: Rename "hv_enlightenments" to "hv_vmcb_enlightenments"'
  - 'KVM: VMX: Rename "vmx/evmcs.{ch}" to "vmx/hyperv.{ch}"'
  - "KVM: x86: Move clearing of TLB_FLUSH_CURRENT to kvm_vcpu_flush_tlb_all()"
  - "KVM: selftests: Drop helpers to read/write page table entries"
  - "KVM: x86: Make kvm_hv_get_assist_page() return 0/-errno"
- Removed patches:
  - "KVM: selftests: Export _vm_get_page_table_entry()"
- Main differences:
  - Move Hyper-V TLB flushing out of kvm_service_local_tlb_flush_requests().
    On SVM, Hyper-V TLB flush FIFO is emptied from svm_flush_tlb_current()
  - Don't disable IRQs in hv_tlb_flush_enqueue().
  - Don't call kvm_vcpu_flush_tlb_guest() from kvm_hv_vcpu_flush_tlb() but
    return -errno instead.
  - Avoid unneded flushes in !EPT/!NPT cases.
  - Optimize hv_is_vp_in_sparse_set().
  - Move TLFS definitions to asm/hyperv-tlfs.h.
  - Use u64 vals in Hyper-V PV TLB flush selftest + multiple smaler changes
  - Typos, indentation, renames, ...

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 (7):
  x86/hyperv: Move VMCB enlightenment definitions to hyperv-tlfs.h
  KVM: selftests: Move "struct hv_enlightenments" to x86_64/svm.h
  KVM: SVM: Add a proper field for Hyper-V VMCB enlightenments
  x86/hyperv: KVM: Rename "hv_enlightenments" to
    "hv_vmcb_enlightenments"
  KVM: x86: Move clearing of TLB_FLUSH_CURRENT to
    kvm_vcpu_flush_tlb_all()
  KVM: x86: hyper-v: Add helper to read hypercall data for array
  KVM: selftests: Drop helpers to read/write page table entries

Vitaly Kuznetsov (39):
  KVM: x86: Rename 'enable_direct_tlbflush' to 'enable_l2_tlb_flush'
  KVM: VMX: Rename "vmx/evmcs.{ch}" to "vmx/hyperv.{ch}"
  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
  KVM: nVMX: hyper-v: Cache VP assist page in 'struct kvm_vcpu_hv'
  KVM: nVMX: hyper-v: Enable L2 TLB flush
  KVM: x86: Make kvm_hv_get_assist_page() return 0/-errno
  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: Hyper-V PV TLB flush selftest
  KVM: selftests: Sync 'struct hv_enlightened_vmcs' definition with
    hyperv-tlfs.h
  KVM: selftests: Sync 'struct hv_vp_assist_page' definition with
    hyperv-tlfs.h
  KVM: selftests: Move Hyper-V VP assist page enablement out of evmcs.h
  KVM: selftests: Split off load_evmcs() from load_vmcs()
  KVM: selftests: Create a vendor independent helper to allocate Hyper-V
    specific test pages
  KVM: selftests: Allocate Hyper-V partition assist page
  KVM: selftests: evmcs_test: Introduce L2 TLB flush test
  KVM: selftests: hyperv_svm_test: Introduce L2 TLB flush test
  KVM: selftests: Rename 'evmcs_test' to 'hyperv_evmcs'

 arch/x86/include/asm/hyperv-tlfs.h            |  37 +
 arch/x86/include/asm/kvm-x86-ops.h            |   2 +-
 arch/x86/include/asm/kvm_host.h               |  42 +-
 arch/x86/include/asm/svm.h                    |   7 +-
 arch/x86/kvm/Makefile                         |   5 +-
 arch/x86/kvm/hyperv.c                         | 335 +++++++--
 arch/x86/kvm/hyperv.h                         |  64 +-
 arch/x86/kvm/svm/hyperv.c                     |  18 +
 arch/x86/kvm/svm/hyperv.h                     |  50 +-
 arch/x86/kvm/svm/nested.c                     |  49 +-
 arch/x86/kvm/svm/svm.c                        |   7 +
 arch/x86/kvm/svm/svm.h                        |   5 +-
 arch/x86/kvm/svm/svm_onhyperv.c               |   8 +-
 arch/x86/kvm/svm/svm_onhyperv.h               |  25 +-
 arch/x86/kvm/trace.h                          |  21 +-
 arch/x86/kvm/vmx/{evmcs.c => hyperv.c}        |  45 +-
 arch/x86/kvm/vmx/{evmcs.h => hyperv.h}        |  12 +-
 arch/x86/kvm/vmx/nested.c                     |  43 +-
 arch/x86/kvm/vmx/vmx.c                        |   7 +-
 arch/x86/kvm/vmx/vmx_ops.h                    |   2 +-
 arch/x86/kvm/x86.c                            |  38 +-
 arch/x86/kvm/x86.h                            |   1 +
 include/asm-generic/hyperv-tlfs.h             |   5 +
 include/asm-generic/mshyperv.h                |  11 +-
 tools/testing/selftests/kvm/.gitignore        |   4 +-
 tools/testing/selftests/kvm/Makefile          |   5 +-
 .../selftests/kvm/include/kvm_util_base.h     |   1 +
 .../selftests/kvm/include/x86_64/evmcs.h      |  48 +-
 .../selftests/kvm/include/x86_64/hyperv.h     | 102 +++
 .../selftests/kvm/include/x86_64/processor.h  |  76 +-
 .../selftests/kvm/include/x86_64/svm.h        |  26 +-
 .../selftests/kvm/include/x86_64/vmx.h        |   8 -
 tools/testing/selftests/kvm/lib/kvm_util.c    |   9 +-
 .../testing/selftests/kvm/lib/x86_64/hyperv.c |  46 ++
 .../selftests/kvm/lib/x86_64/processor.c      |  21 +-
 tools/testing/selftests/kvm/lib/x86_64/vmx.c  |  45 +-
 .../kvm/x86_64/emulator_error_test.c          |   6 +-
 .../x86_64/{evmcs_test.c => hyperv_evmcs.c}   |  69 +-
 .../selftests/kvm/x86_64/hyperv_features.c    |  25 +-
 .../testing/selftests/kvm/x86_64/hyperv_ipi.c | 330 +++++++++
 .../selftests/kvm/x86_64/hyperv_svm_test.c    |  86 ++-
 .../selftests/kvm/x86_64/hyperv_tlb_flush.c   | 689 ++++++++++++++++++
 42 files changed, 2081 insertions(+), 354 deletions(-)
 create mode 100644 arch/x86/kvm/svm/hyperv.c
 rename arch/x86/kvm/vmx/{evmcs.c => hyperv.c} (95%)
 rename arch/x86/kvm/vmx/{evmcs.h => hyperv.h} (95%)
 create mode 100644 tools/testing/selftests/kvm/lib/x86_64/hyperv.c
 rename tools/testing/selftests/kvm/x86_64/{evmcs_test.c => hyperv_evmcs.c} (73%)
 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.37.3


             reply	other threads:[~2022-10-04 12:40 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-04 12:39 Vitaly Kuznetsov [this message]
2022-10-04 12:39 ` [PATCH v11 01/46] x86/hyperv: Move VMCB enlightenment definitions to hyperv-tlfs.h Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 02/46] KVM: selftests: Move "struct hv_enlightenments" to x86_64/svm.h Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 03/46] KVM: SVM: Add a proper field for Hyper-V VMCB enlightenments Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 04/46] x86/hyperv: KVM: Rename "hv_enlightenments" to "hv_vmcb_enlightenments" Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 05/46] KVM: x86: Rename 'enable_direct_tlbflush' to 'enable_l2_tlb_flush' Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 06/46] KVM: VMX: Rename "vmx/evmcs.{ch}" to "vmx/hyperv.{ch}" Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 07/46] KVM: x86: Move clearing of TLB_FLUSH_CURRENT to kvm_vcpu_flush_tlb_all() Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 08/46] KVM: x86: hyper-v: Resurrect dedicated KVM_REQ_HV_TLB_FLUSH flag Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 09/46] KVM: x86: hyper-v: Introduce TLB flush fifo Vitaly Kuznetsov
2022-10-19 19:52   ` Sean Christopherson
2022-10-04 12:39 ` [PATCH v11 10/46] KVM: x86: hyper-v: Add helper to read hypercall data for array Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 11/46] KVM: x86: hyper-v: Handle HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST{,EX} calls gently Vitaly Kuznetsov
2022-10-19 19:56   ` Sean Christopherson
2022-10-04 12:39 ` [PATCH v11 12/46] KVM: x86: hyper-v: Expose support for extended gva ranges for flush hypercalls Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 13/46] KVM: x86: Prepare kvm_hv_flush_tlb() to handle L2's GPAs Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 14/46] x86/hyperv: Introduce HV_MAX_SPARSE_VCPU_BANKS/HV_VCPUS_PER_SPARSE_BANK constants Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 15/46] KVM: x86: hyper-v: Use HV_MAX_SPARSE_VCPU_BANKS/HV_VCPUS_PER_SPARSE_BANK instead of raw '64' Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 16/46] KVM: x86: hyper-v: Don't use sparse_set_to_vcpu_mask() in kvm_hv_send_ipi() Vitaly Kuznetsov
2022-10-19 20:13   ` Sean Christopherson
2022-10-21  9:07     ` Vitaly Kuznetsov
2022-10-21 12:41       ` Vitaly Kuznetsov
2022-10-21 16:09         ` Sean Christopherson
2022-10-04 12:39 ` [PATCH v11 17/46] KVM: x86: hyper-v: Create a separate fifo for L2 TLB flush Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 18/46] KVM: x86: hyper-v: Use preallocated buffer in 'struct kvm_vcpu_hv' instead of on-stack 'sparse_banks' Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 19/46] KVM: nVMX: Keep track of hv_vm_id/hv_vp_id when eVMCS is in use Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 20/46] KVM: nSVM: Keep track of Hyper-V hv_vm_id/hv_vp_id Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 21/46] KVM: x86: Introduce .hv_inject_synthetic_vmexit_post_tlb_flush() nested hook Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 22/46] KVM: x86: hyper-v: Introduce kvm_hv_is_tlb_flush_hcall() Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 23/46] KVM: x86: hyper-v: L2 TLB flush Vitaly Kuznetsov
2022-10-19 21:53   ` Sean Christopherson
2022-10-04 12:39 ` [PATCH v11 24/46] KVM: x86: hyper-v: Introduce fast guest_hv_cpuid_has_l2_tlb_flush() check Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 25/46] KVM: nVMX: hyper-v: Cache VP assist page in 'struct kvm_vcpu_hv' Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 26/46] KVM: nVMX: hyper-v: Enable L2 TLB flush Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 27/46] KVM: x86: Make kvm_hv_get_assist_page() return 0/-errno Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 28/46] KVM: nSVM: hyper-v: Enable L2 TLB flush Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 29/46] KVM: x86: Expose Hyper-V L2 TLB flush feature Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 30/46] KVM: selftests: Better XMM read/write helpers Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 31/46] KVM: selftests: Move HYPERV_LINUX_OS_ID definition to a common header Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 32/46] KVM: selftests: Move the function doing Hyper-V hypercall " Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 33/46] KVM: selftests: Hyper-V PV IPI selftest Vitaly Kuznetsov
2022-10-19 22:08   ` Sean Christopherson
2022-10-21 13:20     ` Vitaly Kuznetsov
2022-10-21 13:42       ` Vitaly Kuznetsov
2022-10-21 16:14         ` Sean Christopherson
2022-10-04 12:39 ` [PATCH v11 34/46] KVM: selftests: Fill in vm->vpages_mapped bitmap in virt_map() too Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 35/46] KVM: selftests: Export vm_vaddr_unused_gap() to make it possible to request unmapped ranges Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 36/46] KVM: selftests: Drop helpers to read/write page table entries Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 37/46] KVM: selftests: Hyper-V PV TLB flush selftest Vitaly Kuznetsov
2022-10-19 22:12   ` Sean Christopherson
2022-10-04 12:39 ` [PATCH v11 38/46] KVM: selftests: Sync 'struct hv_enlightened_vmcs' definition with hyperv-tlfs.h Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 39/46] KVM: selftests: Sync 'struct hv_vp_assist_page' " Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 40/46] KVM: selftests: Move Hyper-V VP assist page enablement out of evmcs.h Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 41/46] KVM: selftests: Split off load_evmcs() from load_vmcs() Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 42/46] KVM: selftests: Create a vendor independent helper to allocate Hyper-V specific test pages Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 43/46] KVM: selftests: Allocate Hyper-V partition assist page Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 44/46] KVM: selftests: evmcs_test: Introduce L2 TLB flush test Vitaly Kuznetsov
2022-10-19 22:19   ` Sean Christopherson
2022-10-21 14:50     ` Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 45/46] KVM: selftests: hyperv_svm_test: " Vitaly Kuznetsov
2022-10-04 12:39 ` [PATCH v11 46/46] KVM: selftests: Rename 'evmcs_test' to 'hyperv_evmcs' Vitaly Kuznetsov
2022-10-19 22:22 ` [PATCH v11 00/46] KVM: x86: hyper-v: Fine-grained TLB flush + L2 TLB flush features Sean Christopherson
2022-10-20  8:22   ` Vitaly Kuznetsov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221004123956.188909-1-vkuznets@redhat.com \
    --to=vkuznets@redhat.com \
    --cc=jmattson@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mikelley@microsoft.com \
    --cc=mlevitsk@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=seanjc@google.com \
    --cc=sidcha@amazon.de \
    --cc=wanpengli@tencent.com \
    --cc=yuan.yao@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.