mirror of https://gitee.com/openkylin/qemu.git
kvm: Hyper-V SynIC irq routing support
Signed-off-by: Andrey Smetanin <asmetanin@virtuozzo.com> Reviewed-by: Roman Kagan <rkagan@virtuozzo.com> Signed-off-by: Denis V. Lunev <den@openvz.org> CC: Paolo Bonzini <pbonzini@redhat.com> CC: Richard Henderson <rth@twiddle.net> CC: Eduardo Habkost <ehabkost@redhat.com> CC: "Andreas Färber" <afaerber@suse.de> CC: Marcelo Tosatti <mtosatti@redhat.com> CC: Roman Kagan <rkagan@virtuozzo.com> CC: Denis V. Lunev <den@openvz.org> CC: kvm@vger.kernel.org Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
866eea9a13
commit
977a8d9c0d
|
@ -455,6 +455,7 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
|
||||||
void kvm_irqchip_release_virq(KVMState *s, int virq);
|
void kvm_irqchip_release_virq(KVMState *s, int virq);
|
||||||
|
|
||||||
int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter);
|
int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter);
|
||||||
|
int kvm_irqchip_add_hv_sint_route(KVMState *s, uint32_t vcpu, uint32_t sint);
|
||||||
|
|
||||||
int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
int kvm_irqchip_add_irqfd_notifier_gsi(KVMState *s, EventNotifier *n,
|
||||||
EventNotifier *rn, int virq);
|
EventNotifier *rn, int virq);
|
||||||
|
|
33
kvm-all.c
33
kvm-all.c
|
@ -1300,6 +1300,34 @@ int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter)
|
||||||
return virq;
|
return virq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kvm_irqchip_add_hv_sint_route(KVMState *s, uint32_t vcpu, uint32_t sint)
|
||||||
|
{
|
||||||
|
struct kvm_irq_routing_entry kroute = {};
|
||||||
|
int virq;
|
||||||
|
|
||||||
|
if (!kvm_gsi_routing_enabled()) {
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
if (!kvm_check_extension(s, KVM_CAP_HYPERV_SYNIC)) {
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
virq = kvm_irqchip_get_virq(s);
|
||||||
|
if (virq < 0) {
|
||||||
|
return virq;
|
||||||
|
}
|
||||||
|
|
||||||
|
kroute.gsi = virq;
|
||||||
|
kroute.type = KVM_IRQ_ROUTING_HV_SINT;
|
||||||
|
kroute.flags = 0;
|
||||||
|
kroute.u.hv_sint.vcpu = vcpu;
|
||||||
|
kroute.u.hv_sint.sint = sint;
|
||||||
|
|
||||||
|
kvm_add_routing_entry(s, &kroute);
|
||||||
|
kvm_irqchip_commit_routes(s);
|
||||||
|
|
||||||
|
return virq;
|
||||||
|
}
|
||||||
|
|
||||||
#else /* !KVM_CAP_IRQ_ROUTING */
|
#else /* !KVM_CAP_IRQ_ROUTING */
|
||||||
|
|
||||||
void kvm_init_irq_routing(KVMState *s)
|
void kvm_init_irq_routing(KVMState *s)
|
||||||
|
@ -1325,6 +1353,11 @@ int kvm_irqchip_add_adapter_route(KVMState *s, AdapterInfo *adapter)
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int kvm_irqchip_add_hv_sint_route(KVMState *s, uint32_t vcpu, uint32_t sint)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign)
|
static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign)
|
||||||
{
|
{
|
||||||
abort();
|
abort();
|
||||||
|
|
Loading…
Reference in New Issue