Message ID | 20190819131737.26942-3-Tianyu.Lan@microsoft.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM/Hyper-V: Add Hyper-V direct tlb flush support | expand |
On Mon, 19 Aug 2019, lantianyu1986@gmail.com wrote: > From: Tianyu Lan <Tianyu.Lan@microsoft.com> > > This patch adds Same git grep command as before > new KVM cap KVM_CAP_HYPERV_DIRECT_TLBFLUSH and let baseball cap? Please do not use weird acronyms. This is text and there is not limitation on characters. > user space to enable direct tlb flush function when only Hyper-V > hypervsior capability is exposed to VM. Sorry, but I'm not understanding this sentence. > This patch also adds Once more > enable_direct_tlbflush callback in the struct kvm_x86_ops and > platforms may use it to implement direct tlb flush support. Please tell in the changelog WHY you are doing things not what. The what is obviously in the patch. So you want to explain what you are trying to achieve and why it is useful. Then you can add a short note about what you are adding, but not at the level of detail which is available from the diff itself. Thanks, tglx
Hi Thomas: Thanks for your review. Will fix your comment in the next version. On Mon, Aug 19, 2019 at 9:27 PM Thomas Gleixner <tglx@linutronix.de> wrote: > > On Mon, 19 Aug 2019, lantianyu1986@gmail.com wrote: > > > From: Tianyu Lan <Tianyu.Lan@microsoft.com> > > > > This patch adds > > Same git grep command as before > > > new KVM cap KVM_CAP_HYPERV_DIRECT_TLBFLUSH and let > > baseball cap? Please do not use weird acronyms. This is text and there is > not limitation on characters. > > > user space to enable direct tlb flush function when only Hyper-V > > hypervsior capability is exposed to VM. > > Sorry, but I'm not understanding this sentence. > > > This patch also adds > > Once more > > > enable_direct_tlbflush callback in the struct kvm_x86_ops and > > platforms may use it to implement direct tlb flush support. > > Please tell in the changelog WHY you are doing things not what. The what is > obviously in the patch. > > So you want to explain what you are trying to achieve and why it is > useful. Then you can add a short note about what you are adding, but not at > the level of detail which is available from the diff itself. > > Thanks, > > tglx -- Best regards Tianyu Lan
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 2cd6250b2896..0c6e1b25d0c8 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -5289,3 +5289,16 @@ Architectures: x86 This capability indicates that KVM supports paravirtualized Hyper-V IPI send hypercalls: HvCallSendSyntheticClusterIpi, HvCallSendSyntheticClusterIpiEx. +8.21 KVM_CAP_HYPERV_DIRECT_TLBFLUSH + +Architecture: x86 + +This capability indicates that KVM running on top of Hyper-V hypervisor +enables Direct TLB flush for its guests meaning that TLB flush +hypercalls are handled by Level 0 hypervisor (Hyper-V) bypassing KVM. +Due to the different ABI for hypercall parameters between Hyper-V and +KVM, enabling this capability effectively disables all hypercall +handling by KVM (as some KVM hypercall may be mistakenly treated as TLB +flush hypercalls by Hyper-V) so userspace should disable KVM identification +in CPUID and only exposes Hyper-V identification. In this case, guest +thinks it's running on Hyper-V and only use Hyper-V hypercalls. diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 0cc5b611a113..667d154e89d4 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1205,6 +1205,8 @@ struct kvm_x86_ops { uint16_t (*nested_get_evmcs_version)(struct kvm_vcpu *vcpu); bool (*need_emulation_on_page_fault)(struct kvm_vcpu *vcpu); + + int (*enable_direct_tlbflush)(struct kvm_vcpu *vcpu); }; struct kvm_arch_async_pf { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 9d7b9e6a0939..a9d8ee7f7bf0 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -3183,6 +3183,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) r = kvm_x86_ops->get_nested_state ? kvm_x86_ops->get_nested_state(NULL, NULL, 0) : 0; break; + case KVM_CAP_HYPERV_DIRECT_TLBFLUSH: + r = kvm_x86_ops->enable_direct_tlbflush ? 1 : 0; + break; default: break; } @@ -3953,6 +3956,11 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu, r = -EFAULT; } return r; + case KVM_CAP_HYPERV_DIRECT_TLBFLUSH: + if (!kvm_x86_ops->enable_direct_tlbflush) + return -ENOTTY; + + return kvm_x86_ops->enable_direct_tlbflush(vcpu); default: return -EINVAL; diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index a7c19540ce21..cb959bc925b1 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -996,6 +996,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_ARM_PTRAUTH_ADDRESS 171 #define KVM_CAP_ARM_PTRAUTH_GENERIC 172 #define KVM_CAP_PMU_EVENT_FILTER 173 +#define KVM_CAP_HYPERV_DIRECT_TLBFLUSH 174 #ifdef KVM_CAP_IRQ_ROUTING