FAILED: patch "[PATCH] RISC-V: KVM: Serialize IMSIC attributes with vCPU migration" failed to apply to 6.6-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 8ae12ccaec6ec74945d8c1ef39f2c1b8df779abc
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026092917-extradite-anagram-9eaf@gregkh' --subject-prefix 'PATCH 6.6.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8ae12ccaec6ec74945d8c1ef39f2c1b8df779abc Mon Sep 17 00:00:00 2001
From: Xie Bo <[email protected]>
Date: Mon, 10 Aug 2026 09:21:15 +0800
Subject: [PATCH] RISC-V: KVM: Serialize IMSIC attributes with vCPU migration
KVM device ioctls are not serialized against KVM_RUN. As a result, kvm_riscv_aia_imsic_rw_attr() can snapshot the physical CPU and HGEI of an IMSIC VS-file before a concurrent vCPU migration releases it.
The HGEI can then be allocated to another vCPU before imsic_vsfile_rw() uses the stale tuple. A GET or SET attribute may consequently access the new owner's interrupt file.
Serialize the entire IMSIC attribute operation with the target vCPU mutex. This prevents the VS-file from being migrated and recycled until the attribute access completes. Acquire the mutex killably so that the device ioctl remains interruptible while waiting for KVM_RUN to finish.
arch/riscv/kvm/aia_imsic.c +9 -2
@@ -965,9 +965,14 @@ int kvm_riscv_aia_imsic_rw_attr(struct kvm *kvm, unsigned long type,if (!vcpu)return -ENODEV ; +if (mutex_lock_killable (&vcpu->mutex)) +return -EINTR ; + imsic = vcpu->arch.aia_context.imsic_state; -if (!imsic) -return -ENODEV ; +if (!imsic) { + rc = -ENODEV ; + goto out_unlock; + } isel =KVM_DEV_RISCV_AIA_IMSIC_GET_ISEL (type);read_lock_irqsave (&imsic->vsfile_lock, flags);
@@ -991,6 +996,8 @@ int kvm_riscv_aia_imsic_rw_attr(struct kvm *kvm, unsigned long type, rc =imsic_vsfile_rw (vsfile_hgei, vsfile_cpu, imsic->nr_eix, isel, write, val); +out_unlock: +mutex_unlock (&vcpu->mutex);return rc; }
Sasha Levin
maintainerPATCH 1/2 RISC-V: KVM: Fix null pointer dereference in kvm_riscv_aia_imsic_rw_attr()
From: Jiakai Xu <[email protected]>
[ Upstream commit aeb1d17d1af5924f7357d7204a293bd8fc06ea13 ]
Add a null pointer check for imsic_state before dereferencing it in kvm_riscv_aia_imsic_rw_attr(). While the function checks that the vcpu exists, it doesn't verify that the vcpu's imsic_state has been initialized, leading to a null pointer dereference when accessed.
The crash manifests as:
Unable to handle kernel paging request at virtual address dfffffff00000006 ... kvm_riscv_aia_imsic_rw_attr+0x2d8/0x854 arch/riscv/kvm/aia_imsic.c:958 aia_set_attr+0x2ee/0x1726 arch/riscv/kvm/aia_device.c:354 kvm_device_ioctl_attr virt/kvm/kvm_main.c:4744 [inline] kvm_device_ioctl+0x296/0x374 virt/kvm/kvm_main.c:4761 vfs_ioctl fs/ioctl.c:51 [inline] ...
The fix adds a check to return -ENODEV if imsic_state is NULL and moves isel assignment after imsic_state NULL check.
Stable-dep-of: 8ae12ccaec6e ("RISC-V: KVM: Serialize IMSIC attributes with vCPU migration")
--- arch/riscv/kvm/aia_imsic.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/riscv/kvm/aia_imsic.c +3 -1
@@ -895,8 +895,10 @@ int kvm_riscv_aia_imsic_rw_attr(struct kvm *kvm, unsigned long type,if (!vcpu)return -ENODEV ; - isel =KVM_DEV_RISCV_AIA_IMSIC_GET_ISEL (type); imsic = vcpu->arch.aia_context.imsic_state; +if (!imsic) +return -ENODEV ; + isel =KVM_DEV_RISCV_AIA_IMSIC_GET_ISEL (type);read_lock_irqsave (&imsic->vsfile_lock, flags);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 RISC-V: KVM: Serialize IMSIC attributes with vCPU migration
From: Xie Bo <[email protected]>
[ Upstream commit 8ae12ccaec6ec74945d8c1ef39f2c1b8df779abc ]
KVM device ioctls are not serialized against KVM_RUN. As a result, kvm_riscv_aia_imsic_rw_attr() can snapshot the physical CPU and HGEI of an IMSIC VS-file before a concurrent vCPU migration releases it.
The HGEI can then be allocated to another vCPU before imsic_vsfile_rw() uses the stale tuple. A GET or SET attribute may consequently access the new owner's interrupt file.
Serialize the entire IMSIC attribute operation with the target vCPU mutex. This prevents the VS-file from being migrated and recycled until the attribute access completes. Acquire the mutex killably so that the device ioctl remains interruptible while waiting for KVM_RUN to finish.
--- arch/riscv/kvm/aia_imsic.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
arch/riscv/kvm/aia_imsic.c +9 -2
@@ -895,9 +895,14 @@ int kvm_riscv_aia_imsic_rw_attr(struct kvm *kvm, unsigned long type,if (!vcpu)return -ENODEV ; +if (mutex_lock_killable (&vcpu->mutex)) +return -EINTR ; + imsic = vcpu->arch.aia_context.imsic_state; -if (!imsic) -return -ENODEV ; +if (!imsic) { + rc = -ENODEV ; + goto out_unlock; + } isel =KVM_DEV_RISCV_AIA_IMSIC_GET_ISEL (type);read_lock_irqsave (&imsic->vsfile_lock, flags);
@@ -921,6 +926,8 @@ int kvm_riscv_aia_imsic_rw_attr(struct kvm *kvm, unsigned long type, rc =imsic_vsfile_rw (vsfile_hgei, vsfile_cpu, imsic->nr_eix, isel, write, val); +out_unlock: +mutex_unlock (&vcpu->mutex);return rc; }
Signature · 1 line
2.53.0