Loading arch/arm64/mm/dma-mapping.c +13 −2 Original line number Original line Diff line number Diff line Loading @@ -1230,6 +1230,9 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, size_t array_size = count * sizeof(struct page *); size_t array_size = count * sizeof(struct page *); int i = 0; int i = 0; bool is_coherent = is_dma_coherent(dev, attrs); bool is_coherent = is_dma_coherent(dev, attrs); struct dma_iommu_mapping *mapping = dev->archdata.mapping; unsigned int alloc_sizes = mapping->domain->pgsize_bitmap; unsigned long order_mask; if (array_size <= PAGE_SIZE) if (array_size <= PAGE_SIZE) pages = kzalloc(array_size, gfp); pages = kzalloc(array_size, gfp); Loading Loading @@ -1258,14 +1261,22 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, * IOMMU can map any pages, so himem can also be used here * IOMMU can map any pages, so himem can also be used here */ */ gfp |= __GFP_NOWARN | __GFP_HIGHMEM; gfp |= __GFP_NOWARN | __GFP_HIGHMEM; order_mask = alloc_sizes >> PAGE_SHIFT; order_mask &= (2U << MAX_ORDER) - 1; if (!order_mask) goto error; while (count) { while (count) { int j, order = __fls(count); int j, order; order_mask &= (2U << __fls(count)) - 1; order = __fls(order_mask); pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & ~__GFP_RECLAIM : gfp, order); ~__GFP_RECLAIM : gfp, order); while (!pages[i] && order) { while (!pages[i] && order) { order--; order_mask &= ~(1U << order); order = __fls(order_mask); pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & ~__GFP_RECLAIM : gfp, order); ~__GFP_RECLAIM : gfp, order); } } Loading Loading
arch/arm64/mm/dma-mapping.c +13 −2 Original line number Original line Diff line number Diff line Loading @@ -1230,6 +1230,9 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, size_t array_size = count * sizeof(struct page *); size_t array_size = count * sizeof(struct page *); int i = 0; int i = 0; bool is_coherent = is_dma_coherent(dev, attrs); bool is_coherent = is_dma_coherent(dev, attrs); struct dma_iommu_mapping *mapping = dev->archdata.mapping; unsigned int alloc_sizes = mapping->domain->pgsize_bitmap; unsigned long order_mask; if (array_size <= PAGE_SIZE) if (array_size <= PAGE_SIZE) pages = kzalloc(array_size, gfp); pages = kzalloc(array_size, gfp); Loading Loading @@ -1258,14 +1261,22 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, * IOMMU can map any pages, so himem can also be used here * IOMMU can map any pages, so himem can also be used here */ */ gfp |= __GFP_NOWARN | __GFP_HIGHMEM; gfp |= __GFP_NOWARN | __GFP_HIGHMEM; order_mask = alloc_sizes >> PAGE_SHIFT; order_mask &= (2U << MAX_ORDER) - 1; if (!order_mask) goto error; while (count) { while (count) { int j, order = __fls(count); int j, order; order_mask &= (2U << __fls(count)) - 1; order = __fls(order_mask); pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & ~__GFP_RECLAIM : gfp, order); ~__GFP_RECLAIM : gfp, order); while (!pages[i] && order) { while (!pages[i] && order) { order--; order_mask &= ~(1U << order); order = __fls(order_mask); pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & pages[i] = alloc_pages(order ? (gfp | __GFP_NORETRY) & ~__GFP_RECLAIM : gfp, order); ~__GFP_RECLAIM : gfp, order); } } Loading