diff options
-rw-r--r-- | arch/arm/mm/dma-mapping.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index c27447653903..f9941cd689e9 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -1135,13 +1135,28 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, | |||
1135 | gfp |= __GFP_NOWARN | __GFP_HIGHMEM; | 1135 | gfp |= __GFP_NOWARN | __GFP_HIGHMEM; |
1136 | 1136 | ||
1137 | while (count) { | 1137 | while (count) { |
1138 | int j, order = __fls(count); | 1138 | int j, order; |
1139 | |||
1140 | for (order = __fls(count); order > 0; --order) { | ||
1141 | /* | ||
1142 | * We do not want OOM killer to be invoked as long | ||
1143 | * as we can fall back to single pages, so we force | ||
1144 | * __GFP_NORETRY for orders higher than zero. | ||
1145 | */ | ||
1146 | pages[i] = alloc_pages(gfp | __GFP_NORETRY, order); | ||
1147 | if (pages[i]) | ||
1148 | break; | ||
1149 | } | ||
1139 | 1150 | ||
1140 | pages[i] = alloc_pages(gfp, order); | 1151 | if (!pages[i]) { |
1141 | while (!pages[i] && order) | 1152 | /* |
1142 | pages[i] = alloc_pages(gfp, --order); | 1153 | * Fall back to single page allocation. |
1143 | if (!pages[i]) | 1154 | * Might invoke OOM killer as last resort. |
1144 | goto error; | 1155 | */ |
1156 | pages[i] = alloc_pages(gfp, 0); | ||
1157 | if (!pages[i]) | ||
1158 | goto error; | ||
1159 | } | ||
1145 | 1160 | ||
1146 | if (order) { | 1161 | if (order) { |
1147 | split_page(pages[i], order); | 1162 | split_page(pages[i], order); |