aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mm/dma-mapping.c27
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);