Commit bbf257da authored by Nianyao Tang's avatar Nianyao Tang Committed by Zhou Wang
Browse files

irqchip/gic-v3-its: Fix VSYNC referencing an unmapped VPE on GIC v4.1

mainline inclusion
from mainline-v6.9-rc4
commit 80e9963fb3b5509dfcabe9652d56bf4b35542055
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IARQ2V

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=80e9963fb3b5509dfcabe9652d56bf4b35542055



---------------------------------------------------------------------------

As per the GICv4.1 spec (Arm IHI 0069H, 5.3.19):

 "A VMAPP with {V, Alloc}=={0, x} is self-synchronizing, This means the ITS
  command queue does not show the command as consumed until all of its
  effects are completed."

Furthermore, VSYNC is allowed to deliver an SError when referencing a
non existent VPE.

By these definitions, a VMAPP followed by a VSYNC is a bug, as the
later references a VPE that has been unmapped by the former.

Fix it by eliding the VSYNC in this scenario.

Fixes: 64edfaa9 ("irqchip/gic-v4.1: Implement the v4.1 flavour of VMAPP")
Signed-off-by: default avatarNianyao Tang <tangnianyao@huawei.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
Reviewed-by: default avatarZenghui Yu <yuzenghui@huawei.com>
Link: https://lore.kernel.org/r/20240406022737.3898763-1-tangnianyao@huawei.com


Signed-off-by: default avatarZhou Wang <wangzhou1@hisilicon.com>
parent 70e304bd
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -1096,6 +1096,7 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
					   struct its_cmd_block *cmd,
					   struct its_cmd_desc *desc)
{
	struct its_vpe *vpe = valid_vpe(its, desc->its_vmapp_cmd.vpe);
	unsigned long vpt_addr, vconf_addr;
	u64 target;
	bool alloc;
@@ -1108,6 +1109,11 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
		if (is_v4_1(its)) {
			alloc = !atomic_dec_return(&desc->its_vmapp_cmd.vpe->vmapp_count);
			its_encode_alloc(cmd, alloc);
			/*
			 * Unmapping a VPE is self-synchronizing on GICv4.1,
			 * no need to issue a VSYNC.
			 */
			vpe = NULL;
		}

		goto out;
@@ -1142,7 +1148,7 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
out:
	its_fixup_cmd(cmd);

	return valid_vpe(its, desc->its_vmapp_cmd.vpe);
	return vpe;
}

static struct its_vpe *its_build_vmapti_cmd(struct its_node *its,