On 18/08/2020 09:40, Leonardo Bras wrote: > 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 <[email protected]> > --- > arch/powerpc/kernel/iommu.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c > index d7086087830f..7f603d4e62d4 100644 > --- a/arch/powerpc/kernel/iommu.c > +++ b/arch/powerpc/kernel/iommu.c > @@ -261,6 +261,15 @@ static unsigned long iommu_range_alloc(struct device > *dev, > 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; > + A nit: unnecessary new line. Reviewed-by: Alexey Kardashevskiy <[email protected]> > } else { > /* Give up */ > spin_unlock_irqrestore(&(pool->lock), flags); > -- Alexey

