|
@@ -1541,19 +1541,6 @@ failed:
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-/* The ALLOC_WMARK bits are used as an index to zone->watermark */
|
|
|
-#define ALLOC_WMARK_MIN WMARK_MIN
|
|
|
-#define ALLOC_WMARK_LOW WMARK_LOW
|
|
|
-#define ALLOC_WMARK_HIGH WMARK_HIGH
|
|
|
-#define ALLOC_NO_WATERMARKS 0x04 /* don't check watermarks at all */
|
|
|
-
|
|
|
-/* Mask to get the watermark bits */
|
|
|
-#define ALLOC_WMARK_MASK (ALLOC_NO_WATERMARKS-1)
|
|
|
-
|
|
|
-#define ALLOC_HARDER 0x10 /* try to alloc harder */
|
|
|
-#define ALLOC_HIGH 0x20 /* __GFP_HIGH set */
|
|
|
-#define ALLOC_CPUSET 0x40 /* check for correct cpuset */
|
|
|
-
|
|
|
#ifdef CONFIG_FAIL_PAGE_ALLOC
|
|
|
|
|
|
static struct {
|
|
@@ -1648,7 +1635,11 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
|
|
|
min -= min / 2;
|
|
|
if (alloc_flags & ALLOC_HARDER)
|
|
|
min -= min / 4;
|
|
|
-
|
|
|
+#ifdef CONFIG_CMA
|
|
|
+ /* If allocation can't use CMA areas don't use free CMA pages */
|
|
|
+ if (!(alloc_flags & ALLOC_CMA))
|
|
|
+ free_pages -= zone_page_state(z, NR_FREE_CMA_PAGES);
|
|
|
+#endif
|
|
|
if (free_pages <= min + lowmem_reserve)
|
|
|
return false;
|
|
|
for (o = 0; o < order; o++) {
|
|
@@ -2362,7 +2353,10 @@ gfp_to_alloc_flags(gfp_t gfp_mask)
|
|
|
unlikely(test_thread_flag(TIF_MEMDIE))))
|
|
|
alloc_flags |= ALLOC_NO_WATERMARKS;
|
|
|
}
|
|
|
-
|
|
|
+#ifdef CONFIG_CMA
|
|
|
+ if (allocflags_to_migratetype(gfp_mask) == MIGRATE_MOVABLE)
|
|
|
+ alloc_flags |= ALLOC_CMA;
|
|
|
+#endif
|
|
|
return alloc_flags;
|
|
|
}
|
|
|
|
|
@@ -2587,6 +2581,7 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
|
|
|
struct page *page = NULL;
|
|
|
int migratetype = allocflags_to_migratetype(gfp_mask);
|
|
|
unsigned int cpuset_mems_cookie;
|
|
|
+ int alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET;
|
|
|
|
|
|
gfp_mask &= gfp_allowed_mask;
|
|
|
|
|
@@ -2615,9 +2610,13 @@ retry_cpuset:
|
|
|
if (!preferred_zone)
|
|
|
goto out;
|
|
|
|
|
|
+#ifdef CONFIG_CMA
|
|
|
+ if (allocflags_to_migratetype(gfp_mask) == MIGRATE_MOVABLE)
|
|
|
+ alloc_flags |= ALLOC_CMA;
|
|
|
+#endif
|
|
|
/* First allocation attempt */
|
|
|
page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, nodemask, order,
|
|
|
- zonelist, high_zoneidx, ALLOC_WMARK_LOW|ALLOC_CPUSET,
|
|
|
+ zonelist, high_zoneidx, alloc_flags,
|
|
|
preferred_zone, migratetype);
|
|
|
if (unlikely(!page))
|
|
|
page = __alloc_pages_slowpath(gfp_mask, order,
|