|
@@ -156,6 +156,16 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int kvm_hv_set_sint(struct kvm_kernel_irq_routing_entry *e,
|
|
|
+ struct kvm *kvm, int irq_source_id, int level,
|
|
|
+ bool line_status)
|
|
|
+{
|
|
|
+ if (!level)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ return kvm_hv_synic_set_irq(kvm, e->hv_sint.vcpu, e->hv_sint.sint);
|
|
|
+}
|
|
|
+
|
|
|
int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
|
|
|
struct kvm *kvm, int irq_source_id, int level,
|
|
|
bool line_status)
|
|
@@ -163,18 +173,26 @@ int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
|
|
|
struct kvm_lapic_irq irq;
|
|
|
int r;
|
|
|
|
|
|
- if (unlikely(e->type != KVM_IRQ_ROUTING_MSI))
|
|
|
- return -EWOULDBLOCK;
|
|
|
+ switch (e->type) {
|
|
|
+ case KVM_IRQ_ROUTING_HV_SINT:
|
|
|
+ return kvm_hv_set_sint(e, kvm, irq_source_id, level,
|
|
|
+ line_status);
|
|
|
|
|
|
- if (kvm_msi_route_invalid(kvm, e))
|
|
|
- return -EINVAL;
|
|
|
+ case KVM_IRQ_ROUTING_MSI:
|
|
|
+ if (kvm_msi_route_invalid(kvm, e))
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- kvm_set_msi_irq(kvm, e, &irq);
|
|
|
+ kvm_set_msi_irq(kvm, e, &irq);
|
|
|
|
|
|
- if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL))
|
|
|
- return r;
|
|
|
- else
|
|
|
- return -EWOULDBLOCK;
|
|
|
+ if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL))
|
|
|
+ return r;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return -EWOULDBLOCK;
|
|
|
}
|
|
|
|
|
|
int kvm_request_irq_source_id(struct kvm *kvm)
|
|
@@ -254,16 +272,6 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
|
|
|
srcu_read_unlock(&kvm->irq_srcu, idx);
|
|
|
}
|
|
|
|
|
|
-static int kvm_hv_set_sint(struct kvm_kernel_irq_routing_entry *e,
|
|
|
- struct kvm *kvm, int irq_source_id, int level,
|
|
|
- bool line_status)
|
|
|
-{
|
|
|
- if (!level)
|
|
|
- return -1;
|
|
|
-
|
|
|
- return kvm_hv_synic_set_irq(kvm, e->hv_sint.vcpu, e->hv_sint.sint);
|
|
|
-}
|
|
|
-
|
|
|
int kvm_set_routing_entry(struct kvm *kvm,
|
|
|
struct kvm_kernel_irq_routing_entry *e,
|
|
|
const struct kvm_irq_routing_entry *ue)
|
|
@@ -423,18 +431,6 @@ void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,
|
|
|
srcu_read_unlock(&kvm->irq_srcu, idx);
|
|
|
}
|
|
|
|
|
|
-int kvm_arch_set_irq(struct kvm_kernel_irq_routing_entry *irq, struct kvm *kvm,
|
|
|
- int irq_source_id, int level, bool line_status)
|
|
|
-{
|
|
|
- switch (irq->type) {
|
|
|
- case KVM_IRQ_ROUTING_HV_SINT:
|
|
|
- return kvm_hv_set_sint(irq, kvm, irq_source_id, level,
|
|
|
- line_status);
|
|
|
- default:
|
|
|
- return -EWOULDBLOCK;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
void kvm_arch_irq_routing_update(struct kvm *kvm)
|
|
|
{
|
|
|
kvm_hv_irq_routing_update(kvm);
|