API kvm_vcpu_ioctl_interrupt() is mainly to used to deliver interrupt
from user mode, and internal APIs kvm_queue_irq() and kvm_dequeue_irq()
are used in kernel mode.

Also this patch removes unnecessary printk information with inject
unsupported interrupt with number 0.

Signed-off-by: Bibo Mao <[email protected]>
---
 arch/loongarch/kvm/intc/dmsintc.c |  7 ++++---
 arch/loongarch/kvm/intc/eiointc.c |  8 +++++---
 arch/loongarch/kvm/intc/ipi.c     | 10 ++++------
 arch/loongarch/kvm/vcpu.c         |  4 +---
 4 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/arch/loongarch/kvm/intc/dmsintc.c 
b/arch/loongarch/kvm/intc/dmsintc.c
index de25735ce039..a726c6cafec3 100644
--- a/arch/loongarch/kvm/intc/dmsintc.c
+++ b/arch/loongarch/kvm/intc/dmsintc.c
@@ -47,7 +47,6 @@ void dmsintc_inject_irq(struct kvm_vcpu *vcpu)
 int dmsintc_deliver_msi_to_vcpu(struct kvm *kvm,
                                struct kvm_vcpu *vcpu, u32 vector, int level)
 {
-       struct kvm_interrupt vcpu_irq;
        struct dmsintc_state *ds = &vcpu->arch.dmsintc_state;
 
        if (!level)
@@ -57,9 +56,11 @@ int dmsintc_deliver_msi_to_vcpu(struct kvm *kvm,
        if (!ds)
                return -ENODEV;
 
-       vcpu_irq.irq = INT_AVEC;
+       if (!kvm_guest_has_msgint(&vcpu->arch))
+               return -EINVAL;
+
        set_bit(vector, (unsigned long *)&ds->vector_map);
-       kvm_vcpu_ioctl_interrupt(vcpu, &vcpu_irq);
+       kvm_queue_irq(vcpu, INT_AVEC);
        kvm_vcpu_kick(vcpu);
 
        return 0;
diff --git a/arch/loongarch/kvm/intc/eiointc.c 
b/arch/loongarch/kvm/intc/eiointc.c
index 2ab7fafa86d5..63f917de7903 100644
--- a/arch/loongarch/kvm/intc/eiointc.c
+++ b/arch/loongarch/kvm/intc/eiointc.c
@@ -36,7 +36,6 @@ static void eiointc_update_irq(struct loongarch_eiointc *s, 
int irq, int level)
 {
        int ipnum, cpu, found;
        struct kvm_vcpu *vcpu;
-       struct kvm_interrupt vcpu_irq;
 
        ipnum = (s->ipmap >> (irq / 32 * 8)) & 0xff;
        if (!(s->status & BIT(EIOINTC_ENABLE_INT_ENCODE))) {
@@ -67,8 +66,11 @@ static void eiointc_update_irq(struct loongarch_eiointc *s, 
int irq, int level)
        if (found < EIOINTC_IRQS)
                return; /* other irq is handling, needn't update parent irq */
 
-       vcpu_irq.irq = level ? (INT_HWI0 + ipnum) : -(INT_HWI0 + ipnum);
-       kvm_vcpu_ioctl_interrupt(vcpu, &vcpu_irq);
+       if (level)
+               kvm_queue_irq(vcpu, INT_HWI0 + ipnum);
+       else
+               kvm_dequeue_irq(vcpu, INT_HWI0 + ipnum);
+       kvm_vcpu_kick(vcpu);
 }
 
 static inline void eiointc_update_sw_coremap(struct loongarch_eiointc *s,
diff --git a/arch/loongarch/kvm/intc/ipi.c b/arch/loongarch/kvm/intc/ipi.c
index 1f6ebbd0af5c..ab3d894eb146 100644
--- a/arch/loongarch/kvm/intc/ipi.c
+++ b/arch/loongarch/kvm/intc/ipi.c
@@ -10,15 +10,14 @@
 static void ipi_set(struct kvm_vcpu *vcpu, uint32_t data)
 {
        uint32_t status;
-       struct kvm_interrupt irq;
 
        spin_lock(&vcpu->arch.ipi_state.lock);
        status = vcpu->arch.ipi_state.status;
        vcpu->arch.ipi_state.status |= data;
        spin_unlock(&vcpu->arch.ipi_state.lock);
        if ((status == 0) && data) {
-               irq.irq = LARCH_INT_IPI;
-               kvm_vcpu_ioctl_interrupt(vcpu, &irq);
+               kvm_queue_irq(vcpu, LARCH_INT_IPI);
+               kvm_vcpu_kick(vcpu);
        }
 }
 
@@ -40,15 +39,14 @@ static void ipi_send(struct kvm *kvm, uint64_t data)
 static void ipi_clear(struct kvm_vcpu *vcpu, uint64_t data)
 {
        uint32_t status;
-       struct kvm_interrupt irq;
 
        spin_lock(&vcpu->arch.ipi_state.lock);
        vcpu->arch.ipi_state.status &= ~data;
        status = vcpu->arch.ipi_state.status;
        spin_unlock(&vcpu->arch.ipi_state.lock);
        if (status == 0) {
-               irq.irq = -LARCH_INT_IPI;
-               kvm_vcpu_ioctl_interrupt(vcpu, &irq);
+               kvm_dequeue_irq(vcpu, LARCH_INT_IPI);
+               kvm_vcpu_kick(vcpu);
        }
 }
 
diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c
index e28084c49e68..bd90be3f498b 100644
--- a/arch/loongarch/kvm/vcpu.c
+++ b/arch/loongarch/kvm/vcpu.c
@@ -1492,10 +1492,8 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, 
struct kvm_interrupt *irq)
                kvm_queue_irq(vcpu, intr);
        else if (intr < 0)
                kvm_dequeue_irq(vcpu, -intr);
-       else {
-               kvm_err("%s: invalid interrupt ioctl %d\n", __func__, irq->irq);
+       else
                return -EINVAL;
-       }
 
        kvm_vcpu_kick(vcpu);
 

base-commit: 0e0611827f3349d0a2ac121c023a6d3260dcecdb
-- 
2.39.3


Reply via email to