Commit be7e6112 authored by Keisuke Nishimura's avatar Keisuke Nishimura Committed by Oliver Upton
Browse files

KVM: arm64: vgic-its: Add error handling in vgic_its_cache_translation



The return value of xa_store() needs to be checked. This fix adds an
error handling path that resolves the kref inconsistency on failure. As
suggested by Oliver Upton, this function does not return the error code
intentionally because the translation cache is best effort.

Fixes: 8201d102 ("KVM: arm64: vgic-its: Maintain a translation cache per ITS")
Signed-off-by: default avatarKeisuke Nishimura <keisuke.nishimura@inria.fr>
Suggested-by: default avatarOliver Upton <oliver.upton@linux.dev>
Acked-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20241130144952.23729-1-keisuke.nishimura@inria.fr


Signed-off-by: default avatarOliver Upton <oliver.upton@linux.dev>
parent 03c7527e
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -608,12 +608,22 @@ static void vgic_its_cache_translation(struct kvm *kvm, struct vgic_its *its,
	lockdep_assert_held(&its->its_lock);
	vgic_get_irq_kref(irq);

	old = xa_store(&its->translation_cache, cache_key, irq, GFP_KERNEL_ACCOUNT);

	/*
	 * Put the reference taken on @irq if the store fails. Intentionally do
	 * not return the error as the translation cache is best effort.
	 */
	if (xa_is_err(old)) {
		vgic_put_irq(kvm, irq);
		return;
	}

	/*
	 * We could have raced with another CPU caching the same
	 * translation behind our back, ensure we don't leak a
	 * reference if that is the case.
	 */
	old = xa_store(&its->translation_cache, cache_key, irq, GFP_KERNEL_ACCOUNT);
	if (old)
		vgic_put_irq(kvm, old);
}