From f9936cadc1741e993707545d35acb47e5dce1d47 Mon Sep 17 00:00:00 2001 From: xianglai li Date: Tue, 4 Jul 2023 20:08:48 +0800 Subject: [PATCH] loongarch/kvm: Fixed extioi hardware emulation bugs LoongArch inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I7QOYY ------------------------------------------ When the extioi controller is enabled, the data in the extioi controller should not be emptied.Otherwise, the interrupt triggered when kdump re-enters the kernel will cause the register state in the extioi controller to be inconsistent with the ESTAT register state after extioi is enabled, and finally cause the extended interrupt to be triggered all the time. Signed-off-by: xianglai li (cherry picked from commit 99bf1b35d381b6d20fdbb6a09871aa55fa173d64) --- arch/loongarch/kvm/csr.c | 5 ----- arch/loongarch/kvm/intc/ls3a_ext_irq.c | 21 ++------------------- arch/loongarch/kvm/intc/ls3a_ext_irq.h | 2 -- arch/loongarch/kvm/loongarch.c | 2 +- 4 files changed, 3 insertions(+), 27 deletions(-) diff --git a/arch/loongarch/kvm/csr.c b/arch/loongarch/kvm/csr.c index 09ec781fe79a..0c42cbb9c739 100644 --- a/arch/loongarch/kvm/csr.c +++ b/arch/loongarch/kvm/csr.c @@ -347,8 +347,6 @@ static int kvm_iocsr_common_set(struct kvm_run *run, struct kvm_vcpu *vcpu, static int kvm_misc_set(struct kvm_run *run, struct kvm_vcpu *vcpu, u32 addr, u64 val) { - if ((val & KVM_IOCSRF_MISC_FUNC_EXT_IOI_EN) && vcpu->vcpu_id == 0) - kvm_setup_ls3a_extirq(vcpu->kvm); return kvm_iocsr_common_set(run, vcpu, addr, val); } @@ -653,9 +651,6 @@ int _kvm_set_iocsr(struct kvm *kvm, struct kvm_iocsr_entry *__user argp) } spin_unlock(&kvm->arch.iocsr_lock); - if (tmp.addr == KVM_IOCSR_MISC_FUNC) - kvm_enable_ls3a_extirq(kvm, tmp.data & KVM_IOCSRF_MISC_FUNC_EXT_IOI_EN); - out: return r; } diff --git a/arch/loongarch/kvm/intc/ls3a_ext_irq.c b/arch/loongarch/kvm/intc/ls3a_ext_irq.c index 33e8b45a3532..ad612661d36b 100644 --- a/arch/loongarch/kvm/intc/ls3a_ext_irq.c +++ b/arch/loongarch/kvm/intc/ls3a_ext_irq.c @@ -110,9 +110,6 @@ void msi_irq_handler(struct kvm *kvm, int irq, int level) struct ls3a_kvm_extirq *s = ls3a_ext_irqchip(kvm); struct kvm_ls3a_extirq_state *state = &(s->ls3a_ext_irq); - if (!atomic64_read(&s->enabled)) - return; - kvm_debug("ext_irq_handler:irq = %d,level = %d\n", irq, level); ls3a_ext_irq_lock(s, flags); @@ -731,7 +728,6 @@ int kvm_create_ls3a_ext_irq(struct kvm *kvm) memset((void *)&s->ls3a_ext_irq, 0x0, sizeof(struct kvm_ls3a_extirq_state)); spin_lock_init(&s->lock); - atomic64_set(&s->enabled, 0); s->kvm = kvm; /* @@ -872,18 +868,6 @@ int kvm_setup_ls3a_extirq(struct kvm *kvm) memset(extirq_state, 0, sizeof(struct kvm_ls3a_extirq_state)); ls3a_ext_irq_unlock(v_extirq, flags); - atomic64_set(&v_extirq->enabled, 1); - - return 0; -} - -int kvm_enable_ls3a_extirq(struct kvm *kvm, bool enable) -{ - struct ls3a_kvm_extirq *v_extirq = ls3a_ext_irqchip(kvm); - - if (v_extirq) - atomic64_set(&v_extirq->enabled, enable); - return 0; } @@ -891,7 +875,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s, struct ls3a_kvm_extirq *irqchip) { struct kvm_ls3a_extirq_state *extirq; - int i = 0, j = 0; + int i, j = 0; unsigned long flags; seq_puts(s, "LS3A ext irqchip state:\n"); @@ -901,8 +885,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s, extirq = &(irqchip->ls3a_ext_irq); ls3a_ext_irq_lock(irqchip, flags); - i = (int)atomic64_read(&irqchip->enabled); - seq_printf(s, "ext irq enabled:%d", i); + seq_puts(s, "ext irq enabled"); seq_puts(s, "\nenabled:(Not Enabled)"); for (i = 0; i < EXTIOI_IRQS; i++) { if (!test_bit(i, (void *)&extirq->ext_en)) diff --git a/arch/loongarch/kvm/intc/ls3a_ext_irq.h b/arch/loongarch/kvm/intc/ls3a_ext_irq.h index 62fa06239b28..f834527b1370 100644 --- a/arch/loongarch/kvm/intc/ls3a_ext_irq.h +++ b/arch/loongarch/kvm/intc/ls3a_ext_irq.h @@ -98,7 +98,6 @@ typedef struct kvm_ls3a_extirq_state { struct ls3a_kvm_extirq { spinlock_t lock; struct kvm *kvm; - atomic64_t enabled; struct kvm_io_device device; struct kvm_ls3a_extirq_state ls3a_ext_irq; }; @@ -126,6 +125,5 @@ int kvm_set_ls3a_extirq(struct kvm *kvm, void kvm_destroy_ls3a_ext_irq(struct kvm *kvm); void msi_irq_handler(struct kvm *kvm, int irq, int level); int kvm_setup_ls3a_extirq(struct kvm *kvm); -int kvm_enable_ls3a_extirq(struct kvm *kvm, bool enable); void kvm_dump_ls3a_extirq_state(struct seq_file *m, struct ls3a_kvm_extirq *irqchip); #endif diff --git a/arch/loongarch/kvm/loongarch.c b/arch/loongarch/kvm/loongarch.c index 15b45d8ffb8c..01e28c05ac11 100644 --- a/arch/loongarch/kvm/loongarch.c +++ b/arch/loongarch/kvm/loongarch.c @@ -979,7 +979,7 @@ static int _kvm_set_one_reg(struct kvm_vcpu *vcpu, case KVM_REG_LOONGARCH_VCPU_RESET: kvm_reset_timer(vcpu); if (vcpu->vcpu_id == 0) - kvm_enable_ls3a_extirq(vcpu->kvm, false); + kvm_setup_ls3a_extirq(vcpu->kvm); memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending)); memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear)); -- Gitee