diff mbox series

[RFC] iommu: io-pgtable: Drop WARN for empty PTEs on unmap

Message ID 20190710223119.8151-1-robh@kernel.org (mailing list archive)
State New, archived
Headers show
Series [RFC] iommu: io-pgtable: Drop WARN for empty PTEs on unmap | expand

Commit Message

Rob Herring July 10, 2019, 10:31 p.m. UTC
If a region has been mapped sparsely (such as on page faults), the user
has to keep track of what was mapped or not in order to avoid warnings
when unmapping the entire region. Remove the WARN on empty PTEs to allow
unmapping sparsely mapped regions.

Cc: Will Deacon <will@kernel.org>
Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: iommu@lists.linux-foundation.org
Signed-off-by: Rob Herring <robh@kernel.org>
---
This is needed for large (up to 1GB AIUI) scratch buffers on panfrost 
which are mapped on demand on GPU page faults and can be unmapped on 
memory pressure. Alternatively, I'd need to have a bitmap of mapped 
pages to track what is mapped or not. Dropping the WARN seems like a 
much simpler solution.

This will need to go thru the DRM tree once I've gotten the panfrost 
side finished, but wanted some early feedback.

Rob

 drivers/iommu/io-pgtable-arm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Will Deacon July 11, 2019, 10:23 a.m. UTC | #1
On Wed, Jul 10, 2019 at 04:31:19PM -0600, Rob Herring wrote:
> If a region has been mapped sparsely (such as on page faults), the user
> has to keep track of what was mapped or not in order to avoid warnings
> when unmapping the entire region. Remove the WARN on empty PTEs to allow
> unmapping sparsely mapped regions.
> 
> Cc: Will Deacon <will@kernel.org>
> Cc: Robin Murphy <robin.murphy@arm.com>
> Cc: Joerg Roedel <joro@8bytes.org>
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: iommu@lists.linux-foundation.org
> Signed-off-by: Rob Herring <robh@kernel.org>
> ---
> This is needed for large (up to 1GB AIUI) scratch buffers on panfrost 
> which are mapped on demand on GPU page faults and can be unmapped on 
> memory pressure. Alternatively, I'd need to have a bitmap of mapped 
> pages to track what is mapped or not. Dropping the WARN seems like a 
> much simpler solution.

I suppose an alternative would be to do an iova_to_phys() before you do the
unmap(). Would that be acceptable? The WARN_ON() indicates invalid usage by
the IOMMU API, so it would be a shame to lose it entirely and I'm hesitant
to continue adding quirks at the rate we're currently doing so!

Will
Rob Herring July 11, 2019, 5:39 p.m. UTC | #2
On Thu, Jul 11, 2019 at 4:23 AM Will Deacon <will@kernel.org> wrote:
>
> On Wed, Jul 10, 2019 at 04:31:19PM -0600, Rob Herring wrote:
> > If a region has been mapped sparsely (such as on page faults), the user
> > has to keep track of what was mapped or not in order to avoid warnings
> > when unmapping the entire region. Remove the WARN on empty PTEs to allow
> > unmapping sparsely mapped regions.
> >
> > Cc: Will Deacon <will@kernel.org>
> > Cc: Robin Murphy <robin.murphy@arm.com>
> > Cc: Joerg Roedel <joro@8bytes.org>
> > Cc: linux-arm-kernel@lists.infradead.org
> > Cc: iommu@lists.linux-foundation.org
> > Signed-off-by: Rob Herring <robh@kernel.org>
> > ---
> > This is needed for large (up to 1GB AIUI) scratch buffers on panfrost
> > which are mapped on demand on GPU page faults and can be unmapped on
> > memory pressure. Alternatively, I'd need to have a bitmap of mapped
> > pages to track what is mapped or not. Dropping the WARN seems like a
> > much simpler solution.
>
> I suppose an alternative would be to do an iova_to_phys() before you do the
> unmap(). Would that be acceptable?

Yeah, that should work. Not that efficient, but I don't think
releasing the memory is hot path.

Thanks,
Rob

> The WARN_ON() indicates invalid usage by
> the IOMMU API, so it would be a shame to lose it entirely and I'm hesitant
> to continue adding quirks at the rate we're currently doing so!
>
> Will
diff mbox series

Patch

diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
index 4e21efbc4459..43971638a5aa 100644
--- a/drivers/iommu/io-pgtable-arm.c
+++ b/drivers/iommu/io-pgtable-arm.c
@@ -611,7 +611,7 @@  static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
 
 	ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
 	pte = READ_ONCE(*ptep);
-	if (WARN_ON(!pte))
+	if (!pte)
 		return 0;
 
 	/* If the size matches this level, we're in the right place */