Skip to content

Commit 803e41f

Browse files
nicolincwilldeacon
authored andcommitted
iommu/tegra241-cmdqv: Set supports_cmd op in tegra241_vcmdq_hw_init()
vintf->hyp_own is finalized in tegra241_vintf_hw_init(). On the other hand, tegra241_vcmdq_alloc_smmu_cmdq() is called via an init_structures callback, which is earlier than tegra241_vintf_hw_init(). This results in the supports_cmd op always being set to the guest function, although this doesn't break any functionality nor have some noticeable perf impact since non-invalidation commands are not issued in the perf sensitive context. Fix this by moving supports_cmd to tegra241_vcmdq_hw_init(). After this change, - For a guest kernel, this will be a status quo - For a host kernel, non-invalidation commands will be issued to VCMDQ(s) Fixes: a9d4028 ("iommu/tegra241-cmdqv: Limit CMDs for VCMDQs of a guest owned VINTF") Reported-by: Eric Auger <eric.auger@redhat.com> Reported-by: Shameer Kolothum <skolothumtho@nvidia.com> Closes: https://lore.kernel.org/qemu-devel/CH3PR12MB754836BEE54E39B30C7210C0AB44A@CH3PR12MB7548.namprd12.prod.outlook.com/ Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Tested-by: Shameer Kolothum <skolothumtho@nvidia.com> Signed-off-by: Will Deacon <will@kernel.org>
1 parent 3b79398 commit 803e41f

1 file changed

Lines changed: 4 additions & 3 deletions

File tree

drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,10 @@ static int tegra241_vcmdq_hw_init(struct tegra241_vcmdq *vcmdq)
479479
/* Reset VCMDQ */
480480
tegra241_vcmdq_hw_deinit(vcmdq);
481481

482+
/* vintf->hyp_own is a HW state finalized in tegra241_vintf_hw_init() */
483+
if (!vcmdq->vintf->hyp_own)
484+
vcmdq->cmdq.supports_cmd = tegra241_guest_vcmdq_supports_cmd;
485+
482486
/* Configure and enable VCMDQ */
483487
writeq_relaxed(vcmdq->cmdq.q.q_base, REG_VCMDQ_PAGE1(vcmdq, BASE));
484488

@@ -639,9 +643,6 @@ static int tegra241_vcmdq_alloc_smmu_cmdq(struct tegra241_vcmdq *vcmdq)
639643
q->q_base = q->base_dma & VCMDQ_ADDR;
640644
q->q_base |= FIELD_PREP(VCMDQ_LOG2SIZE, q->llq.max_n_shift);
641645

642-
if (!vcmdq->vintf->hyp_own)
643-
cmdq->supports_cmd = tegra241_guest_vcmdq_supports_cmd;
644-
645646
return arm_smmu_cmdq_init(smmu, cmdq);
646647
}
647648

0 commit comments

Comments
 (0)