Re: [PATCH 1/2] LoongArch: KVM: Remove parameter line when inject MSI

From: Huacai Chen

Date: Sat Sep 19 2026 - 10:16:45 EST


Hi, Bibo,

On Wed, Sep 9, 2026 at 4:40 PM Bibo Mao <maobibo@xxxxxxxxxxx> wrote:
>
> With MSI interrupt, there is intterupt set injection, no interrupt
> clear action. DMSI interrupt controller is specially for MSI irqchip.
> And there is checking with parameter level in most upper function
> kvm_set_msi() and kvm_arch_set_irq_inatomic() already, here remove
> duplicated line parameter checking in MSI injection leaf functions.
>
> Signed-off-by: Bibo Mao <maobibo@xxxxxxxxxxx>
> ---
> arch/loongarch/include/asm/kvm_dmsintc.h | 3 +--
> arch/loongarch/include/asm/kvm_pch_pic.h | 2 +-
> arch/loongarch/kvm/intc/dmsintc.c | 9 +++------
> arch/loongarch/kvm/intc/pch_pic.c | 6 +++---
> arch/loongarch/kvm/irqfd.c | 6 +++---
> 5 files changed, 11 insertions(+), 15 deletions(-)
>
> diff --git a/arch/loongarch/include/asm/kvm_dmsintc.h b/arch/loongarch/include/asm/kvm_dmsintc.h
> index 7c0158764d84..e19b3f5b3c52 100644
> --- a/arch/loongarch/include/asm/kvm_dmsintc.h
> +++ b/arch/loongarch/include/asm/kvm_dmsintc.h
> @@ -22,7 +22,6 @@ struct dmsintc_state {
> int kvm_loongarch_register_dmsintc_device(void);
> void kvm_loongarch_unregister_dmsintc_device(void);
> void dmsintc_inject_irq(struct kvm_vcpu *vcpu);
> -int dmsintc_set_irq(struct kvm *kvm, u64 addr, int data, int level);
> -int dmsintc_deliver_msi_to_vcpu(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 vector, int level);
> +int dmsintc_set_irq(struct kvm *kvm, u64 addr, int data);
>
> #endif
> diff --git a/arch/loongarch/include/asm/kvm_pch_pic.h b/arch/loongarch/include/asm/kvm_pch_pic.h
> index 887b0431fd20..19ed1494c114 100644
> --- a/arch/loongarch/include/asm/kvm_pch_pic.h
> +++ b/arch/loongarch/include/asm/kvm_pch_pic.h
> @@ -72,6 +72,6 @@ struct kvm_kernel_irq_routing_entry;
> int kvm_loongarch_register_pch_pic_device(void);
> void kvm_loongarch_unregister_pch_pic_device(void);
> void pch_pic_set_irq(struct loongarch_pch_pic *s, int irq, int level);
> -int pch_msi_set_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, int level);
> +int pch_msi_set_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e);
>
> #endif /* __ASM_KVM_PCH_PIC_H */
> diff --git a/arch/loongarch/kvm/intc/dmsintc.c b/arch/loongarch/kvm/intc/dmsintc.c
> index 89f980d867be..79e56e330aeb 100644
> --- a/arch/loongarch/kvm/intc/dmsintc.c
> +++ b/arch/loongarch/kvm/intc/dmsintc.c
> @@ -43,13 +43,10 @@ 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)
> +static int dmsintc_deliver_msi_to_vcpu(struct kvm_vcpu *vcpu, u32 vector)
> {
> struct dmsintc_state *ds = &vcpu->arch.dmsintc_state;
>
> - if (!level)
> - return 0;
> if (!vcpu || vector >= 256)
> return -EINVAL;
> if (!ds)
> @@ -65,7 +62,7 @@ int dmsintc_deliver_msi_to_vcpu(struct kvm *kvm,
> return 0;
> }
>
> -int dmsintc_set_irq(struct kvm *kvm, u64 addr, int data, int level)
> +int dmsintc_set_irq(struct kvm *kvm, u64 addr, int data)
> {
> unsigned int irq, cpu;
> struct kvm_vcpu *vcpu;
> @@ -78,7 +75,7 @@ int dmsintc_set_irq(struct kvm *kvm, u64 addr, int data, int level)
> if (!vcpu)
> return -EINVAL;
>
> - return dmsintc_deliver_msi_to_vcpu(kvm, vcpu, irq, level);
> + return dmsintc_deliver_msi_to_vcpu(vcpu, irq);
> }
>
> static int kvm_dmsintc_ctrl_access(struct kvm_device *dev,
> diff --git a/arch/loongarch/kvm/intc/pch_pic.c b/arch/loongarch/kvm/intc/pch_pic.c
> index 2b63b0c2c7ce..220fc23ffe8c 100644
> --- a/arch/loongarch/kvm/intc/pch_pic.c
> +++ b/arch/loongarch/kvm/intc/pch_pic.c
> @@ -68,20 +68,20 @@ void pch_pic_set_irq(struct loongarch_pch_pic *s, int irq, int level)
> }
>
> /* msi irq handler */
> -int pch_msi_set_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, int level)
> +int pch_msi_set_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e)
> {
> u64 msg_addr = (((u64)e->msi.address_hi) << 32) | e->msi.address_lo;
>
> if (cpu_has_msgint && kvm->arch.dmsintc &&
> msg_addr >= kvm->arch.dmsintc->msg_addr_base &&
> msg_addr < (kvm->arch.dmsintc->msg_addr_base + kvm->arch.dmsintc->msg_addr_size)) {
> - return dmsintc_set_irq(kvm, msg_addr, e->msi.data, level);
> + return dmsintc_set_irq(kvm, msg_addr, e->msi.data);
> }
>
> if (e->msi.data >= EIOINTC_IRQS)
> return -EINVAL;
>
> - eiointc_set_irq(kvm->arch.eiointc, e->msi.data, level);
> + eiointc_set_irq(kvm->arch.eiointc, e->msi.data, 1);
>
> return 0;
> }
> diff --git a/arch/loongarch/kvm/irqfd.c b/arch/loongarch/kvm/irqfd.c
> index 40ed1081c4b6..686097ca5906 100644
> --- a/arch/loongarch/kvm/irqfd.c
> +++ b/arch/loongarch/kvm/irqfd.c
> @@ -27,9 +27,9 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
> struct kvm *kvm, int irq_source_id, int level, bool line_status)
> {
> if (!level)
> - return -1;
> + return -EINVAL;
>
> - return pch_msi_set_irq(kvm, e, level);
> + return pch_msi_set_irq(kvm, e);
> }
>
> /*
> @@ -78,7 +78,7 @@ int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
> pch_pic_set_irq(kvm->arch.pch_pic, e->irqchip.pin, level);
> return 0;
> case KVM_IRQ_ROUTING_MSI:
> - return pch_msi_set_irq(kvm, e, level);
> + return pch_msi_set_irq(kvm, e);
Please also consider the KVM_IRQ_ROUTING_IRQCHIP case. If
pch_pic_set_irq() also doesn't need level, please remove it; if
pch_pic_set_irq() needs level, please move the checking from head to
the KVM_IRQ_ROUTING_MSI case.


Huacai

> default:
> return -EWOULDBLOCK;
> }
> --
> 2.39.3
>