Some improvements for iommu
Subsystems (9)
v2 cover Some improvements for iommu
Hi,
The first patch masks some functions as static, and the second patch changes to use the gfp parameter from iommu_ops->map() to allocate ARM page pages. Any comments are welcome. Thanks.
Changes from v1:
- Fix the building errors when enabling CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST
Baolin Wang (2):
iommu: Mark __iommu_map/__iommu_map_sg as static
iommu: Add gfp parameter to io_pgtable_ops->map()
drivers/gpu/drm/panfrost/panfrost_mmu.c | 2 +- drivers/iommu/arm-smmu-v3.c | 2 +- drivers/iommu/arm-smmu.c | 2 +- drivers/iommu/io-pgtable-arm-v7s.c | 18 +++++++++--------- drivers/iommu/io-pgtable-arm.c | 18 +++++++++--------- drivers/iommu/iommu.c | 10 +++++----- drivers/iommu/ipmmu-vmsa.c | 2 +- drivers/iommu/msm_iommu.c | 2 +- drivers/iommu/mtk_iommu.c | 2 +- drivers/iommu/qcom_iommu.c | 2 +- include/linux/io-pgtable.h | 2 +- 11 files changed, 31 insertions(+), 31 deletions(-)
Signature · 1 line
1.8.3.1
PATCH v2 1/2 iommu: Mark __iommu_map/__iommu_map_sg as static
Now the __iommu_map() and __iommu_map_sg() are used only in iommu.c file, so mark them as static.
--- drivers/iommu/iommu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/iommu/iommu.c +5 -5
@@ -2174,8 +2174,8 @@ static size_t iommu_pgsize(struct iommu_domain *domain,return pgsize; } -int __iommu_map (struct iommu_domain *domain,unsigned long iova, -phys_addr_t paddr,size_t size,int prot,gfp_t gfp) +static int __iommu_map (struct iommu_domain *domain,unsigned long iova, +phys_addr_t paddr,size_t size,int prot,gfp_t gfp) {const struct iommu_ops *ops = domain->ops;unsigned long orig_iova = iova;
@@ -2325,9 +2325,9 @@ size_t iommu_unmap_fast(struct iommu_domain *domain, }EXPORT_SYMBOL_GPL (iommu_unmap_fast); -size_t __iommu_map_sg (struct iommu_domain *domain,unsigned long iova, -struct scatterlist *sg,unsigned int nents,int prot, -gfp_t gfp) +static size_t __iommu_map_sg (struct iommu_domain *domain,unsigned long iova, +struct scatterlist *sg,unsigned int nents,int prot, +gfp_t gfp) {size_t len =0 , mapped =0 ;phys_addr_t start;
Signature · 1 line
1.8.3.1
Re: [PATCH v2 1/2] iommu: Mark __iommu_map/__iommu_map_sg as static
Quoted 7 lines · Baolin Wang
Now the
__iommu_map()and__iommu_map_sg()are used only iniommu.cfile, so mark them as static.Signed-off-by Baolin Wang <[email protected]>--- drivers/iommu/iommu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
(I'm assuming Joerg will pick this up for 5.9)
Thanks,
Will
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH v2 2/2 iommu: Add gfp parameter to io_pgtable_ops->map()
In reply to Baolin WangNow the ARM page tables are always allocated by GFP_ATOMIC parameter, but the iommu_ops->map() function has been added a gfp_t parameter by commit 781ca2de89ba ("iommu: Add gfp parameter to iommu_ops::map"), thus io_pgtable_ops->map() should use the gfp parameter passed from iommu_ops->map() to allocate page pages, which can avoid wasting the memory allocators atomic pools for some non-atomic contexts.
--- drivers/gpu/drm/panfrost/panfrost_mmu.c | 2 +- drivers/iommu/arm-smmu-v3.c | 2 +- drivers/iommu/arm-smmu.c | 2 +- drivers/iommu/io-pgtable-arm-v7s.c | 18 +++++++++--------- drivers/iommu/io-pgtable-arm.c | 18 +++++++++--------- drivers/iommu/ipmmu-vmsa.c | 2 +- drivers/iommu/msm_iommu.c | 2 +- drivers/iommu/mtk_iommu.c | 2 +- drivers/iommu/qcom_iommu.c | 2 +- include/linux/io-pgtable.h | 2 +- 10 files changed, 26 insertions(+), 26 deletions(-)
drivers/gpu/drm/panfrost/panfrost_mmu.c +1 -1
@@ -262,7 +262,7 @@ static int mmu_map_sg(struct panfrost_device *pfdev, struct panfrost_mmu *mmu,while (len) {size_t pgsize =get_pgsize (iova | paddr, len); - ops->map (ops, iova, paddr, pgsize, prot); + ops->map (ops, iova, paddr, pgsize, prot,GFP_KERNEL ); iova += pgsize; paddr += pgsize; len -= pgsize;
drivers/iommu/arm-smmu-v3.c +1 -1
@@ -2850,7 +2850,7 @@ static int arm_smmu_map(struct iommu_domain *domain, unsigned long iova,if (!ops)return -ENODEV ; -return ops->map (ops, iova, paddr, size, prot); +return ops->map (ops, iova, paddr, size, prot, gfp); } static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
drivers/iommu/arm-smmu.c +1 -1
@@ -1227,7 +1227,7 @@ static int arm_smmu_map(struct iommu_domain *domain, unsigned long iova,return -ENODEV ;arm_smmu_rpm_get (smmu); - ret = ops->map (ops, iova, paddr, size, prot); + ret = ops->map (ops, iova, paddr, size, prot, gfp);arm_smmu_rpm_put (smmu);return ret;
drivers/iommu/io-pgtable-arm-v7s.c +9 -9
@@ -470,7 +470,7 @@ static arm_v7s_iopte arm_v7s_install_table(arm_v7s_iopte *table,static int __arm_v7s_map (struct arm_v7s_io_pgtable *data,unsigned long iova,phys_addr_t paddr,size_t size,int prot, -int lvl,arm_v7s_iopte *ptep) +int lvl,arm_v7s_iopte *ptep,gfp_t gfp) {struct io_pgtable_cfg *cfg = &data->iop.cfg;arm_v7s_iopte pte, *cptep;
@@ -491,7 +491,7 @@ static int __arm_v7s_map(struct arm_v7s_io_pgtable *data, unsigned long iova,/* Grab a pointer to the next level */ pte =READ_ONCE (*ptep);if (!pte) { - cptep =__arm_v7s_alloc_table (lvl +1 ,GFP_ATOMIC , data); + cptep =__arm_v7s_alloc_table (lvl +1 , gfp, data);if (!cptep)return -ENOMEM ;
@@ -512,11 +512,11 @@ static int __arm_v7s_map(struct arm_v7s_io_pgtable *data, unsigned long iova, }/* Rinse, repeat */ -return __arm_v7s_map (data, iova, paddr, size, prot, lvl +1 , cptep); +return __arm_v7s_map (data, iova, paddr, size, prot, lvl +1 , cptep, gfp); }static int arm_v7s_map (struct io_pgtable_ops *ops,unsigned long iova, -phys_addr_t paddr,size_t size,int prot) +phys_addr_t paddr,size_t size,int prot,gfp_t gfp) {struct arm_v7s_io_pgtable *data =io_pgtable_ops_to_data (ops);struct io_pgtable *iop = &data->iop;
@@ -530,7 +530,7 @@ static int arm_v7s_map(struct io_pgtable_ops *ops, unsigned long iova, paddr >= (1ULL << data->iop.cfg.oas)))return -ERANGE ; - ret =__arm_v7s_map (data, iova, paddr, size, prot,1 , data->pgd); + ret =__arm_v7s_map (data, iova, paddr, size, prot,1 , data->pgd, gfp);/* * Synchronise all PTE updates for the new mapping before there's * a chance for anything to kick off a table walk for the new iova.
@@ -922,12 +922,12 @@ static int __init arm_v7s_do_selftests(void)if (ops->map (ops, iova, iova, size,IOMMU_READ |IOMMU_WRITE |IOMMU_NOEXEC | -IOMMU_CACHE )) +IOMMU_CACHE ,GFP_KERNEL ))return __FAIL (ops);/* Overlapping mappings */ if (!ops->map (ops, iova, iova + size, size, -IOMMU_READ |IOMMU_NOEXEC )) +IOMMU_READ |IOMMU_NOEXEC ,GFP_KERNEL ))return __FAIL (ops);if (ops->iova_to_phys (ops, iova +42 ) != (iova +42 ))
@@ -946,7 +946,7 @@ static int __init arm_v7s_do_selftests(void)return __FAIL (ops);/* Remap of partial unmap */ -if (ops->map (ops, iova_start + size, size, size,IOMMU_READ )) +if (ops->map (ops, iova_start + size, size, size,IOMMU_READ ,GFP_KERNEL ))return __FAIL (ops); if (ops->iova_to_phys(ops, iova_start + size + 42)
@@ -967,7 +967,7 @@ static int __init arm_v7s_do_selftests(void)return __FAIL (ops);/* Remap full block */ -if (ops->map (ops, iova, iova, size,IOMMU_WRITE )) +if (ops->map (ops, iova, iova, size,IOMMU_WRITE ,GFP_KERNEL ))return __FAIL (ops);if (ops->iova_to_phys (ops, iova +42 ) != (iova +42 ))
drivers/iommu/io-pgtable-arm.c +9 -9
@@ -355,7 +355,7 @@ static arm_lpae_iopte arm_lpae_install_table(arm_lpae_iopte *table,static int __arm_lpae_map (struct arm_lpae_io_pgtable *data,unsigned long iova,phys_addr_t paddr,size_t size,arm_lpae_iopte prot, -int lvl,arm_lpae_iopte *ptep) +int lvl,arm_lpae_iopte *ptep,gfp_t gfp) {arm_lpae_iopte *cptep, pte;size_t block_size =ARM_LPAE_BLOCK_SIZE (lvl, data);
@@ -376,7 +376,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,/* Grab a pointer to the next level */ pte =READ_ONCE (*ptep);if (!pte) { - cptep =__arm_lpae_alloc_pages (tblsz,GFP_ATOMIC , cfg); + cptep =__arm_lpae_alloc_pages (tblsz, gfp, cfg);if (!cptep)return -ENOMEM ;
@@ -396,7 +396,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova, }/* Rinse, repeat */ -return __arm_lpae_map (data, iova, paddr, size, prot, lvl +1 , cptep); +return __arm_lpae_map (data, iova, paddr, size, prot, lvl +1 , cptep, gfp); } static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data,
@@ -461,7 +461,7 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data, }static int arm_lpae_map (struct io_pgtable_ops *ops,unsigned long iova, -phys_addr_t paddr,size_t size,int iommu_prot) +phys_addr_t paddr,size_t size,int iommu_prot,gfp_t gfp) {struct arm_lpae_io_pgtable *data =io_pgtable_ops_to_data (ops);struct io_pgtable_cfg *cfg = &data->iop.cfg;
@@ -483,7 +483,7 @@ static int arm_lpae_map(struct io_pgtable_ops *ops, unsigned long iova,return -ERANGE ; prot =arm_lpae_prot_to_pte (data, iommu_prot); - ret =__arm_lpae_map (data, iova, paddr, size, prot, lvl, ptep); + ret =__arm_lpae_map (data, iova, paddr, size, prot, lvl, ptep, gfp);/* * Synchronise all PTE updates for the new mapping before there's * a chance for anything to kick off a table walk for the new iova.
@@ -1178,12 +1178,12 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)if (ops->map (ops, iova, iova, size,IOMMU_READ |IOMMU_WRITE |IOMMU_NOEXEC | -IOMMU_CACHE )) +IOMMU_CACHE ,GFP_KERNEL ))return __FAIL (ops, i);/* Overlapping mappings */ if (!ops->map (ops, iova, iova + size, size, -IOMMU_READ |IOMMU_NOEXEC )) +IOMMU_READ |IOMMU_NOEXEC ,GFP_KERNEL ))return __FAIL (ops, i);if (ops->iova_to_phys (ops, iova +42 ) != (iova +42 ))
@@ -1198,7 +1198,7 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)return __FAIL (ops, i);/* Remap of partial unmap */ -if (ops->map (ops,SZ_1G + size, size, size,IOMMU_READ )) +if (ops->map (ops,SZ_1G + size, size, size,IOMMU_READ ,GFP_KERNEL ))return __FAIL (ops, i);if (ops->iova_to_phys (ops,SZ_1G + size +42 ) != (size +42 ))
@@ -1216,7 +1216,7 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)return __FAIL (ops, i);/* Remap full block */ -if (ops->map (ops, iova, iova, size,IOMMU_WRITE )) +if (ops->map (ops, iova, iova, size,IOMMU_WRITE ,GFP_KERNEL ))return __FAIL (ops, i);if (ops->iova_to_phys (ops, iova +42 ) != (iova +42 ))
drivers/iommu/ipmmu-vmsa.c +1 -1
@@ -687,7 +687,7 @@ static int ipmmu_map(struct iommu_domain *io_domain, unsigned long iova,if (!domain)return -ENODEV ; -return domain->iop->map (domain->iop, iova, paddr, size, prot); +return domain->iop->map (domain->iop, iova, paddr, size, prot, gfp); } static size_t ipmmu_unmap(struct iommu_domain *io_domain, unsigned long iova,
drivers/iommu/msm_iommu.c +1 -1
@@ -491,7 +491,7 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long iova,int ret;spin_lock_irqsave (&priv->pgtlock, flags); - ret = priv->iop->map (priv->iop, iova, pa, len, prot); + ret = priv->iop->map (priv->iop, iova, pa, len, prot,GFP_ATOMIC );spin_unlock_irqrestore (&priv->pgtlock, flags);return ret;
drivers/iommu/mtk_iommu.c +1 -1
@@ -397,7 +397,7 @@ static int mtk_iommu_map(struct iommu_domain *domain, unsigned long iova, paddr |=BIT_ULL (32 );/* Synchronize with the tlb_lock */ -return dom->iop->map (dom->iop, iova, paddr, size, prot); +return dom->iop->map (dom->iop, iova, paddr, size, prot, gfp); } static size_t mtk_iommu_unmap(struct iommu_domain *domain,
drivers/iommu/qcom_iommu.c +1 -1
@@ -441,7 +441,7 @@ static int qcom_iommu_map(struct iommu_domain *domain, unsigned long iova,return -ENODEV ;spin_lock_irqsave (&qcom_domain->pgtbl_lock, flags); - ret = ops->map (ops, iova, paddr, size, prot); + ret = ops->map (ops, iova, paddr, size, prot,GFP_ATOMIC );spin_unlock_irqrestore (&qcom_domain->pgtbl_lock, flags);return ret; }
include/linux/io-pgtable.h +1 -1
@@ -155,7 +155,7 @@ struct io_pgtable_cfg {*/ struct io_pgtable_ops {int (*map)(struct io_pgtable_ops *ops,unsigned long iova, -phys_addr_t paddr,size_t size,int prot); +phys_addr_t paddr,size_t size,int prot,gfp_t gfp);size_t (*unmap)(struct io_pgtable_ops *ops,unsigned long iova,size_t size,struct iommu_iotlb_gather *gather); phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops,
Signature · 1 line
1.8.3.1
Re: [PATCH v2 2/2] iommu: Add gfp parameter to io_pgtable_ops->map()
Quoted 8 lines · Baolin Wang
Now the ARM page tables are always allocated by
GFP_ATOMICparameter, but theiommu_ops->map()function has been added agfp_tparameter by commit781ca2de89ba("iommu: Add gfp parameter toiommu_ops::map"), thusio_pgtable_ops->map()should use the gfp parameter passed fromiommu_ops->map()to allocate page pages, which can avoid wasting the memory allocators atomic pools for some non-atomic contexts.Signed-off-by Baolin Wang <[email protected]>
Quoted 12 lines
--- drivers/gpu/drm/panfrost/panfrost_mmu.c | 2 +- drivers/iommu/arm-smmu-v3.c | 2 +- drivers/iommu/arm-smmu.c | 2 +- drivers/iommu/io-pgtable-arm-v7s.c | 18 +++++++++--------- drivers/iommu/io-pgtable-arm.c | 18 +++++++++--------- drivers/iommu/ipmmu-vmsa.c | 2 +- drivers/iommu/msm_iommu.c | 2 +- drivers/iommu/mtk_iommu.c | 2 +- drivers/iommu/qcom_iommu.c | 2 +- include/linux/io-pgtable.h | 2 +- 10 files changed, 26 insertions(+), 26 deletions(-)
I was a bit nervous about us passing GFP_KERNEL with a spinlock held, but it looks like you've checked all the callsites and it looks fine to me, so:
Joerg -- not sure what you want to do with this one, as it's likely to conflict (trivially) with unrelated driver changes.
Will
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v2 2/2] iommu: Add gfp parameter to io_pgtable_ops->map()
Quoted 22 lines · Will Deacon
Quoted 8 lines · Baolin Wang
Now the ARM page tables are always allocated by
GFP_ATOMICparameter, but theiommu_ops->map()function has been added agfp_tparameter by commit781ca2de89ba("iommu: Add gfp parameter toiommu_ops::map"), thusio_pgtable_ops->map()should use the gfp parameter passed fromiommu_ops->map()to allocate page pages, which can avoid wasting the memory allocators atomic pools for some non-atomic contexts.Signed-off-by Baolin Wang <[email protected]>Quoted 12 lines
--- drivers/gpu/drm/panfrost/panfrost_mmu.c | 2 +- drivers/iommu/arm-smmu-v3.c | 2 +- drivers/iommu/arm-smmu.c | 2 +- drivers/iommu/io-pgtable-arm-v7s.c | 18 +++++++++--------- drivers/iommu/io-pgtable-arm.c | 18 +++++++++--------- drivers/iommu/ipmmu-vmsa.c | 2 +- drivers/iommu/msm_iommu.c | 2 +- drivers/iommu/mtk_iommu.c | 2 +- drivers/iommu/qcom_iommu.c | 2 +- include/linux/io-pgtable.h | 2 +- 10 files changed, 26 insertions(+), 26 deletions(-)
Quoted 7 lines
I was a bit nervous about us passing
GFP_KERNELwith a spinlock held, but it looks like you've checked all the callsites and it looks fine to me, so:Acked-by Will Deacon <[email protected]>Joerg -- not sure what you want to do with this one, as it's likely to conflict (trivially) with unrelated driver changes.
Thanks Will. Joerg, could you apply this 2 patches if no objection from your side? Thanks.
Re: [PATCH v2 2/2] iommu: Add gfp parameter to io_pgtable_ops->map()
Quoted 2 lines · Baolin Wang
Thanks Will. Joerg, could you apply this 2 patches if no objection from your side? Thanks.
Applied both, thanks. Modified the first patch because another patch already made __iommu_map static.