KVM/Hyper-V: Add new KVM capability KVM_CAP_HYPERV_DIRECT_TLBFLUSH
Hyper-V direct tlb flush function should be enabled for guest that only uses Hyper-V hypercall. User space hypervisor(e.g, Qemu) can disable KVM identification in CPUID and just exposes Hyper-V identification to make sure the precondition. Add new KVM capability KVM_CAP_ HYPERV_DIRECT_TLBFLUSH for user space to enable Hyper-V direct tlb function and this function is default to be disabled in KVM. Signed-off-by: Tianyu Lan <Tianyu.Lan@microsoft.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7a83247e01
commit
344c6c8047
4 changed files with 23 additions and 0 deletions
|
@ -5309,3 +5309,16 @@ Architectures: x86
|
||||||
This capability indicates that KVM supports paravirtualized Hyper-V IPI send
|
This capability indicates that KVM supports paravirtualized Hyper-V IPI send
|
||||||
hypercalls:
|
hypercalls:
|
||||||
HvCallSendSyntheticClusterIpi, HvCallSendSyntheticClusterIpiEx.
|
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.
|
||||||
|
|
|
@ -1213,6 +1213,7 @@ struct kvm_x86_ops {
|
||||||
bool (*need_emulation_on_page_fault)(struct kvm_vcpu *vcpu);
|
bool (*need_emulation_on_page_fault)(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
bool (*apic_init_signal_blocked)(struct kvm_vcpu *vcpu);
|
bool (*apic_init_signal_blocked)(struct kvm_vcpu *vcpu);
|
||||||
|
int (*enable_direct_tlbflush)(struct kvm_vcpu *vcpu);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kvm_arch_async_pf {
|
struct kvm_arch_async_pf {
|
||||||
|
|
|
@ -3282,6 +3282,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
||||||
r = kvm_x86_ops->get_nested_state ?
|
r = kvm_x86_ops->get_nested_state ?
|
||||||
kvm_x86_ops->get_nested_state(NULL, NULL, 0) : 0;
|
kvm_x86_ops->get_nested_state(NULL, NULL, 0) : 0;
|
||||||
break;
|
break;
|
||||||
|
case KVM_CAP_HYPERV_DIRECT_TLBFLUSH:
|
||||||
|
r = kvm_x86_ops->enable_direct_tlbflush ? 1 : 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4055,6 +4058,11 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
}
|
}
|
||||||
return r;
|
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:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -999,6 +999,7 @@ struct kvm_ppc_resize_hpt {
|
||||||
#define KVM_CAP_ARM_PTRAUTH_GENERIC 172
|
#define KVM_CAP_ARM_PTRAUTH_GENERIC 172
|
||||||
#define KVM_CAP_PMU_EVENT_FILTER 173
|
#define KVM_CAP_PMU_EVENT_FILTER 173
|
||||||
#define KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 174
|
#define KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 174
|
||||||
|
#define KVM_CAP_HYPERV_DIRECT_TLBFLUSH 175
|
||||||
|
|
||||||
#ifdef KVM_CAP_IRQ_ROUTING
|
#ifdef KVM_CAP_IRQ_ROUTING
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue