summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorKunkun Jiang <jiangkunkun@huawei.com>2024-12-04 12:23:40 -0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-12-14 19:51:44 +0100
commita0e0f67f2fc19af5c7a673e68a94e6c99cd14c40 (patch)
tree848edd3ffa0544b3281a6c054cc3a9a7eeef9c53 /arch
parentfd92260b7f68d9fe7bef316b65b84f1b67388d05 (diff)
downloadlinux-a0e0f67f2fc19af5c7a673e68a94e6c99cd14c40.tar.gz
linux-a0e0f67f2fc19af5c7a673e68a94e6c99cd14c40.tar.bz2
linux-a0e0f67f2fc19af5c7a673e68a94e6c99cd14c40.zip
KVM: arm64: vgic-its: Clear ITE when DISCARD frees an ITE
commit 7602ffd1d5e8927fadd5187cb4aed2fdc9c47143 upstream. When DISCARD frees an ITE, it does not invalidate the corresponding ITE. In the scenario of continuous saves and restores, there may be a situation where an ITE is not saved but is restored. This is unreasonable and may cause restore to fail. This patch clears the corresponding ITE when DISCARD frees an ITE. Cc: stable@vger.kernel.org Fixes: eff484e0298d ("KVM: arm64: vgic-its: ITT save and restore") Signed-off-by: Kunkun Jiang <jiangkunkun@huawei.com> [Jing: Update with entry write helper] Signed-off-by: Jing Zhang <jingzhangos@google.com> Link: https://lore.kernel.org/r/20241107214137.428439-6-jingzhangos@google.com Signed-off-by: Oliver Upton <oliver.upton@linux.dev> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm64/kvm/vgic/vgic-its.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/arm64/kvm/vgic/vgic-its.c b/arch/arm64/kvm/vgic/vgic-its.c
index e1b2bbfe1fef..4890131c87ef 100644
--- a/arch/arm64/kvm/vgic/vgic-its.c
+++ b/arch/arm64/kvm/vgic/vgic-its.c
@@ -855,6 +855,9 @@ static int vgic_its_cmd_handle_discard(struct kvm *kvm, struct vgic_its *its,
ite = find_ite(its, device_id, event_id);
if (ite && its_is_collection_mapped(ite->collection)) {
+ struct its_device *device = find_its_device(its, device_id);
+ int ite_esz = vgic_its_get_abi(its)->ite_esz;
+ gpa_t gpa = device->itt_addr + ite->event_id * ite_esz;
/*
* Though the spec talks about removing the pending state, we
* don't bother here since we clear the ITTE anyway and the
@@ -863,7 +866,8 @@ static int vgic_its_cmd_handle_discard(struct kvm *kvm, struct vgic_its *its,
vgic_its_invalidate_cache(kvm);
its_free_ite(kvm, ite);
- return 0;
+
+ return vgic_its_write_entry_lock(its, gpa, 0, ite_esz);
}
return E_ITS_DISCARD_UNMAPPED_INTERRUPT;