|
|
@@ -1032,11 +1032,9 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
|
|
|
static int fallbacks[MIGRATE_TYPES][4] = {
|
|
|
[MIGRATE_UNMOVABLE] = { MIGRATE_RECLAIMABLE, MIGRATE_MOVABLE, MIGRATE_RESERVE },
|
|
|
[MIGRATE_RECLAIMABLE] = { MIGRATE_UNMOVABLE, MIGRATE_MOVABLE, MIGRATE_RESERVE },
|
|
|
+ [MIGRATE_MOVABLE] = { MIGRATE_RECLAIMABLE, MIGRATE_UNMOVABLE, MIGRATE_RESERVE },
|
|
|
#ifdef CONFIG_CMA
|
|
|
- [MIGRATE_MOVABLE] = { MIGRATE_CMA, MIGRATE_RECLAIMABLE, MIGRATE_UNMOVABLE, MIGRATE_RESERVE },
|
|
|
[MIGRATE_CMA] = { MIGRATE_RESERVE }, /* Never used */
|
|
|
-#else
|
|
|
- [MIGRATE_MOVABLE] = { MIGRATE_RECLAIMABLE, MIGRATE_UNMOVABLE, MIGRATE_RESERVE },
|
|
|
#endif
|
|
|
[MIGRATE_RESERVE] = { MIGRATE_RESERVE }, /* Never used */
|
|
|
#ifdef CONFIG_MEMORY_ISOLATION
|
|
|
@@ -1044,6 +1042,17 @@ static int fallbacks[MIGRATE_TYPES][4] = {
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
+#ifdef CONFIG_CMA
|
|
|
+static struct page *__rmqueue_cma_fallback(struct zone *zone,
|
|
|
+ unsigned int order)
|
|
|
+{
|
|
|
+ return __rmqueue_smallest(zone, order, MIGRATE_CMA);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline struct page *__rmqueue_cma_fallback(struct zone *zone,
|
|
|
+ unsigned int order) { return NULL; }
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Move the free pages in a range to the free lists of the requested type.
|
|
|
* Note that start_page and end_pages are not aligned on a pageblock
|
|
|
@@ -1195,19 +1204,8 @@ __rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype)
|
|
|
struct page, lru);
|
|
|
area->nr_free--;
|
|
|
|
|
|
- if (!is_migrate_cma(migratetype)) {
|
|
|
- try_to_steal_freepages(zone, page,
|
|
|
- start_migratetype,
|
|
|
- migratetype);
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * When borrowing from MIGRATE_CMA, we need to
|
|
|
- * release the excess buddy pages to CMA
|
|
|
- * itself, and we do not try to steal extra
|
|
|
- * free pages.
|
|
|
- */
|
|
|
- buddy_type = migratetype;
|
|
|
- }
|
|
|
+ try_to_steal_freepages(zone, page, start_migratetype,
|
|
|
+ migratetype);
|
|
|
|
|
|
/* Remove the page from the freelists */
|
|
|
list_del(&page->lru);
|
|
|
@@ -1249,7 +1247,11 @@ retry_reserve:
|
|
|
page = __rmqueue_smallest(zone, order, migratetype);
|
|
|
|
|
|
if (unlikely(!page) && migratetype != MIGRATE_RESERVE) {
|
|
|
- page = __rmqueue_fallback(zone, order, migratetype);
|
|
|
+ if (migratetype == MIGRATE_MOVABLE)
|
|
|
+ page = __rmqueue_cma_fallback(zone, order);
|
|
|
+
|
|
|
+ if (!page)
|
|
|
+ page = __rmqueue_fallback(zone, order, migratetype);
|
|
|
|
|
|
/*
|
|
|
* Use MIGRATE_RESERVE rather than fail an allocation. goto
|