From nobody Sat Jul 25 20:08:11 2026 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BA04F3F4100; Tue, 14 Jul 2026 07:32:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014366; cv=none; b=sdm37E4hR0s/SMY1r5w0BIM31wvH3vZ1z7mcBiy0rl/W4kxqDblqr7Ykgg84VRX+X+UdKqMHPmbolEr0GmuTo0KJ6Y2Fn3+FEvPOuatYh9mXo4CcjpZDeAwfi/nViUdZ9t+v0yXCwMxctaiMPabl6gGZeJnydaKF5DxKjiGczDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014366; c=relaxed/simple; bh=5QuXQTRY9zoxb7Rfm/SQ7/4XLEGBNHIPI5V1y8znjfs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rAXqoX913DUvzGRwXwMelyajsSl9/jlJqtz+t8XvCifEAkJZvUjDIzTf3pMfiXytC+QsqvO1VFgeDRTj62L9GDHvPd+VG3qqxuAC1b6uwJ1oyVeObZCHnxnUnw/YoJBXHq4XmgRm3dzH1TEJMG8gSsMhMyXFb/fvmLvxPO2luWs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.2.5.213]) by gateway (Coremail) with SMTP id _____8DxOOsa5lVqqVMDAA--.13445S3; Tue, 14 Jul 2026 15:32:42 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.213]) by front1 (Coremail) with SMTP id qMiowJCxIuQT5lVqzZEMAA--.38917S3; Tue, 14 Jul 2026 15:32:42 +0800 (CST) From: Bibo Mao To: Huacai Chen Cc: Song Gao , kvm@vger.kernel.org, loongarch@lists.linux.dev, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v5 1/5] LoongArch: KVM: Fix uninitialized stack variable issue with dmsintc Date: Tue, 14 Jul 2026 15:25:16 +0800 Message-Id: <20260714072520.2745942-2-maobibo@loongson.cn> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20260714072520.2745942-1-maobibo@loongson.cn> References: <20260714072520.2745942-1-maobibo@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJCxIuQT5lVqzZEMAA--.38917S3 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Content-Type: text/plain; charset="utf-8" Variable vector[] is declared on stack in function dmsintc_inject_irq() and sometimes it is used without initialized. Here fix this issue. Fixes: 03de5eecb0f0 ("LoongArch: KVM: Add DMSINTC inject msi to vCPU") Cc: stable@vger.kernel.org Signed-off-by: Bibo Mao --- arch/loongarch/kvm/intc/dmsintc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/loongarch/kvm/intc/dmsintc.c b/arch/loongarch/kvm/intc/dm= sintc.c index de25735ce039..0a8492c4394c 100644 --- a/arch/loongarch/kvm/intc/dmsintc.c +++ b/arch/loongarch/kvm/intc/dmsintc.c @@ -21,6 +21,8 @@ void dmsintc_inject_irq(struct kvm_vcpu *vcpu) old =3D atomic64_read(&(ds->vector_map[i])); if (old) vector[i] =3D atomic64_xchg(&(ds->vector_map[i]), 0); + else + vector[i] =3D 0; } =20 if (vector[0]) { --=20 2.39.3 From nobody Sat Jul 25 20:08:11 2026 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DBFD93F4107; Tue, 14 Jul 2026 07:32:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014366; cv=none; b=Fm5tekVk+euWlL1RSBMFnooqH1aHbLL2sVID3iQCpi54iDzM/3me+wwvjVwuHGx4KmIw6C9xd0H4Oxidut0FBphS5KrUtHfw8Bf/T70C6KGP+xq+ITJsuR4NicdjzKfCO2HdYYsRgIaLpdO4US0k64N+1Mkb8ky7NF1zj0uFD2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014366; c=relaxed/simple; bh=O0PYKArdyd0ZTgrp+9S9jfX/yUyb+wlnAvv2d8vvLeU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Gt5i1qRkgXU9IIxbn/XGZQe82xkq8QcuJOG2Iyxp3RQPTOFCrkLMPtXls/J7E1l0iSO4EEBn+++2FOOP1wPDPqdm1w/uuqh9d+J4IJZbL1EnSyDhtFcc7QXlEFaqFVWR+F3nM/1PtnwarwQiemqIBXRPqK/7W5xsJlPOTpt2+s8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.2.5.213]) by gateway (Coremail) with SMTP id _____8AxSesa5lVqrFMDAA--.13305S3; Tue, 14 Jul 2026 15:32:42 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.213]) by front1 (Coremail) with SMTP id qMiowJCxIuQT5lVqzZEMAA--.38917S4; Tue, 14 Jul 2026 15:32:42 +0800 (CST) From: Bibo Mao To: Huacai Chen Cc: Song Gao , kvm@vger.kernel.org, loongarch@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v5 2/5] LoongArch: KVM: Return directly when IPI address is not aligned Date: Tue, 14 Jul 2026 15:25:17 +0800 Message-Id: <20260714072520.2745942-3-maobibo@loongson.cn> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20260714072520.2745942-1-maobibo@loongson.cn> References: <20260714072520.2745942-1-maobibo@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJCxIuQT5lVqzZEMAA--.38917S4 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Content-Type: text/plain; charset="utf-8" When IPI address is not aligned with its access size, it should return directly in read/write operations, rather than only print WARN_ON_ONCE(). The method is the same with in kernel extioi and pch_pic operations. Signed-off-by: Bibo Mao --- arch/loongarch/kvm/intc/ipi.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/arch/loongarch/kvm/intc/ipi.c b/arch/loongarch/kvm/intc/ipi.c index 4fa0897d7bdb..928f9bd5e1f1 100644 --- a/arch/loongarch/kvm/intc/ipi.c +++ b/arch/loongarch/kvm/intc/ipi.c @@ -186,9 +186,13 @@ static int loongarch_ipi_readl(struct kvm_vcpu *vcpu, = gpa_t addr, int len, void uint32_t offset; uint64_t res =3D 0; =20 - offset =3D (uint32_t)(addr & 0x1ff); - WARN_ON_ONCE(offset & (len - 1)); + if (addr & (len - 1)) { + *(uint64_t *)val =3D res; + kvm_pr_unimpl("%s: ipi not aligned addr %llx len %d\n", __func__, addr, = len); + return 0; + } =20 + offset =3D addr - IOCSR_IPI_BASE; switch (offset) { case IOCSR_IPI_STATUS: spin_lock(&vcpu->arch.ipi_state.lock); @@ -204,11 +208,6 @@ static int loongarch_ipi_readl(struct kvm_vcpu *vcpu, = gpa_t addr, int len, void case IOCSR_IPI_CLEAR: break; case IOCSR_IPI_BUF_20 ... IOCSR_IPI_BUF_38 + 7: - if (offset + len > IOCSR_IPI_BUF_38 + 8) { - kvm_err("%s: invalid offset or len: offset =3D %d, len =3D %d\n", - __func__, offset, len); - break; - } res =3D read_mailbox(vcpu, offset, len); break; default: @@ -227,9 +226,12 @@ static int loongarch_ipi_writel(struct kvm_vcpu *vcpu,= gpa_t addr, int len, cons =20 data =3D *(uint64_t *)val; =20 - offset =3D (uint32_t)(addr & 0x1ff); - WARN_ON_ONCE(offset & (len - 1)); + if (addr & (len - 1)) { + kvm_pr_unimpl("%s: ipi not aligned addr %llx len %d\n", __func__, addr, = len); + return 0; + } =20 + offset =3D addr - IOCSR_IPI_BASE; switch (offset) { case IOCSR_IPI_STATUS: break; --=20 2.39.3 From nobody Sat Jul 25 20:08:11 2026 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 24A2E3F4139; Tue, 14 Jul 2026 07:32:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014366; cv=none; b=C0p4fCLhN6vIlC7yXR8wOdNrVaEM97vFH7Xz6QKomknT4YCmULg9FpCGe/7ln0Pp7Mpp9BQPUpH0/Bi33nEtMEBOWANy3zuUMudRztXV/qQBS1xAF4SFQ+DlHeZTCz+Oqe14EF1fYNlVJ19g3tZVF3s8ktLraW/mY+TO+5ruOHQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014366; c=relaxed/simple; bh=Wz6SHYMnyGJZn88lQLhnNjm4J5XHoJdBKLom6lEuXZI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=UB7pdk6ttlUMEr9b0UNdlM2B3WuVCE+5yUiFA+d2OXt2oLrD8123r/b3vLOeHZOrNRpE9GZlx3qPsSljjKI2PDoTOQc8N29FDaG8Z85lNEoVSRHgIL1V26s1uLl3TInhRqE17KXGC+o9IqzQEzTpAQueG4c7Q9Lfn7jpZDUxMrs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.2.5.213]) by gateway (Coremail) with SMTP id _____8Cxqusa5lVqr1MDAA--.13493S3; Tue, 14 Jul 2026 15:32:42 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.213]) by front1 (Coremail) with SMTP id qMiowJCxIuQT5lVqzZEMAA--.38917S5; Tue, 14 Jul 2026 15:32:42 +0800 (CST) From: Bibo Mao To: Huacai Chen Cc: Song Gao , kvm@vger.kernel.org, loongarch@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v5 3/5] LoongArch: KVM: Set default MAILBOX access size with 8 Date: Tue, 14 Jul 2026 15:25:18 +0800 Message-Id: <20260714072520.2745942-4-maobibo@loongson.cn> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20260714072520.2745942-1-maobibo@loongson.cn> References: <20260714072520.2745942-1-maobibo@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJCxIuQT5lVqzZEMAA--.38917S5 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Content-Type: text/plain; charset="utf-8" With IOCSR instruction emulation in function kvm_emu_iocsr(), the possible size combination is 1/2/4/8 and no other combinations. Here remove the old default case and replace the default case with 8 in read_mailbox() and write_mailbox(). Signed-off-by: Bibo Mao --- arch/loongarch/kvm/intc/ipi.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/arch/loongarch/kvm/intc/ipi.c b/arch/loongarch/kvm/intc/ipi.c index 928f9bd5e1f1..3871a6953a64 100644 --- a/arch/loongarch/kvm/intc/ipi.c +++ b/arch/loongarch/kvm/intc/ipi.c @@ -67,11 +67,8 @@ static uint64_t read_mailbox(struct kvm_vcpu *vcpu, int = offset, int len) return data & 0xffff; case 4: return data & 0xffffffff; - case 8: - return data; default: - kvm_err("%s: unknown data len: %d\n", __func__, len); - return 0; + return data; } } =20 @@ -92,11 +89,9 @@ static void write_mailbox(struct kvm_vcpu *vcpu, int off= set, uint64_t data, int case 4: *(unsigned int *)pbuf =3D (unsigned int)data; break; - case 8: + default: *(unsigned long *)pbuf =3D (unsigned long)data; break; - default: - kvm_err("%s: unknown data len: %d\n", __func__, len); } spin_unlock(&vcpu->arch.ipi_state.lock); } --=20 2.39.3 From nobody Sat Jul 25 20:08:11 2026 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7A4AE3EE1F2; Tue, 14 Jul 2026 07:32:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014377; cv=none; b=kZG/q4HZMOdWEALUUmyGTnIde2fKar3VukWzTcntohbsuVLfYZ0chkqYb1cHGrYsTJZhvM8zADgT7SpbxJrwHadtmSMWR1d/2BDYM8vDLeuh+vRugjP+LnAVPUCpZm/z6RdLiUG7ftF61wrncxoEFO3XwZeLXd2srZ6KlRbARq8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014377; c=relaxed/simple; bh=9+Vrf0zxODhPAw72O6FMfV6E856KSa87aJuBRPD0088=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JMxd0SMTDpaWC1mkoPMvU+wqTdui5q8xuP1+FaeKzthLO0jrB+zNEzbIXlOYCNwwiu1V5+LpSUCthCVJUJUGxQsZvlOq4m94juNa7xXiGu2oiveBAN3+9v/UrThDSiXKfVYpjnpaq//oV0IPhUrjNXjFnOyA0JGQODHmh9Ie2nI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.2.5.213]) by gateway (Coremail) with SMTP id _____8CxZeol5lVqs1MDAA--.12017S3; Tue, 14 Jul 2026 15:32:53 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.213]) by front1 (Coremail) with SMTP id qMiowJDxzMYc5lVq2JEMAA--.39266S2; Tue, 14 Jul 2026 15:32:45 +0800 (CST) From: Bibo Mao To: Huacai Chen Cc: Song Gao , kvm@vger.kernel.org, loongarch@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v5 4/5] LoongArch: KVM: Replace kvm_err() with kvm_pr_unimpl() Date: Tue, 14 Jul 2026 15:25:19 +0800 Message-Id: <20260714072520.2745942-5-maobibo@loongson.cn> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20260714072520.2745942-1-maobibo@loongson.cn> References: <20260714072520.2745942-1-maobibo@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJDxzMYc5lVq2JEMAA--.39266S2 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Content-Type: text/plain; charset="utf-8" Since guest kernel and ioctl parameter from user mode is untrusted, there may be noise kernel log output in host hypervisor with abnormal state. Here replace kvm_err() with kvm_pr_unimpl() to reduce this kind of noise kernel log, and there is no function change. Signed-off-by: Bibo Mao --- arch/loongarch/kvm/exit.c | 16 ++++++++-------- arch/loongarch/kvm/intc/dmsintc.c | 8 ++++---- arch/loongarch/kvm/intc/eiointc.c | 18 +++++++++--------- arch/loongarch/kvm/intc/ipi.c | 30 +++++++++++++++--------------- arch/loongarch/kvm/intc/pch_pic.c | 12 ++++++------ arch/loongarch/kvm/vcpu.c | 2 +- 6 files changed, 43 insertions(+), 43 deletions(-) diff --git a/arch/loongarch/kvm/exit.c b/arch/loongarch/kvm/exit.c index 8572b63478bb..590580d0303e 100644 --- a/arch/loongarch/kvm/exit.c +++ b/arch/loongarch/kvm/exit.c @@ -252,7 +252,7 @@ int kvm_complete_iocsr_read(struct kvm_vcpu *vcpu, stru= ct kvm_run *run) *gpr =3D *(s64 *)run->iocsr_io.data; break; default: - kvm_err("Bad IOCSR length: %d, addr is 0x%lx\n", + kvm_pr_unimpl("Bad IOCSR length: %d, addr is 0x%lx\n", run->iocsr_io.len, vcpu->arch.badv); er =3D EMULATE_FAIL; break; @@ -326,7 +326,7 @@ static int kvm_trap_handle_gspr(struct kvm_vcpu *vcpu) =20 /* Rollback PC only if emulation was unsuccessful */ if (er =3D=3D EMULATE_FAIL) { - kvm_err("[%#lx]%s: unsupported gspr instruction 0x%08x\n", + kvm_pr_unimpl("[%#lx]%s: unsupported gspr instruction 0x%08x\n", curr_pc, __func__, inst.word); =20 kvm_arch_vcpu_dump_regs(vcpu); @@ -491,7 +491,7 @@ int kvm_emu_mmio_read(struct kvm_vcpu *vcpu, larch_inst= inst) return EMULATE_DO_MMIO; } =20 - kvm_err("Read not supported Inst=3D0x%08x @%lx BadVaddr:%#lx\n", + kvm_pr_unimpl("Read not supported Inst=3D0x%08x @%lx BadVaddr:%#lx\n", inst.word, vcpu->arch.pc, vcpu->arch.badv); kvm_arch_vcpu_dump_regs(vcpu); vcpu->mmio_needed =3D 0; @@ -529,7 +529,7 @@ int kvm_complete_mmio_read(struct kvm_vcpu *vcpu, struc= t kvm_run *run) *gpr =3D *(s64 *)run->mmio.data; break; default: - kvm_err("Bad MMIO length: %d, addr is 0x%lx\n", + kvm_pr_unimpl("Bad MMIO length: %d, addr is 0x%lx\n", run->mmio.len, vcpu->arch.badv); er =3D EMULATE_FAIL; break; @@ -656,7 +656,7 @@ int kvm_emu_mmio_write(struct kvm_vcpu *vcpu, larch_ins= t inst) } =20 vcpu->arch.pc =3D curr_pc; - kvm_err("Write not supported Inst=3D0x%08x @%lx BadVaddr:%#lx\n", + kvm_pr_unimpl("Write not supported Inst=3D0x%08x @%lx BadVaddr:%#lx\n", inst.word, vcpu->arch.pc, vcpu->arch.badv); kvm_arch_vcpu_dump_regs(vcpu); /* Rollback PC if emulation was unsuccessful */ @@ -748,8 +748,8 @@ static int kvm_handle_fpu_disabled(struct kvm_vcpu *vcp= u, int ecode) * treated as a reserved instruction! * If FPU already in use, we shouldn't get this at all. */ - if (WARN_ON(vcpu->arch.aux_inuse & KVM_LARCH_FPU)) { - kvm_err("%s internal error\n", __func__); + if (vcpu->arch.aux_inuse & KVM_LARCH_FPU) { + kvm_pr_unimpl("%s internal error\n", __func__); run->exit_reason =3D KVM_EXIT_INTERNAL_ERROR; return RESUME_HOST; } @@ -943,7 +943,7 @@ static int kvm_fault_ni(struct kvm_vcpu *vcpu, int ecod= e) /* Fetch the instruction */ inst =3D vcpu->arch.badi; badv =3D vcpu->arch.badv; - kvm_err("ECode: %d PC=3D%#lx Inst=3D0x%08x BadVaddr=3D%#lx ESTAT=3D%#lx\n= ", + kvm_pr_unimpl("ECode: %d PC=3D%#lx Inst=3D0x%08x BadVaddr=3D%#lx ESTAT=3D= %#lx\n", ecode, vcpu->arch.pc, inst, badv, read_gcsr_estat()); kvm_arch_vcpu_dump_regs(vcpu); kvm_queue_exception(vcpu, EXCCODE_INE, 0); diff --git a/arch/loongarch/kvm/intc/dmsintc.c b/arch/loongarch/kvm/intc/dm= sintc.c index 0a8492c4394c..5797ef17cd71 100644 --- a/arch/loongarch/kvm/intc/dmsintc.c +++ b/arch/loongarch/kvm/intc/dmsintc.c @@ -116,7 +116,7 @@ static int kvm_dmsintc_ctrl_access(struct kvm_device *d= ev, } break; default: - kvm_err("%s: unknown dmsintc register, addr =3D %d\n", __func__, addr); + kvm_pr_unimpl("%s: unknown dmsintc register, addr =3D %d\n", __func__, a= ddr); return -ENXIO; } =20 @@ -130,7 +130,7 @@ static int kvm_dmsintc_set_attr(struct kvm_device *dev, case KVM_DEV_LOONGARCH_DMSINTC_GRP_CTRL: return kvm_dmsintc_ctrl_access(dev, attr, true); default: - kvm_err("%s: unknown group (%d)\n", __func__, attr->group); + kvm_pr_unimpl("%s: unknown group (%d)\n", __func__, attr->group); return -EINVAL; } } @@ -141,13 +141,13 @@ static int kvm_dmsintc_create(struct kvm_device *dev,= u32 type) struct loongarch_dmsintc *s; =20 if (!dev) { - kvm_err("%s: kvm_device ptr is invalid!\n", __func__); + kvm_pr_unimpl("%s: kvm_device ptr is invalid!\n", __func__); return -EINVAL; } =20 kvm =3D dev->kvm; if (kvm->arch.dmsintc) { - kvm_err("%s: LoongArch DMSINTC has already been created!\n", __func__); + kvm_pr_unimpl("%s: LoongArch DMSINTC has already been created!\n", __fun= c__); return -EINVAL; } =20 diff --git a/arch/loongarch/kvm/intc/eiointc.c b/arch/loongarch/kvm/intc/ei= ointc.c index 2b14485d14a7..fd089d54da10 100644 --- a/arch/loongarch/kvm/intc/eiointc.c +++ b/arch/loongarch/kvm/intc/eiointc.c @@ -47,7 +47,7 @@ static void eiointc_update_irq(struct loongarch_eiointc *= s, int irq, int level) cpu =3D s->sw_coremap[irq]; vcpu =3D kvm_get_vcpu_by_id(s->kvm, cpu); if (unlikely(vcpu =3D=3D NULL)) { - kvm_err("%s: invalid target cpu: %d\n", __func__, cpu); + kvm_pr_unimpl("%s: invalid target cpu: %d\n", __func__, cpu); return; } =20 @@ -165,12 +165,12 @@ static int kvm_eiointc_read(struct kvm_vcpu *vcpu, struct loongarch_eiointc *eiointc =3D vcpu->kvm->arch.eiointc; =20 if (!eiointc) { - kvm_err("%s: eiointc irqchip not valid!\n", __func__); + kvm_pr_unimpl("%s: eiointc irqchip not valid!\n", __func__); return 0; } =20 if (addr & (len - 1)) { - kvm_err("%s: eiointc not aligned addr %llx len %d\n", __func__, addr, le= n); + kvm_pr_unimpl("%s: eiointc not aligned addr %llx len %d\n", __func__, ad= dr, len); return 0; } =20 @@ -297,12 +297,12 @@ static int kvm_eiointc_write(struct kvm_vcpu *vcpu, struct loongarch_eiointc *eiointc =3D vcpu->kvm->arch.eiointc; =20 if (!eiointc) { - kvm_err("%s: eiointc irqchip not valid!\n", __func__); + kvm_pr_unimpl("%s: eiointc irqchip not valid!\n", __func__); return 0; } =20 if (addr & (len - 1)) { - kvm_err("%s: eiointc not aligned addr %llx len %d\n", __func__, addr, le= n); + kvm_pr_unimpl("%s: eiointc not aligned addr %llx len %d\n", __func__, ad= dr, len); return 0; } =20 @@ -345,7 +345,7 @@ static int kvm_eiointc_virt_read(struct kvm_vcpu *vcpu, struct loongarch_eiointc *eiointc =3D vcpu->kvm->arch.eiointc; =20 if (!eiointc) { - kvm_err("%s: eiointc irqchip not valid!\n", __func__); + kvm_pr_unimpl("%s: eiointc irqchip not valid!\n", __func__); return 0; } =20 @@ -375,7 +375,7 @@ static int kvm_eiointc_virt_write(struct kvm_vcpu *vcpu, struct loongarch_eiointc *eiointc =3D vcpu->kvm->arch.eiointc; =20 if (!eiointc) { - kvm_err("%s: eiointc irqchip not valid!\n", __func__); + kvm_pr_unimpl("%s: eiointc irqchip not valid!\n", __func__); return 0; } =20 @@ -502,7 +502,7 @@ static int kvm_eiointc_regs_access(struct kvm_device *d= ev, p =3D (void *)s->coremap + offset * 4; break; default: - kvm_err("%s: unknown eiointc register, addr =3D %d\n", __func__, addr); + kvm_pr_unimpl("%s: unknown eiointc register, addr =3D %d\n", __func__, a= ddr); return -EINVAL; } =20 @@ -546,7 +546,7 @@ static int kvm_eiointc_sw_status_access(struct kvm_devi= ce *dev, p =3D &s->status; break; default: - kvm_err("%s: unknown eiointc register, addr =3D %d\n", __func__, addr); + kvm_pr_unimpl("%s: unknown eiointc register, addr =3D %d\n", __func__, a= ddr); return -EINVAL; } spin_lock_irqsave(&s->lock, flags); diff --git a/arch/loongarch/kvm/intc/ipi.c b/arch/loongarch/kvm/intc/ipi.c index 3871a6953a64..0edaa124a61e 100644 --- a/arch/loongarch/kvm/intc/ipi.c +++ b/arch/loongarch/kvm/intc/ipi.c @@ -30,7 +30,7 @@ static void ipi_send(struct kvm *kvm, uint64_t data) cpu =3D ((data & 0xffffffff) >> 16) & 0x3ff; vcpu =3D kvm_get_vcpu_by_cpuid(kvm, cpu); if (unlikely(vcpu =3D=3D NULL)) { - kvm_err("%s: invalid target cpu: %d\n", __func__, cpu); + kvm_pr_unimpl("%s: invalid target cpu: %d\n", __func__, cpu); return; } =20 @@ -105,7 +105,7 @@ static int mail_send(struct kvm *kvm, uint64_t data) cpu =3D ((data & 0xffffffff) >> 16) & 0x3ff; vcpu =3D kvm_get_vcpu_by_cpuid(kvm, cpu); if (unlikely(vcpu =3D=3D NULL)) { - kvm_err("%s: invalid target cpu: %d\n", __func__, cpu); + kvm_pr_unimpl("%s: invalid target cpu: %d\n", __func__, cpu); return 0; } mailbox =3D ((data & 0xffffffff) >> 2) & 0x7; @@ -139,7 +139,7 @@ static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t a= ddr, uint64_t data) ret =3D kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr, 4, &val); srcu_read_unlock(&vcpu->kvm->srcu, idx); if (unlikely(ret)) { - kvm_err("%s: : read data from addr %llx failed\n", __func__, addr); + kvm_pr_unimpl("%s: : read data from addr %llx failed\n", __func__, addr= ); return 0; } /* Construct the mask by scanning the bit 27-30 */ @@ -155,7 +155,7 @@ static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t a= ddr, uint64_t data) ret =3D kvm_io_bus_write(vcpu, KVM_IOCSR_BUS, addr, 4, &val); srcu_read_unlock(&vcpu->kvm->srcu, idx); if (unlikely(ret)) - kvm_err("%s: : write data to addr %llx failed\n", __func__, addr); + kvm_pr_unimpl("%s: : write data to addr %llx failed\n", __func__, addr); =20 return 0; } @@ -168,7 +168,7 @@ static int any_send(struct kvm *kvm, uint64_t data) cpu =3D ((data & 0xffffffff) >> 16) & 0x3ff; vcpu =3D kvm_get_vcpu_by_cpuid(kvm, cpu); if (unlikely(vcpu =3D=3D NULL)) { - kvm_err("%s: invalid target cpu: %d\n", __func__, cpu); + kvm_pr_unimpl("%s: invalid target cpu: %d\n", __func__, cpu); return 0; } offset =3D data & 0xffff; @@ -206,7 +206,7 @@ static int loongarch_ipi_readl(struct kvm_vcpu *vcpu, g= pa_t addr, int len, void res =3D read_mailbox(vcpu, offset, len); break; default: - kvm_err("%s: unknown addr: %llx\n", __func__, addr); + kvm_pr_unimpl("%s: unknown addr: %llx\n", __func__, addr); break; } *(uint64_t *)val =3D res; @@ -244,7 +244,7 @@ static int loongarch_ipi_writel(struct kvm_vcpu *vcpu, = gpa_t addr, int len, cons break; case IOCSR_IPI_BUF_20 ... IOCSR_IPI_BUF_38 + 7: if (offset + len > IOCSR_IPI_BUF_38 + 8) { - kvm_err("%s: invalid offset or len: offset =3D %d, len =3D %d\n", + kvm_pr_unimpl("%s: invalid offset or len: offset =3D %d, len =3D %d\n", __func__, offset, len); break; } @@ -260,7 +260,7 @@ static int loongarch_ipi_writel(struct kvm_vcpu *vcpu, = gpa_t addr, int len, cons any_send(vcpu->kvm, data); break; default: - kvm_err("%s: unknown addr: %llx\n", __func__, addr); + kvm_pr_unimpl("%s: unknown addr: %llx\n", __func__, addr); break; } =20 @@ -303,7 +303,7 @@ static int kvm_ipi_regs_access(struct kvm_device *dev, =20 vcpu =3D kvm_get_vcpu_by_id(dev->kvm, cpu); if (unlikely(vcpu =3D=3D NULL)) { - kvm_err("%s: invalid target cpu: %d\n", __func__, cpu); + kvm_pr_unimpl("%s: invalid target cpu: %d\n", __func__, cpu); return -EINVAL; } =20 @@ -337,7 +337,7 @@ static int kvm_ipi_regs_access(struct kvm_device *dev, len =3D 8; break; default: - kvm_err("%s: unknown ipi register, addr =3D %d\n", __func__, addr); + kvm_pr_unimpl("%s: unknown ipi register, addr =3D %d\n", __func__, addr); return -EINVAL; } =20 @@ -371,7 +371,7 @@ static int kvm_ipi_get_attr(struct kvm_device *dev, case KVM_DEV_LOONGARCH_IPI_GRP_REGS: return kvm_ipi_regs_access(dev, attr, false); default: - kvm_err("%s: unknown group (%d)\n", __func__, attr->group); + kvm_pr_unimpl("%s: unknown group (%d)\n", __func__, attr->group); return -EINVAL; } } @@ -383,7 +383,7 @@ static int kvm_ipi_set_attr(struct kvm_device *dev, case KVM_DEV_LOONGARCH_IPI_GRP_REGS: return kvm_ipi_regs_access(dev, attr, true); default: - kvm_err("%s: unknown group (%d)\n", __func__, attr->group); + kvm_pr_unimpl("%s: unknown group (%d)\n", __func__, attr->group); return -EINVAL; } } @@ -396,13 +396,13 @@ static int kvm_ipi_create(struct kvm_device *dev, u32= type) struct loongarch_ipi *s; =20 if (!dev) { - kvm_err("%s: kvm_device ptr is invalid!\n", __func__); + kvm_pr_unimpl("%s: kvm_device ptr is invalid!\n", __func__); return -EINVAL; } =20 kvm =3D dev->kvm; if (kvm->arch.ipi) { - kvm_err("%s: LoongArch IPI has already been created!\n", __func__); + kvm_pr_unimpl("%s: LoongArch IPI has already been created!\n", __func__); return -EINVAL; } =20 @@ -422,7 +422,7 @@ static int kvm_ipi_create(struct kvm_device *dev, u32 t= ype) ret =3D kvm_io_bus_register_dev(kvm, KVM_IOCSR_BUS, IOCSR_IPI_BASE, IOCSR= _IPI_SIZE, device); mutex_unlock(&kvm->slots_lock); if (ret < 0) { - kvm_err("%s: Initialize IOCSR dev failed, ret =3D %d\n", __func__, ret); + kvm_pr_unimpl("%s: Initialize IOCSR dev failed, ret =3D %d\n", __func__,= ret); goto err; } =20 diff --git a/arch/loongarch/kvm/intc/pch_pic.c b/arch/loongarch/kvm/intc/pc= h_pic.c index 175a630aceb4..e7b77705c516 100644 --- a/arch/loongarch/kvm/intc/pch_pic.c +++ b/arch/loongarch/kvm/intc/pch_pic.c @@ -151,12 +151,12 @@ static int kvm_pch_pic_read(struct kvm_vcpu *vcpu, struct loongarch_pch_pic *s =3D vcpu->kvm->arch.pch_pic; =20 if (!s) { - kvm_err("%s: pch pic irqchip not valid!\n", __func__); + kvm_pr_unimpl("%s: pch pic irqchip not valid!\n", __func__); return ret; } =20 if (addr & (len - 1)) { - kvm_err("%s: pch pic not aligned addr %llx len %d\n", __func__, addr, le= n); + kvm_pr_unimpl("%s: pch pic not aligned addr %llx len %d\n", __func__, ad= dr, len); return ret; } =20 @@ -250,12 +250,12 @@ static int kvm_pch_pic_write(struct kvm_vcpu *vcpu, struct loongarch_pch_pic *s =3D vcpu->kvm->arch.pch_pic; =20 if (!s) { - kvm_err("%s: pch pic irqchip not valid!\n", __func__); + kvm_pr_unimpl("%s: pch pic irqchip not valid!\n", __func__); return ret; } =20 if (addr & (len - 1)) { - kvm_err("%s: pch pic not aligned addr %llx len %d\n", __func__, addr, le= n); + kvm_pr_unimpl("%s: pch pic not aligned addr %llx len %d\n", __func__, ad= dr, len); return ret; } =20 @@ -390,13 +390,13 @@ static int kvm_pch_pic_set_attr(struct kvm_device *de= v, return -EFAULT; =20 if (!dev->kvm->arch.pch_pic) { - kvm_err("%s: please create pch_pic irqchip first!\n", __func__); + kvm_pr_unimpl("%s: pch_pic irqchip not created\n", __func__); return -ENODEV; } =20 return kvm_pch_pic_init(dev, addr); default: - kvm_err("%s: unknown group (%d) attr (%lld)\n", __func__, attr->group, + kvm_pr_unimpl("%s: unknown group (%d) attr (%lld)\n", __func__, attr->g= roup, attr->attr); return -EINVAL; } diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c index 20c207d80e31..1a0cf6c81df6 100644 --- a/arch/loongarch/kvm/vcpu.c +++ b/arch/loongarch/kvm/vcpu.c @@ -1473,7 +1473,7 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, s= truct kvm_interrupt *irq) else if (intr < 0) kvm_dequeue_irq(vcpu, -intr); else { - kvm_err("%s: invalid interrupt ioctl %d\n", __func__, irq->irq); + kvm_pr_unimpl("%s: invalid interrupt ioctl %d\n", __func__, irq->irq); return -EINVAL; } =20 --=20 2.39.3 From nobody Sat Jul 25 20:08:11 2026 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 746533EFFD6; Tue, 14 Jul 2026 07:33:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014382; cv=none; b=fMjP5g2hAj6g72AatMjmjQnhHB/sbDrXujrlBsM963YkEnnRKrKi8qV30y+0M3dt79seREFIBzKKTvI5aGd6fkbTF6HBbigXuAwzVujbn/npaPloLEqGkHyvm8AoYwRNTWXqRw8cMw1Q6kFbtzRewW/pojrgt6zq25fPBqQe6vs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784014382; c=relaxed/simple; bh=iQhFXbRC9MJbbYxEM/pYnep0A3y6RnCmmB49YPcbs0k=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GoedpU+AwU9TDgLRItbNJxO00YU+hEVubQSQouRGtp9swSCplsWk7TW23FVaGV4f66Me10EWVsM0XU8FBzXwnHZcDiEzqVabnyT1DmWyB5L5JYpvO0oK1HuhzfgDfZ3fop1DwaDQSmJoMdeR2e9A4C8UW3hZU/2gFbDwqYoLBrY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.2.5.213]) by gateway (Coremail) with SMTP id _____8BxyvAr5lVquFMDAA--.13360S3; Tue, 14 Jul 2026 15:32:59 +0800 (CST) Received: from localhost.localdomain (unknown [10.2.5.213]) by front1 (Coremail) with SMTP id qMiowJDxzMYc5lVq2JEMAA--.39266S3; Tue, 14 Jul 2026 15:32:53 +0800 (CST) From: Bibo Mao To: Huacai Chen Cc: Song Gao , kvm@vger.kernel.org, loongarch@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v5 5/5] LoongArch: KVM: Use internal API to deliver interrupt in kernel mode Date: Tue, 14 Jul 2026 15:25:20 +0800 Message-Id: <20260714072520.2745942-6-maobibo@loongson.cn> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20260714072520.2745942-1-maobibo@loongson.cn> References: <20260714072520.2745942-1-maobibo@loongson.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: qMiowJDxzMYc5lVq2JEMAA--.39266S3 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Content-Type: text/plain; charset="utf-8" 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 move IPI inject and ack within lock protection to avoid contention in ipi_set() and ipi_clear(). Signed-off-by: Bibo Mao --- arch/loongarch/kvm/intc/dmsintc.c | 7 ++++--- arch/loongarch/kvm/intc/eiointc.c | 14 +++++++++----- arch/loongarch/kvm/intc/ipi.c | 14 ++++++-------- arch/loongarch/kvm/vcpu.c | 3 +++ 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/arch/loongarch/kvm/intc/dmsintc.c b/arch/loongarch/kvm/intc/dm= sintc.c index 5797ef17cd71..1c716e24c5b0 100644 --- a/arch/loongarch/kvm/intc/dmsintc.c +++ b/arch/loongarch/kvm/intc/dmsintc.c @@ -49,7 +49,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 =3D &vcpu->arch.dmsintc_state; =20 if (!level) @@ -59,9 +58,11 @@ int dmsintc_deliver_msi_to_vcpu(struct kvm *kvm, if (!ds) return -ENODEV; =20 - vcpu_irq.irq =3D 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); =20 return 0; diff --git a/arch/loongarch/kvm/intc/eiointc.c b/arch/loongarch/kvm/intc/ei= ointc.c index fd089d54da10..e04aadbd68db 100644 --- a/arch/loongarch/kvm/intc/eiointc.c +++ b/arch/loongarch/kvm/intc/eiointc.c @@ -17,7 +17,8 @@ static void eiointc_set_sw_coreisr(struct loongarch_eioin= tc *s) if (!(s->status & BIT(EIOINTC_ENABLE_INT_ENCODE))) { ipnum =3D count_trailing_zeros(ipnum); ipnum =3D ipnum < 4 ? ipnum : 0; - } + } else if (ipnum >=3D LOONGSON_IP_NUM) + ipnum =3D 0; =20 cpuid =3D ((u8 *)s->coremap)[irq]; vcpu =3D kvm_get_vcpu_by_cpuid(s->kvm, cpuid); @@ -36,13 +37,13 @@ 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; =20 ipnum =3D (s->ipmap >> (irq / 32 * 8)) & 0xff; if (!(s->status & BIT(EIOINTC_ENABLE_INT_ENCODE))) { ipnum =3D count_trailing_zeros(ipnum); ipnum =3D ipnum < 4 ? ipnum : 0; - } + } else if (ipnum >=3D LOONGSON_IP_NUM) + ipnum =3D 0; =20 cpu =3D s->sw_coremap[irq]; vcpu =3D kvm_get_vcpu_by_id(s->kvm, cpu); @@ -67,8 +68,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 */ =20 - vcpu_irq.irq =3D 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); } =20 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 0edaa124a61e..f30d0d13f54d 100644 --- a/arch/loongarch/kvm/intc/ipi.c +++ b/arch/loongarch/kvm/intc/ipi.c @@ -10,16 +10,15 @@ static void ipi_set(struct kvm_vcpu *vcpu, uint32_t data) { uint32_t status; - struct kvm_interrupt irq; =20 spin_lock(&vcpu->arch.ipi_state.lock); status =3D vcpu->arch.ipi_state.status; vcpu->arch.ipi_state.status |=3D data; - spin_unlock(&vcpu->arch.ipi_state.lock); if ((status =3D=3D 0) && data) { - irq.irq =3D LARCH_INT_IPI; - kvm_vcpu_ioctl_interrupt(vcpu, &irq); + kvm_queue_irq(vcpu, LARCH_INT_IPI); + kvm_vcpu_kick(vcpu); } + spin_unlock(&vcpu->arch.ipi_state.lock); } =20 static void ipi_send(struct kvm *kvm, uint64_t data) @@ -40,16 +39,15 @@ 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; =20 spin_lock(&vcpu->arch.ipi_state.lock); vcpu->arch.ipi_state.status &=3D ~data; status =3D vcpu->arch.ipi_state.status; - spin_unlock(&vcpu->arch.ipi_state.lock); if (status =3D=3D 0) { - irq.irq =3D -LARCH_INT_IPI; - kvm_vcpu_ioctl_interrupt(vcpu, &irq); + kvm_dequeue_irq(vcpu, LARCH_INT_IPI); + kvm_vcpu_kick(vcpu); } + spin_unlock(&vcpu->arch.ipi_state.lock); } =20 static uint64_t read_mailbox(struct kvm_vcpu *vcpu, int offset, int len) diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c index 1a0cf6c81df6..f81dadc62c98 100644 --- a/arch/loongarch/kvm/vcpu.c +++ b/arch/loongarch/kvm/vcpu.c @@ -1465,6 +1465,9 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, s= truct kvm_interrupt *irq) if (vector >=3D EXCCODE_INT_NUM) return -EINVAL; =20 + if (kvm_arch_irqchip_in_kernel(vcpu->kvm)) + return -EINVAL; + if (!kvm_guest_has_msgint(&vcpu->arch) && (vector =3D=3D INT_AVEC)) return -EINVAL; =20 --=20 2.39.3