From: Joerg Roedel <[email protected]> The plane_level is used to route MSI IRQs to the correct plane.
Signed-off-by: Joerg Roedel <[email protected]> --- arch/arm64/kvm/vgic/vgic-irqfd.c | 6 ++++-- arch/loongarch/kvm/irqfd.c | 6 ++++-- arch/powerpc/kvm/mpic.c | 5 +++-- arch/riscv/kvm/vm.c | 5 +++-- arch/s390/kvm/interrupt.c | 3 ++- arch/x86/kvm/irq.c | 7 ++++--- include/linux/kvm_host.h | 3 ++- virt/kvm/irqchip.c | 2 +- 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-irqfd.c b/arch/arm64/kvm/vgic/vgic-irqfd.c index 479b896c8954..53e5fcc591d7 100644 --- a/arch/arm64/kvm/vgic/vgic-irqfd.c +++ b/arch/arm64/kvm/vgic/vgic-irqfd.c @@ -33,11 +33,13 @@ static int vgic_irqfd_set_irq(struct kvm_kernel_irq_routing_entry *e, * @kvm: the VM this entry is applied to * @e: kvm kernel routing entry handle * @ue: user api routing entry handle + * @plane_level: target plane level * return 0 on success, -EINVAL on errors. */ int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue) + const struct kvm_irq_routing_entry *ue, + unsigned plane_level) { int r = -EINVAL; @@ -57,7 +59,7 @@ int kvm_set_routing_entry(struct kvm *kvm, e->msi.data = ue->u.msi.data; e->msi.flags = ue->flags; e->msi.devid = ue->u.msi.devid; - e->msi.plane_level = 0; + e->msi.plane_level = plane_level; break; default: goto out; diff --git a/arch/loongarch/kvm/irqfd.c b/arch/loongarch/kvm/irqfd.c index 50f0c32df46c..a36a8a9d8a66 100644 --- a/arch/loongarch/kvm/irqfd.c +++ b/arch/loongarch/kvm/irqfd.c @@ -39,11 +39,13 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, * @kvm: the VM this entry is applied to * @e: kvm kernel routing entry handle * @ue: user api routing entry handle + * @plane_level: target plane level * return 0 on success, -EINVAL on errors. */ int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue) + const struct kvm_irq_routing_entry *ue, + unsigned plane_level) { switch (ue->type) { case KVM_IRQ_ROUTING_IRQCHIP: @@ -60,7 +62,7 @@ int kvm_set_routing_entry(struct kvm *kvm, e->msi.address_lo = ue->u.msi.address_lo; e->msi.address_hi = ue->u.msi.address_hi; e->msi.data = ue->u.msi.data; - e->msi.plane_level = 0; + e->msi.plane_level = plane_level; return 0; default: return -EINVAL; diff --git a/arch/powerpc/kvm/mpic.c b/arch/powerpc/kvm/mpic.c index 0f568f5fff8b..6b6eba7fbf75 100644 --- a/arch/powerpc/kvm/mpic.c +++ b/arch/powerpc/kvm/mpic.c @@ -1824,7 +1824,8 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue) + const struct kvm_irq_routing_entry *ue, + unsigned plane_level) { int r = -EINVAL; @@ -1841,7 +1842,7 @@ int kvm_set_routing_entry(struct kvm *kvm, e->msi.address_lo = ue->u.msi.address_lo; e->msi.address_hi = ue->u.msi.address_hi; e->msi.data = ue->u.msi.data; - e->msi.plane_level = 0; + e->msi.plane_level = plane_level; break; default: goto out; diff --git a/arch/riscv/kvm/vm.c b/arch/riscv/kvm/vm.c index f518247e699b..6b3c8a0e74e2 100644 --- a/arch/riscv/kvm/vm.c +++ b/arch/riscv/kvm/vm.c @@ -118,7 +118,8 @@ bool kvm_arch_can_set_irq_routing(struct kvm *kvm) int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue) + const struct kvm_irq_routing_entry *ue, + unsigned plane_level) { int r = -EINVAL; @@ -138,7 +139,7 @@ int kvm_set_routing_entry(struct kvm *kvm, e->msi.data = ue->u.msi.data; e->msi.flags = ue->flags; e->msi.devid = ue->u.msi.devid; - e->msi.plane_level = 0; + e->msi.plane_level = plane_level; break; default: goto out; diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index 1d66ef9f7527..dbd6029773aa 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -2862,7 +2862,8 @@ void kvm_s390_reinject_machine_check(struct kvm_vcpu *vcpu, int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue) + const struct kvm_irq_routing_entry *ue, + unsigned plane_level) { const struct kvm_irq_routing_s390_adapter *adapter; u64 uaddr_s, uaddr_i; diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index b7e08eddb765..d2ecfd54d57a 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -295,7 +295,8 @@ bool kvm_arch_can_set_irq_routing(struct kvm *kvm) int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue) + const struct kvm_irq_routing_entry *ue, + unsigned plane_level) { /* We can't check irqchip_in_kernel() here as some callers are * currently initializing the irqchip. Other callers should therefore @@ -304,7 +305,7 @@ int kvm_set_routing_entry(struct kvm *kvm, switch (ue->type) { #ifdef CONFIG_KVM_IOAPIC case KVM_IRQ_ROUTING_IRQCHIP: - if (irqchip_split(kvm)) + if (irqchip_split(kvm) || plane_level != 0) return -EINVAL; e->irqchip.pin = ue->u.irqchip.pin; switch (ue->u.irqchip.irqchip) { @@ -332,7 +333,7 @@ int kvm_set_routing_entry(struct kvm *kvm, e->msi.address_lo = ue->u.msi.address_lo; e->msi.address_hi = ue->u.msi.address_hi; e->msi.data = ue->u.msi.data; - e->msi.plane_level = 0; + e->msi.plane_level = plane_level; if (kvm_msi_route_invalid(kvm, e)) return -EINVAL; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 16dcca3132d3..cfb6911d6771 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -2355,7 +2355,8 @@ int kvm_set_irq_routing(struct kvm *kvm, int kvm_init_irq_routing(struct kvm *kvm); int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, - const struct kvm_irq_routing_entry *ue); + const struct kvm_irq_routing_entry *ue, + unsigned plane_level); void kvm_free_irq_routing(struct kvm *kvm); #else diff --git a/virt/kvm/irqchip.c b/virt/kvm/irqchip.c index ae47e56176f1..14480d1df4f9 100644 --- a/virt/kvm/irqchip.c +++ b/virt/kvm/irqchip.c @@ -146,7 +146,7 @@ static int setup_routing_entry(struct kvm *kvm, e->gsi = gsi; e->type = ue->type; - r = kvm_set_routing_entry(kvm, e, ue); + r = kvm_set_routing_entry(kvm, e, ue, 0); if (r) return r; if (e->type == KVM_IRQ_ROUTING_IRQCHIP) -- 2.53.0
