arch/loongarch/kvm/intc/ipi.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
kvm_ipi_create() registers the IPI device on the IOCSR bus. The error
path currently discards the error code returned by
kvm_io_bus_register_dev() and returns -EFAULT instead:
ret = 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_pr_unimpl("%s: Initialize IOCSR dev failed, ret = %d\n",
__func__, ret);
goto err;
}
...
err:
kfree(s);
return -EFAULT;
kvm_io_bus_register_dev() fails with -ENOMEM or -ENOSPC, so userspace
creating a KVM_DEV_TYPE_LOONGARCH_IPI device is told that it passed a
bad address when the real problem is that the host is out of memory or
out of IOCSR bus slots. -EFAULT is reserved for faulting user addresses,
and the remaining -EFAULT returns in this file are get_user() failures,
where it is correct.
Free the IPI state and propagate the error directly after cleanup. The
error label had a single user, so handling the failure in place removes
the label as well. This matches kvm_eiointc_create(), which already frees
its state and propagates the kvm_io_bus_register_dev() error code
unchanged.
Only compile-tested.
Fixes: c532de5a67a7 ("LoongArch: KVM: Add IPI device support")
Suggested-by: Huacai Chen <chenhuacai@kernel.org>
Assisted-by: Cursor:claude-opus-5
Signed-off-by: Chaithanya Lagisetty <nagachaithanya9911@gmail.com>
---
v2:
- Handle the failure in place and drop the now unused err label instead
of only correcting the returned value (Huacai Chen).
- Reworded the commit message accordingly.
- Dropped Bibo Mao's Reviewed-by from v1, as the error path is
restructured in this version rather than only returning ret.
Link to v1:
https://lore.kernel.org/all/20260922103931.215091-1-nagachaithanya9911@gmail.com/
arch/loongarch/kvm/intc/ipi.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/arch/loongarch/kvm/intc/ipi.c b/arch/loongarch/kvm/intc/ipi.c
index 7b333a4a0430..80faa770c0cd 100644
--- a/arch/loongarch/kvm/intc/ipi.c
+++ b/arch/loongarch/kvm/intc/ipi.c
@@ -423,15 +423,12 @@ static int kvm_ipi_create(struct kvm_device *dev, u32 type)
mutex_unlock(&kvm->slots_lock);
if (ret < 0) {
kvm_pr_unimpl("%s: Initialize IOCSR dev failed, ret = %d\n", __func__, ret);
- goto err;
+ kfree(s);
+ return ret;
}
kvm->arch.ipi = s;
return 0;
-
-err:
- kfree(s);
- return -EFAULT;
}
static void kvm_ipi_destroy(struct kvm_device *dev)
--
2.43.0
© 2016 - 2026 Red Hat, Inc.