iommu/arm-smmu-v3: Batch context descriptor invalidation

Rather than publishing one command at a time when invalidating a context
descriptor, batch the commands for all SIDs in the domain.

Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Jean-Philippe Brucker 2020-02-24 17:58:45 +01:00 committed by Will Deacon
parent 4ce8da4536
commit edd0351e7b

View File

@ -1512,6 +1512,7 @@ static void arm_smmu_sync_cd(struct arm_smmu_domain *smmu_domain,
size_t i; size_t i;
unsigned long flags; unsigned long flags;
struct arm_smmu_master *master; struct arm_smmu_master *master;
struct arm_smmu_cmdq_batch cmds = {};
struct arm_smmu_device *smmu = smmu_domain->smmu; struct arm_smmu_device *smmu = smmu_domain->smmu;
struct arm_smmu_cmdq_ent cmd = { struct arm_smmu_cmdq_ent cmd = {
.opcode = CMDQ_OP_CFGI_CD, .opcode = CMDQ_OP_CFGI_CD,
@ -1525,12 +1526,12 @@ static void arm_smmu_sync_cd(struct arm_smmu_domain *smmu_domain,
list_for_each_entry(master, &smmu_domain->devices, domain_head) { list_for_each_entry(master, &smmu_domain->devices, domain_head) {
for (i = 0; i < master->num_sids; i++) { for (i = 0; i < master->num_sids; i++) {
cmd.cfgi.sid = master->sids[i]; cmd.cfgi.sid = master->sids[i];
arm_smmu_cmdq_issue_cmd(smmu, &cmd); arm_smmu_cmdq_batch_add(smmu, &cmds, &cmd);
} }
} }
spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
arm_smmu_cmdq_issue_sync(smmu); arm_smmu_cmdq_batch_submit(smmu, &cmds);
} }
static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu, static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu,