i386/kvm: add support for Hyper-V IPI send
Hyper-V PV IPI support is merged to KVM, enable the feature in Qemu. When enabled, this allows Windows guests to send IPIs to other vCPUs with a single hypercall even when there are >64 vCPUs in the request. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Reviewed-by: Roman Kagan <rkagan@virtuozzo.com> Message-Id: <20181009130853.6412-3-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
ca9759c2a9
commit
6b7a98303b
@ -5564,6 +5564,7 @@ static Property x86_cpu_properties[] = {
|
||||
DEFINE_PROP_BOOL("hv-frequencies", X86CPU, hyperv_frequencies, false),
|
||||
DEFINE_PROP_BOOL("hv-reenlightenment", X86CPU, hyperv_reenlightenment, false),
|
||||
DEFINE_PROP_BOOL("hv-tlbflush", X86CPU, hyperv_tlbflush, false),
|
||||
DEFINE_PROP_BOOL("hv-ipi", X86CPU, hyperv_ipi, false),
|
||||
DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
|
||||
DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
|
||||
DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
|
||||
|
@ -1382,6 +1382,7 @@ struct X86CPU {
|
||||
bool hyperv_frequencies;
|
||||
bool hyperv_reenlightenment;
|
||||
bool hyperv_tlbflush;
|
||||
bool hyperv_ipi;
|
||||
bool check_cpuid;
|
||||
bool enforce_cpuid;
|
||||
bool expose_kvm;
|
||||
|
@ -58,6 +58,7 @@
|
||||
#define HV_APIC_ACCESS_RECOMMENDED (1u << 3)
|
||||
#define HV_SYSTEM_RESET_RECOMMENDED (1u << 4)
|
||||
#define HV_RELAXED_TIMING_RECOMMENDED (1u << 5)
|
||||
#define HV_CLUSTER_IPI_RECOMMENDED (1u << 10)
|
||||
#define HV_EX_PROCESSOR_MASKS_RECOMMENDED (1u << 11)
|
||||
|
||||
/*
|
||||
|
@ -608,7 +608,8 @@ static bool hyperv_enabled(X86CPU *cpu)
|
||||
cpu->hyperv_synic ||
|
||||
cpu->hyperv_stimer ||
|
||||
cpu->hyperv_reenlightenment ||
|
||||
cpu->hyperv_tlbflush);
|
||||
cpu->hyperv_tlbflush ||
|
||||
cpu->hyperv_ipi);
|
||||
}
|
||||
|
||||
static int kvm_arch_set_tsc_khz(CPUState *cs)
|
||||
@ -888,6 +889,17 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||
c->eax |= HV_REMOTE_TLB_FLUSH_RECOMMENDED;
|
||||
c->eax |= HV_EX_PROCESSOR_MASKS_RECOMMENDED;
|
||||
}
|
||||
if (cpu->hyperv_ipi) {
|
||||
if (kvm_check_extension(cs->kvm_state,
|
||||
KVM_CAP_HYPERV_SEND_IPI) <= 0) {
|
||||
fprintf(stderr, "Hyper-V IPI send support "
|
||||
"(requested by 'hv-ipi' cpu flag) "
|
||||
" is not supported by kernel\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
c->eax |= HV_CLUSTER_IPI_RECOMMENDED;
|
||||
c->eax |= HV_EX_PROCESSOR_MASKS_RECOMMENDED;
|
||||
}
|
||||
|
||||
c->ebx = cpu->hyperv_spinlock_attempts;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user