Memory allocation routines are expected to report allocation errors to kernel log. However, current implementation of __iommu_dma_alloc_pages() adds __GFP_NOWARN for all calls to alloc_pages(), which completely disables any logging.
Fix it by adding __GFP_NOWARN only to high order allocation attempts, which are not critical. Signed-off-by: Tomasz Figa <[email protected]> Reviewed-by: Robin Murphy <[email protected]> --- drivers/iommu/dma-iommu.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) Changes from v1: - Fix typo in subject. - Add Robin's Reviewed-by. diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index bf23989b5158..6ed8c8f941d8 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -433,6 +433,7 @@ static struct page **__iommu_dma_alloc_pages(unsigned int count, { struct page **pages; unsigned int i = 0, array_size = count * sizeof(*pages); + const gfp_t high_order_gfp = __GFP_NOWARN | __GFP_NORETRY; order_mask &= (2U << MAX_ORDER) - 1; if (!order_mask) @@ -452,8 +453,6 @@ static struct page **__iommu_dma_alloc_pages(unsigned int count, if (!(gfp & (__GFP_DMA | __GFP_DMA32))) gfp |= __GFP_HIGHMEM; - gfp |= __GFP_NOWARN; - while (count) { struct page *page = NULL; unsigned int order_size; @@ -469,7 +468,7 @@ static struct page **__iommu_dma_alloc_pages(unsigned int count, order_size = 1U << order; page = alloc_pages((order_mask - order_size) ? - gfp | __GFP_NORETRY : gfp, order); + gfp | high_order_gfp : gfp, order); if (!page) continue; if (!order) -- 2.13.2.725.g09c95d1e9-goog

