powerpc/kernel/iommu: Use largepool as a last resort when !largealloc
authorLeonardo Bras <leobras.c@gmail.com>
Thu, 18 Mar 2021 17:44:17 +0000 (14:44 -0300)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 23 Apr 2021 02:54:58 +0000 (12:54 +1000)
As of today, doing iommu_range_alloc() only for !largealloc (npages <= 15)
will only be able to use 3/4 of the available pages, given pages on
largepool  not being available for !largealloc.

This could mean some drivers not being able to fully use all the available
pages for the DMA window.

Add pages on largepool as a last resort for !largealloc, making all pages
of the DMA window available.

Signed-off-by: Leonardo Bras <leobras.c@gmail.com>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210318174414.684630-2-leobras.c@gmail.com
arch/powerpc/kernel/iommu.c

index 24208cd00aef679296633a4ba11ee0f648bc8222..57d6b85e9b964f1339f9656a893e8c3ba87ee545 100644 (file)
@@ -296,6 +296,15 @@ again:
                        pass++;
                        goto again;
 
+               } else if (pass == tbl->nr_pools + 1) {
+                       /* Last resort: try largepool */
+                       spin_unlock(&pool->lock);
+                       pool = &tbl->large_pool;
+                       spin_lock(&pool->lock);
+                       pool->hint = pool->start;
+                       pass++;
+                       goto again;
+
                } else {
                        /* Give up */
                        spin_unlock_irqrestore(&(pool->lock), flags);