iommu/arm-smmu: Remove arm_smmu_flush_ops
Robin Murphy
reviewercover iommu/arm-smmu: Remove arm_smmu_flush_ops
Hi all,
Off the back of Will's iommu_flush_ops work, here's an initial followup to replace the temporary solution in arm-smmu with a full conversion. Removing teh extra layer of indirection should generally make things a good bit more efficient, and rather more readable to boot.
Robin.
Robin Murphy (4):
iommu/arm-smmu: Remove .tlb_inv_range indirection iommu/arm-smmu: Remove "leaf" indirection iommu/arm-smmu: Move .tlb_sync method to implementation iommu/arm-smmu: Remove arm_smmu_flush_ops
drivers/iommu/arm-smmu.c | 178 +++++++++++++++++++++------------------ drivers/iommu/arm-smmu.h | 11 +-- 2 files changed, 97 insertions(+), 92 deletions(-)
Signature · 6 lines
2.21.0.dirty _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Robin Murphy
reviewerPATCH 1/4 iommu/arm-smmu: Remove .tlb_inv_range indirection
Fill in 'native' iommu_flush_ops callbacks for all the arm_smmu_flush_ops variants, and clear up the remains of the previous .tlb_inv_range abstraction.
--- drivers/iommu/arm-smmu.c | 110 ++++++++++++++++++++++----------------- drivers/iommu/arm-smmu.h | 2 - 2 files changed, 63 insertions(+), 49 deletions(-)
drivers/iommu/arm-smmu.c +63 -47
@@ -312,7 +312,7 @@ static void arm_smmu_tlb_inv_context_s2(void *cookie) }static void arm_smmu_tlb_inv_range_s1 (unsigned long iova,size_t size, -size_t granule,bool leaf,void *cookie) +size_t granule,void *cookie,bool leaf) {struct arm_smmu_domain *smmu_domain = cookie;struct arm_smmu_device *smmu = smmu_domain->smmu;
@@ -342,7 +342,7 @@ static void arm_smmu_tlb_inv_range_s1(unsigned long iova, size_t size, }static void arm_smmu_tlb_inv_range_s2 (unsigned long iova,size_t size, -size_t granule,bool leaf,void *cookie) +size_t granule,void *cookie,bool leaf) {struct arm_smmu_domain *smmu_domain = cookie;struct arm_smmu_device *smmu = smmu_domain->smmu;
@@ -362,14 +362,63 @@ static void arm_smmu_tlb_inv_range_s2(unsigned long iova, size_t size, }while (size -= granule); } +static void arm_smmu_tlb_inv_walk_s1 (unsigned long iova,size_t size, +size_t granule,void *cookie) +{ +arm_smmu_tlb_inv_range_s1 (iova, size, granule, cookie, false); +arm_smmu_tlb_sync_context (cookie); +} + +static void arm_smmu_tlb_inv_leaf_s1 (unsigned long iova,size_t size, +size_t granule,void *cookie) +{ +arm_smmu_tlb_inv_range_s1 (iova, size, granule, cookie, true); +arm_smmu_tlb_sync_context (cookie); +} + +static void arm_smmu_tlb_add_page_s1 (struct iommu_iotlb_gather *gather, +unsigned long iova,size_t granule, +void *cookie) +{ +arm_smmu_tlb_inv_range_s1 (iova, granule, granule, cookie, true); +} + +static void arm_smmu_tlb_inv_walk_s2 (unsigned long iova,size_t size, +size_t granule,void *cookie) +{ +arm_smmu_tlb_inv_range_s2 (iova, size, granule, cookie, false); +arm_smmu_tlb_sync_context (cookie); +} + +static void arm_smmu_tlb_inv_leaf_s2 (unsigned long iova,size_t size, +size_t granule,void *cookie) +{ +arm_smmu_tlb_inv_range_s2 (iova, size, granule, cookie, true); +arm_smmu_tlb_sync_context (cookie); +} + +static void arm_smmu_tlb_add_page_s2 (struct iommu_iotlb_gather *gather, +unsigned long iova,size_t granule, +void *cookie) +{ +arm_smmu_tlb_inv_range_s2 (iova, granule, granule, cookie, true); +} + +static void arm_smmu_tlb_inv_any_s2_v1 (unsigned long iova,size_t size, +size_t granule,void *cookie) +{ +arm_smmu_tlb_inv_context_s2 (cookie); +}/* * On MMU-401 at least, the cost of firing off multiple TLBIVMIDs appears * almost negligible, but the benefit of getting the first one in as far ahead * of the sync as possible is significant, hence we don't just make this a -* no-op and set .tlb_sync to arm_smmu_tlb_inv_context_s2() as you might think. +* no-op and call arm_smmu_tlb_inv_context_s2() from .iotlb_sync as you might +* think. */ -static void arm_smmu_tlb_inv_vmid_nosync (unsigned long iova,size_t size, -size_t granule,bool leaf,void *cookie) +static void arm_smmu_tlb_add_page_s2_v1 (struct iommu_iotlb_gather *gather, +unsigned long iova,size_t granule, +void *cookie) {struct arm_smmu_domain *smmu_domain = cookie;struct arm_smmu_device *smmu = smmu_domain->smmu;
@@ -380,66 +429,33 @@ static void arm_smmu_tlb_inv_vmid_nosync(unsigned long iova, size_t size,arm_smmu_gr0_write (smmu,ARM_SMMU_GR0_TLBIVMID , smmu_domain->cfg.vmid); } -static void arm_smmu_tlb_inv_walk (unsigned long iova,size_t size, -size_t granule,void *cookie) -{ -struct arm_smmu_domain *smmu_domain = cookie; -const struct arm_smmu_flush_ops *ops = smmu_domain->flush_ops; - - ops->tlb_inv_range (iova, size, granule, false, cookie); - ops->tlb_sync (cookie); -} - -static void arm_smmu_tlb_inv_leaf (unsigned long iova,size_t size, -size_t granule,void *cookie) -{ -struct arm_smmu_domain *smmu_domain = cookie; -const struct arm_smmu_flush_ops *ops = smmu_domain->flush_ops; - - ops->tlb_inv_range (iova, size, granule, true, cookie); - ops->tlb_sync (cookie); -} - -static void arm_smmu_tlb_add_page (struct iommu_iotlb_gather *gather, -unsigned long iova,size_t granule, -void *cookie) -{ -struct arm_smmu_domain *smmu_domain = cookie; -const struct arm_smmu_flush_ops *ops = smmu_domain->flush_ops; - - ops->tlb_inv_range (iova, granule, granule, true, cookie); -} -static const struct arm_smmu_flush_ops arm_smmu_s1_tlb_ops = { .tlb = { .tlb_flush_all = arm_smmu_tlb_inv_context_s1, - .tlb_flush_walk = arm_smmu_tlb_inv_walk, - .tlb_flush_leaf = arm_smmu_tlb_inv_leaf, - .tlb_add_page = arm_smmu_tlb_add_page, + .tlb_flush_walk = arm_smmu_tlb_inv_walk_s1, + .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s1, + .tlb_add_page = arm_smmu_tlb_add_page_s1, }, - .tlb_inv_range = arm_smmu_tlb_inv_range_s1, .tlb_sync = arm_smmu_tlb_sync_context, };static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v2 = { .tlb = { .tlb_flush_all = arm_smmu_tlb_inv_context_s2, - .tlb_flush_walk = arm_smmu_tlb_inv_walk, - .tlb_flush_leaf = arm_smmu_tlb_inv_leaf, - .tlb_add_page = arm_smmu_tlb_add_page, + .tlb_flush_walk = arm_smmu_tlb_inv_walk_s2, + .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s2, + .tlb_add_page = arm_smmu_tlb_add_page_s2, }, - .tlb_inv_range = arm_smmu_tlb_inv_range_s2, .tlb_sync = arm_smmu_tlb_sync_context, };static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v1 = { .tlb = { .tlb_flush_all = arm_smmu_tlb_inv_context_s2, - .tlb_flush_walk = arm_smmu_tlb_inv_walk, - .tlb_flush_leaf = arm_smmu_tlb_inv_leaf, - .tlb_add_page = arm_smmu_tlb_add_page, + .tlb_flush_walk = arm_smmu_tlb_inv_any_s2_v1, + .tlb_flush_leaf = arm_smmu_tlb_inv_any_s2_v1, + .tlb_add_page = arm_smmu_tlb_add_page_s2_v1, }, - .tlb_inv_range = arm_smmu_tlb_inv_vmid_nosync, .tlb_sync = arm_smmu_tlb_sync_vmid, };
drivers/iommu/arm-smmu.h +0 -2
@@ -306,8 +306,6 @@ enum arm_smmu_domain_stage {struct arm_smmu_flush_ops {struct iommu_flush_ops tlb; -void (*tlb_inv_range)(unsigned long iova,size_t size,size_t granule, -bool leaf,void *cookie);void (*tlb_sync)(void *cookie); };
Signature · 6 lines
2.21.0.dirty _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Robin Murphy
reviewerPATCH 2/4 iommu/arm-smmu: Remove "leaf" indirection
In reply to Robin MurphyNow that the "leaf" flag is no longer part of an external interface, there's no need to use it to infer a register offset at runtime when we can just as easily encode the offset directly in its place.
--- drivers/iommu/arm-smmu.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
drivers/iommu/arm-smmu.c +16 -13
@@ -312,18 +312,16 @@ static void arm_smmu_tlb_inv_context_s2(void *cookie) }static void arm_smmu_tlb_inv_range_s1 (unsigned long iova,size_t size, -size_t granule,void *cookie,bool leaf) +size_t granule,void *cookie,int reg) {struct arm_smmu_domain *smmu_domain = cookie;struct arm_smmu_device *smmu = smmu_domain->smmu;struct arm_smmu_cfg *cfg = &smmu_domain->cfg; -int reg, idx = cfg->cbndx; +int idx = cfg->cbndx;if (smmu->features &ARM_SMMU_FEAT_COHERENT_WALK )wmb (); - reg = leaf ?ARM_SMMU_CB_S1_TLBIVAL :ARM_SMMU_CB_S1_TLBIVA ; -if (cfg->fmt !=ARM_SMMU_CTX_FMT_AARCH64 ) { iova = (iova >>12 ) <<12 ; iova |= cfg->asid;
@@ -342,16 +340,15 @@ static void arm_smmu_tlb_inv_range_s1(unsigned long iova, size_t size, }static void arm_smmu_tlb_inv_range_s2 (unsigned long iova,size_t size, -size_t granule,void *cookie,bool leaf) +size_t granule,void *cookie,int reg) {struct arm_smmu_domain *smmu_domain = cookie;struct arm_smmu_device *smmu = smmu_domain->smmu; -int reg, idx = smmu_domain->cfg.cbndx; +int idx = smmu_domain->cfg.cbndx;if (smmu->features &ARM_SMMU_FEAT_COHERENT_WALK )wmb (); - reg = leaf ?ARM_SMMU_CB_S2_TLBIIPAS2L :ARM_SMMU_CB_S2_TLBIIPAS2 ; iova >>=12 ; do { if (smmu_domain->cfg.fmt == ARM_SMMU_CTX_FMT_AARCH64)
@@ -365,14 +362,16 @@ static void arm_smmu_tlb_inv_range_s2(unsigned long iova, size_t size,static void arm_smmu_tlb_inv_walk_s1 (unsigned long iova,size_t size,size_t granule,void *cookie) { -arm_smmu_tlb_inv_range_s1 (iova, size, granule, cookie, false); +arm_smmu_tlb_inv_range_s1 (iova, size, granule, cookie, +ARM_SMMU_CB_S1_TLBIVA );arm_smmu_tlb_sync_context (cookie); }static void arm_smmu_tlb_inv_leaf_s1 (unsigned long iova,size_t size,size_t granule,void *cookie) { -arm_smmu_tlb_inv_range_s1 (iova, size, granule, cookie, true); +arm_smmu_tlb_inv_range_s1 (iova, size, granule, cookie, +ARM_SMMU_CB_S1_TLBIVAL );arm_smmu_tlb_sync_context (cookie); }
@@ -380,20 +379,23 @@ static void arm_smmu_tlb_add_page_s1(struct iommu_iotlb_gather *gather, unsigned long iova, size_t granule, void *cookie) { -arm_smmu_tlb_inv_range_s1 (iova ,granule ,granule ,cookie ,true ); +arm_smmu_tlb_inv_range_s1 (iova ,granule ,granule ,cookie , +ARM_SMMU_CB_S1_TLBIVAL ); }static void arm_smmu_tlb_inv_walk_s2 (unsigned long iova,size_t size,size_t granule,void *cookie) { -arm_smmu_tlb_inv_range_s2 (iova, size, granule, cookie, false); +arm_smmu_tlb_inv_range_s2 (iova, size, granule, cookie, +ARM_SMMU_CB_S2_TLBIIPAS2 );arm_smmu_tlb_sync_context (cookie); }static void arm_smmu_tlb_inv_leaf_s2 (unsigned long iova,size_t size,size_t granule,void *cookie) { -arm_smmu_tlb_inv_range_s2 (iova, size, granule, cookie, true); +arm_smmu_tlb_inv_range_s2 (iova, size, granule, cookie, +ARM_SMMU_CB_S2_TLBIIPAS2L );arm_smmu_tlb_sync_context (cookie); }
@@ -401,7 +403,8 @@ static void arm_smmu_tlb_add_page_s2(struct iommu_iotlb_gather *gather, unsigned long iova, size_t granule, void *cookie) { -arm_smmu_tlb_inv_range_s2 (iova ,granule ,granule ,cookie ,true ); +arm_smmu_tlb_inv_range_s2 (iova ,granule ,granule ,cookie , +ARM_SMMU_CB_S2_TLBIIPAS2L ); } static void arm_smmu_tlb_inv_any_s2_v1(unsigned long iova, size_t size,
Signature · 6 lines
2.21.0.dirty _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Robin Murphy
reviewerPATCH 3/4 iommu/arm-smmu: Move .tlb_sync method to implementation
In reply to Robin MurphyWith the .tlb_sync interface no longer exposed directly to io-pgtable, strip away the remains of that abstraction layer. Retain the callback in spirit, though, by transforming it into an implementation override for the low-level sync routine itself, for which we will have at least one user.
--- drivers/iommu/arm-smmu.c | 33 +++++++++++++++------------------ drivers/iommu/arm-smmu.h | 3 ++- 2 files changed, 17 insertions(+), 19 deletions(-)
drivers/iommu/arm-smmu.c +15 -18
@@ -244,6 +244,9 @@ static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu, int page,unsigned int spin_cnt, delay;u32 reg; +if (smmu->impl &&unlikely (smmu->impl->tlb_sync)) +return smmu->impl->tlb_sync (smmu, page, sync, status); +arm_smmu_writel (smmu, page, sync,QCOM_DUMMY_VAL );for (delay =1 ; delay <TLB_LOOP_TIMEOUT ; delay *=2 ) {for (spin_cnt =TLB_SPIN_COUNT ; spin_cnt >0 ; spin_cnt--) {
@@ -268,9 +271,8 @@ static void arm_smmu_tlb_sync_global(struct arm_smmu_device *smmu)spin_unlock_irqrestore (&smmu->global_sync_lock, flags); } -static void arm_smmu_tlb_sync_context (void *cookie) +static void arm_smmu_tlb_sync_context (struct arm_smmu_domain *smmu_domain) { -struct arm_smmu_domain *smmu_domain = cookie;struct arm_smmu_device *smmu = smmu_domain->smmu;unsigned long flags;
@@ -280,13 +282,6 @@ static void arm_smmu_tlb_sync_context(void *cookie)spin_unlock_irqrestore (&smmu_domain->cb_lock, flags); } -static void arm_smmu_tlb_sync_vmid (void *cookie) -{ -struct arm_smmu_domain *smmu_domain = cookie; - -arm_smmu_tlb_sync_global (smmu_domain->smmu); -} -static void arm_smmu_tlb_inv_context_s1 (void *cookie) {struct arm_smmu_domain *smmu_domain = cookie;
@@ -297,7 +292,7 @@ static void arm_smmu_tlb_inv_context_s1(void *cookie)wmb ();arm_smmu_cb_write (smmu_domain->smmu, smmu_domain->cfg.cbndx,ARM_SMMU_CB_S1_TLBIASID , smmu_domain->cfg.asid); -arm_smmu_tlb_sync_context (cookie); +arm_smmu_tlb_sync_context (smmu_domain); }static void arm_smmu_tlb_inv_context_s2 (void *cookie)
@@ -439,7 +434,6 @@ static const struct arm_smmu_flush_ops arm_smmu_s1_tlb_ops = { .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s1, .tlb_add_page = arm_smmu_tlb_add_page_s1, }, - .tlb_sync = arm_smmu_tlb_sync_context, }; static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v2 = {
@@ -449,7 +443,6 @@ static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v2 = { .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s2, .tlb_add_page = arm_smmu_tlb_add_page_s2, }, - .tlb_sync = arm_smmu_tlb_sync_context, }; static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v1 = {
@@ -459,7 +452,6 @@ static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v1 = { .tlb_flush_leaf = arm_smmu_tlb_inv_any_s2_v1, .tlb_add_page = arm_smmu_tlb_add_page_s2_v1, }, - .tlb_sync = arm_smmu_tlb_sync_vmid, };static irqreturn_t arm_smmu_context_fault (int irq,void *dev)
@@ -1229,11 +1221,16 @@ static void arm_smmu_iotlb_sync(struct iommu_domain *domain,struct arm_smmu_domain *smmu_domain =to_smmu_domain (domain);struct arm_smmu_device *smmu = smmu_domain->smmu; -if (smmu_domain->flush_ops) { -arm_smmu_rpm_get (smmu); - smmu_domain->flush_ops->tlb_sync (smmu_domain); -arm_smmu_rpm_put (smmu); - } +if (!smmu) +return ; + +arm_smmu_rpm_get (smmu); +if (smmu->version ==ARM_SMMU_V2 || + smmu_domain->stage ==ARM_SMMU_DOMAIN_S1 ) +arm_smmu_tlb_sync_context (smmu_domain); +else +arm_smmu_tlb_sync_global (smmu); +arm_smmu_rpm_put (smmu); } static phys_addr_t arm_smmu_iova_to_phys_hard(struct iommu_domain *domain,
drivers/iommu/arm-smmu.h +2 -1
@@ -306,7 +306,6 @@ enum arm_smmu_domain_stage {struct arm_smmu_flush_ops {struct iommu_flush_ops tlb; -void (*tlb_sync)(void *cookie); };struct arm_smmu_domain {
@@ -333,6 +332,8 @@ struct arm_smmu_impl {int (*cfg_probe)(struct arm_smmu_device *smmu);int (*reset)(struct arm_smmu_device *smmu);int (*init_context)(struct arm_smmu_domain *smmu_domain); +void (*tlb_sync)(struct arm_smmu_device *smmu,int page,int sync, +int status); };static inline void __iomem *arm_smmu_page (struct arm_smmu_device *smmu,int n)
Signature · 6 lines
2.21.0.dirty _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Robin Murphy
reviewerPATCH 4/4 iommu/arm-smmu: Remove arm_smmu_flush_ops
In reply to Robin MurphyNow it's just an empty wrapper.
--- drivers/iommu/arm-smmu.c | 40 +++++++++++++++++----------------------- drivers/iommu/arm-smmu.h | 6 +----- 2 files changed, 18 insertions(+), 28 deletions(-)
drivers/iommu/arm-smmu.c +17 -23
@@ -427,31 +427,25 @@ static void arm_smmu_tlb_add_page_s2_v1(struct iommu_iotlb_gather *gather,arm_smmu_gr0_write (smmu,ARM_SMMU_GR0_TLBIVMID , smmu_domain->cfg.vmid); } -static const struct arm_smmu_flush_ops arm_smmu_s1_tlb_ops = { - .tlb = { - .tlb_flush_all = arm_smmu_tlb_inv_context_s1, - .tlb_flush_walk = arm_smmu_tlb_inv_walk_s1, - .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s1, - .tlb_add_page = arm_smmu_tlb_add_page_s1, - }, +static const struct iommu_flush_ops arm_smmu_s1_tlb_ops = { + .tlb_flush_all = arm_smmu_tlb_inv_context_s1, + .tlb_flush_walk = arm_smmu_tlb_inv_walk_s1, + .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s1, + .tlb_add_page = arm_smmu_tlb_add_page_s1, }; -static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v2 = { - .tlb = { - .tlb_flush_all = arm_smmu_tlb_inv_context_s2, - .tlb_flush_walk = arm_smmu_tlb_inv_walk_s2, - .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s2, - .tlb_add_page = arm_smmu_tlb_add_page_s2, - }, +static const struct iommu_flush_ops arm_smmu_s2_tlb_ops_v2 = { + .tlb_flush_all = arm_smmu_tlb_inv_context_s2, + .tlb_flush_walk = arm_smmu_tlb_inv_walk_s2, + .tlb_flush_leaf = arm_smmu_tlb_inv_leaf_s2, + .tlb_add_page = arm_smmu_tlb_add_page_s2, }; -static const struct arm_smmu_flush_ops arm_smmu_s2_tlb_ops_v1 = { - .tlb = { - .tlb_flush_all = arm_smmu_tlb_inv_context_s2, - .tlb_flush_walk = arm_smmu_tlb_inv_any_s2_v1, - .tlb_flush_leaf = arm_smmu_tlb_inv_any_s2_v1, - .tlb_add_page = arm_smmu_tlb_add_page_s2_v1, - }, +static const struct iommu_flush_ops arm_smmu_s2_tlb_ops_v1 = { + .tlb_flush_all = arm_smmu_tlb_inv_context_s2, + .tlb_flush_walk = arm_smmu_tlb_inv_any_s2_v1, + .tlb_flush_leaf = arm_smmu_tlb_inv_any_s2_v1, + .tlb_add_page = arm_smmu_tlb_add_page_s2_v1, };static irqreturn_t arm_smmu_context_fault (int irq,void *dev)
@@ -781,7 +775,7 @@ static int arm_smmu_init_domain_context(struct iommu_domain *domain, .ias = ias, .oas = oas, .coherent_walk = smmu->features & ARM_SMMU_FEAT_COHERENT_WALK, - .tlb = &smmu_domain->flush_ops->tlb, + .tlb = smmu_domain->flush_ops, .iommu_dev = smmu->dev, };
@@ -1210,7 +1204,7 @@ static void arm_smmu_flush_iotlb_all(struct iommu_domain *domain)if (smmu_domain->flush_ops) {arm_smmu_rpm_get (smmu); - smmu_domain->flush_ops->tlb.tlb_flush_all (smmu_domain); + smmu_domain->flush_ops->tlb_flush_all (smmu_domain);arm_smmu_rpm_put (smmu); } }
drivers/iommu/arm-smmu.h +1 -5
@@ -304,14 +304,10 @@ enum arm_smmu_domain_stage { ARM_SMMU_DOMAIN_BYPASS, }; -struct arm_smmu_flush_ops { -struct iommu_flush_ops tlb; -}; -struct arm_smmu_domain {struct arm_smmu_device *smmu;struct io_pgtable_ops *pgtbl_ops; -const struct arm_smmu_flush_ops *flush_ops; +const struct iommu_flush_ops *flush_ops;struct arm_smmu_cfg cfg;enum arm_smmu_domain_stage stage;bool non_strict;
Signature · 6 lines
2.21.0.dirty _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
Will Deacon
maintainerQuoted 4 lines · Robin Murphy
Off the back of Will's
iommu_flush_opswork, here's an initial followup to replace the temporary solution in arm-smmu with a full conversion. Removing teh extra layer of indirection should generally make things a good bit more efficient, and rather more readable to boot.
Thanks, I'll queue this for 5.5.
Will
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu