Message ID | 20231128204938.1453583-5-pasha.tatashin@soleen.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | IOMMU memory observability | expand |
Hej, On Tue, Nov 28, 2023, at 21:49, Pasha Tatashin wrote: > Convert iommu/io-pgtable-dart.c to use the new page allocation functions > provided in iommu-pages.h. > > Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com> > --- > drivers/iommu/io-pgtable-dart.c | 37 +++++++++++++-------------------- > 1 file changed, 14 insertions(+), 23 deletions(-) > > diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c > index 74b1ef2b96be..ad28031e1e93 100644 > --- a/drivers/iommu/io-pgtable-dart.c > +++ b/drivers/iommu/io-pgtable-dart.c > @@ -23,6 +23,7 @@ > #include <linux/types.h> > > #include <asm/barrier.h> > +#include "iommu-pages.h" > > #define DART1_MAX_ADDR_BITS 36 > > @@ -106,18 +107,12 @@ static phys_addr_t iopte_to_paddr(dart_iopte pte, > return paddr; > } > > -static void *__dart_alloc_pages(size_t size, gfp_t gfp, > - struct io_pgtable_cfg *cfg) > +static void *__dart_alloc_pages(size_t size, gfp_t gfp) > { > int order = get_order(size); > - struct page *p; > > VM_BUG_ON((gfp & __GFP_HIGHMEM)); > - p = alloc_pages(gfp | __GFP_ZERO, order); > - if (!p) > - return NULL; > - > - return page_address(p); > + return iommu_alloc_pages(gfp, order); > } > > static int dart_init_pte(struct dart_io_pgtable *data, > @@ -262,13 +257,13 @@ static int dart_map_pages(struct io_pgtable_ops > *ops, unsigned long iova, > > /* no L2 table present */ > if (!pte) { > - cptep = __dart_alloc_pages(tblsz, gfp, cfg); > + cptep = __dart_alloc_pages(tblsz, gfp); > if (!cptep) > return -ENOMEM; > > pte = dart_install_table(cptep, ptep, 0, data); > if (pte) > - free_pages((unsigned long)cptep, get_order(tblsz)); > + iommu_free_pages(cptep, get_order(tblsz)); > > /* L2 table is present (now) */ > pte = READ_ONCE(*ptep); > @@ -419,8 +414,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg > *cfg, void *cookie) > cfg->apple_dart_cfg.n_ttbrs = 1 << data->tbl_bits; > > for (i = 0; i < cfg->apple_dart_cfg.n_ttbrs; ++i) { > - data->pgd[i] = __dart_alloc_pages(DART_GRANULE(data), GFP_KERNEL, > - cfg); > + data->pgd[i] = __dart_alloc_pages(DART_GRANULE(data), GFP_KERNEL); > if (!data->pgd[i]) > goto out_free_data; > cfg->apple_dart_cfg.ttbr[i] = virt_to_phys(data->pgd[i]); > @@ -429,9 +423,10 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg > *cfg, void *cookie) > return &data->iop; > > out_free_data: > - while (--i >= 0) > - free_pages((unsigned long)data->pgd[i], > - get_order(DART_GRANULE(data))); > + while (--i >= 0) { > + iommu_free_pages(data->pgd[i], > + get_order(DART_GRANULE(data))); > + } > kfree(data); > return NULL; > } > @@ -439,6 +434,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg > *cfg, void *cookie) > static void apple_dart_free_pgtable(struct io_pgtable *iop) > { > struct dart_io_pgtable *data = io_pgtable_to_data(iop); > + int order = get_order(DART_GRANULE(data)); > dart_iopte *ptep, *end; > int i; > > @@ -449,15 +445,10 @@ static void apple_dart_free_pgtable(struct > io_pgtable *iop) > while (ptep != end) { > dart_iopte pte = *ptep++; > > - if (pte) { > - unsigned long page = > - (unsigned long)iopte_deref(pte, data); > - > - free_pages(page, get_order(DART_GRANULE(data))); > - } > + if (pte) > + iommu_free_pages(iopte_deref(pte, data), order); > } > - free_pages((unsigned long)data->pgd[i], > - get_order(DART_GRANULE(data))); > + iommu_free_pages(data->pgd[i], order); > } > > kfree(data); Reviewed-by: Janne Grunau <j@jannau.net> Janne
> Reviewed-by: Janne Grunau <j@jannau.net>
Thank you,
Pasha
diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c index 74b1ef2b96be..ad28031e1e93 100644 --- a/drivers/iommu/io-pgtable-dart.c +++ b/drivers/iommu/io-pgtable-dart.c @@ -23,6 +23,7 @@ #include <linux/types.h> #include <asm/barrier.h> +#include "iommu-pages.h" #define DART1_MAX_ADDR_BITS 36 @@ -106,18 +107,12 @@ static phys_addr_t iopte_to_paddr(dart_iopte pte, return paddr; } -static void *__dart_alloc_pages(size_t size, gfp_t gfp, - struct io_pgtable_cfg *cfg) +static void *__dart_alloc_pages(size_t size, gfp_t gfp) { int order = get_order(size); - struct page *p; VM_BUG_ON((gfp & __GFP_HIGHMEM)); - p = alloc_pages(gfp | __GFP_ZERO, order); - if (!p) - return NULL; - - return page_address(p); + return iommu_alloc_pages(gfp, order); } static int dart_init_pte(struct dart_io_pgtable *data, @@ -262,13 +257,13 @@ static int dart_map_pages(struct io_pgtable_ops *ops, unsigned long iova, /* no L2 table present */ if (!pte) { - cptep = __dart_alloc_pages(tblsz, gfp, cfg); + cptep = __dart_alloc_pages(tblsz, gfp); if (!cptep) return -ENOMEM; pte = dart_install_table(cptep, ptep, 0, data); if (pte) - free_pages((unsigned long)cptep, get_order(tblsz)); + iommu_free_pages(cptep, get_order(tblsz)); /* L2 table is present (now) */ pte = READ_ONCE(*ptep); @@ -419,8 +414,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) cfg->apple_dart_cfg.n_ttbrs = 1 << data->tbl_bits; for (i = 0; i < cfg->apple_dart_cfg.n_ttbrs; ++i) { - data->pgd[i] = __dart_alloc_pages(DART_GRANULE(data), GFP_KERNEL, - cfg); + data->pgd[i] = __dart_alloc_pages(DART_GRANULE(data), GFP_KERNEL); if (!data->pgd[i]) goto out_free_data; cfg->apple_dart_cfg.ttbr[i] = virt_to_phys(data->pgd[i]); @@ -429,9 +423,10 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) return &data->iop; out_free_data: - while (--i >= 0) - free_pages((unsigned long)data->pgd[i], - get_order(DART_GRANULE(data))); + while (--i >= 0) { + iommu_free_pages(data->pgd[i], + get_order(DART_GRANULE(data))); + } kfree(data); return NULL; } @@ -439,6 +434,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) static void apple_dart_free_pgtable(struct io_pgtable *iop) { struct dart_io_pgtable *data = io_pgtable_to_data(iop); + int order = get_order(DART_GRANULE(data)); dart_iopte *ptep, *end; int i; @@ -449,15 +445,10 @@ static void apple_dart_free_pgtable(struct io_pgtable *iop) while (ptep != end) { dart_iopte pte = *ptep++; - if (pte) { - unsigned long page = - (unsigned long)iopte_deref(pte, data); - - free_pages(page, get_order(DART_GRANULE(data))); - } + if (pte) + iommu_free_pages(iopte_deref(pte, data), order); } - free_pages((unsigned long)data->pgd[i], - get_order(DART_GRANULE(data))); + iommu_free_pages(data->pgd[i], order); } kfree(data);
Convert iommu/io-pgtable-dart.c to use the new page allocation functions provided in iommu-pages.h. Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com> --- drivers/iommu/io-pgtable-dart.c | 37 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 23 deletions(-)