Re: [RFC PATCH v4 12/15] iommu/io-pgtable-arm-v7s: Implement arm_v7s_unmap_pages()
On Thu, Apr 08, 2021 at 07:19:29AM -0700, isa...@codeaurora.org wrote: > On 2021-04-08 06:58, Will Deacon wrote: > > On Wed, Apr 07, 2021 at 09:52:38PM -0700, Isaac J. Manjarres wrote: > > > Implement the unmap_pages() callback for the ARM v7s io-pgtable > > > format. > > > > > > Signed-off-by: Isaac J. Manjarres > > > --- > > > drivers/iommu/io-pgtable-arm-v7s.c | 23 --- > > > 1 file changed, 20 insertions(+), 3 deletions(-) > > > > > > diff --git a/drivers/iommu/io-pgtable-arm-v7s.c > > > b/drivers/iommu/io-pgtable-arm-v7s.c > > > index d4004bcf333a..5e203e03c352 100644 > > > --- a/drivers/iommu/io-pgtable-arm-v7s.c > > > +++ b/drivers/iommu/io-pgtable-arm-v7s.c > > > @@ -710,15 +710,32 @@ static size_t __arm_v7s_unmap(struct > > > arm_v7s_io_pgtable *data, > > > return __arm_v7s_unmap(data, gather, iova, size, lvl + 1, ptep); > > > } > > > > > > -static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned > > > long iova, > > > - size_t size, struct iommu_iotlb_gather *gather) > > > +static size_t arm_v7s_unmap_pages(struct io_pgtable_ops *ops, > > > unsigned long iova, > > > + size_t pgsize, size_t pgcount, > > > + struct iommu_iotlb_gather *gather) > > > { > > > struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops); > > > + size_t unmapped = 0, ret; > > > > > > if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias))) > > > return 0; > > > > > > - return __arm_v7s_unmap(data, gather, iova, size, 1, data->pgd); > > > + while (pgcount--) { > > > + ret = __arm_v7s_unmap(data, gather, iova, pgsize, 1, data->pgd); > > > + if (!ret) > > > + break; > > > + > > > + unmapped += pgsize; > > > + iova += pgsize; > > > + } > > > + > > > + return unmapped; > > > +} > > > > Wait -- don't you need to hook this up somewhere (likewise for > > ->map_pages)? > Done. Likewise for map_pages(). I'm not sure how the compiler didn't catch > this; I'm compile testing this, as I don't have hardware that uses the short > descriptor format. Damn, neither do I :/ My seattle has all the memory high up iirc. Will ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [RFC PATCH v4 12/15] iommu/io-pgtable-arm-v7s: Implement arm_v7s_unmap_pages()
On 2021-04-08 06:58, Will Deacon wrote: On Wed, Apr 07, 2021 at 09:52:38PM -0700, Isaac J. Manjarres wrote: Implement the unmap_pages() callback for the ARM v7s io-pgtable format. Signed-off-by: Isaac J. Manjarres --- drivers/iommu/io-pgtable-arm-v7s.c | 23 --- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c index d4004bcf333a..5e203e03c352 100644 --- a/drivers/iommu/io-pgtable-arm-v7s.c +++ b/drivers/iommu/io-pgtable-arm-v7s.c @@ -710,15 +710,32 @@ static size_t __arm_v7s_unmap(struct arm_v7s_io_pgtable *data, return __arm_v7s_unmap(data, gather, iova, size, lvl + 1, ptep); } -static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned long iova, - size_t size, struct iommu_iotlb_gather *gather) +static size_t arm_v7s_unmap_pages(struct io_pgtable_ops *ops, unsigned long iova, + size_t pgsize, size_t pgcount, + struct iommu_iotlb_gather *gather) { struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops); + size_t unmapped = 0, ret; if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias))) return 0; - return __arm_v7s_unmap(data, gather, iova, size, 1, data->pgd); + while (pgcount--) { + ret = __arm_v7s_unmap(data, gather, iova, pgsize, 1, data->pgd); + if (!ret) + break; + + unmapped += pgsize; + iova += pgsize; + } + + return unmapped; +} Wait -- don't you need to hook this up somewhere (likewise for ->map_pages)? Done. Likewise for map_pages(). I'm not sure how the compiler didn't catch this; I'm compile testing this, as I don't have hardware that uses the short descriptor format. How are you testing this? Will ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [RFC PATCH v4 12/15] iommu/io-pgtable-arm-v7s: Implement arm_v7s_unmap_pages()
On Wed, Apr 07, 2021 at 09:52:38PM -0700, Isaac J. Manjarres wrote: > Implement the unmap_pages() callback for the ARM v7s io-pgtable > format. > > Signed-off-by: Isaac J. Manjarres > --- > drivers/iommu/io-pgtable-arm-v7s.c | 23 --- > 1 file changed, 20 insertions(+), 3 deletions(-) > > diff --git a/drivers/iommu/io-pgtable-arm-v7s.c > b/drivers/iommu/io-pgtable-arm-v7s.c > index d4004bcf333a..5e203e03c352 100644 > --- a/drivers/iommu/io-pgtable-arm-v7s.c > +++ b/drivers/iommu/io-pgtable-arm-v7s.c > @@ -710,15 +710,32 @@ static size_t __arm_v7s_unmap(struct arm_v7s_io_pgtable > *data, > return __arm_v7s_unmap(data, gather, iova, size, lvl + 1, ptep); > } > > -static size_t arm_v7s_unmap(struct io_pgtable_ops *ops, unsigned long iova, > - size_t size, struct iommu_iotlb_gather *gather) > +static size_t arm_v7s_unmap_pages(struct io_pgtable_ops *ops, unsigned long > iova, > + size_t pgsize, size_t pgcount, > + struct iommu_iotlb_gather *gather) > { > struct arm_v7s_io_pgtable *data = io_pgtable_ops_to_data(ops); > + size_t unmapped = 0, ret; > > if (WARN_ON(iova >= (1ULL << data->iop.cfg.ias))) > return 0; > > - return __arm_v7s_unmap(data, gather, iova, size, 1, data->pgd); > + while (pgcount--) { > + ret = __arm_v7s_unmap(data, gather, iova, pgsize, 1, data->pgd); > + if (!ret) > + break; > + > + unmapped += pgsize; > + iova += pgsize; > + } > + > + return unmapped; > +} Wait -- don't you need to hook this up somewhere (likewise for ->map_pages)? How are you testing this? Will ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu