@@ -1117,25 +1117,24 @@ static inline void __free_one_page(struct page *page,
1117
1117
}
1118
1118
if (order < MAX_ORDER - 1 ) {
1119
1119
/* If we are here, it means order is >= pageblock_order.
1120
- * We want to prevent merge between freepages on isolate
1121
- * pageblock and normal pageblock. Without this, pageblock
1122
- * isolation could cause incorrect freepage or CMA accounting.
1120
+ * We want to prevent merge between freepages on pageblock
1121
+ * without fallbacks and normal pageblock. Without this,
1122
+ * pageblock isolation could cause incorrect freepage or CMA
1123
+ * accounting or HIGHATOMIC accounting.
1123
1124
*
1124
1125
* We don't want to hit this code for the more frequent
1125
1126
* low-order merging.
1126
1127
*/
1127
- if (unlikely (has_isolate_pageblock (zone ))) {
1128
- int buddy_mt ;
1128
+ int buddy_mt ;
1129
1129
1130
- buddy_pfn = __find_buddy_pfn (pfn , order );
1131
- buddy = page + (buddy_pfn - pfn );
1132
- buddy_mt = get_pageblock_migratetype (buddy );
1130
+ buddy_pfn = __find_buddy_pfn (pfn , order );
1131
+ buddy = page + (buddy_pfn - pfn );
1132
+ buddy_mt = get_pageblock_migratetype (buddy );
1133
1133
1134
- if (migratetype != buddy_mt
1135
- && (is_migrate_isolate (migratetype ) ||
1136
- is_migrate_isolate (buddy_mt )))
1137
- goto done_merging ;
1138
- }
1134
+ if (migratetype != buddy_mt
1135
+ && (!migratetype_is_mergeable (migratetype ) ||
1136
+ !migratetype_is_mergeable (buddy_mt )))
1137
+ goto done_merging ;
1139
1138
max_order = order + 1 ;
1140
1139
goto continue_merging ;
1141
1140
}
@@ -2479,17 +2478,13 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
2479
2478
/*
2480
2479
* This array describes the order lists are fallen back to when
2481
2480
* the free lists for the desirable migrate type are depleted
2481
+ *
2482
+ * The other migratetypes do not have fallbacks.
2482
2483
*/
2483
2484
static int fallbacks [MIGRATE_TYPES ][3 ] = {
2484
2485
[MIGRATE_UNMOVABLE ] = { MIGRATE_RECLAIMABLE , MIGRATE_MOVABLE , MIGRATE_TYPES },
2485
2486
[MIGRATE_MOVABLE ] = { MIGRATE_RECLAIMABLE , MIGRATE_UNMOVABLE , MIGRATE_TYPES },
2486
2487
[MIGRATE_RECLAIMABLE ] = { MIGRATE_UNMOVABLE , MIGRATE_MOVABLE , MIGRATE_TYPES },
2487
- #ifdef CONFIG_CMA
2488
- [MIGRATE_CMA ] = { MIGRATE_TYPES }, /* Never used */
2489
- #endif
2490
- #ifdef CONFIG_MEMORY_ISOLATION
2491
- [MIGRATE_ISOLATE ] = { MIGRATE_TYPES }, /* Never used */
2492
- #endif
2493
2488
};
2494
2489
2495
2490
#ifdef CONFIG_CMA
@@ -2795,8 +2790,8 @@ static void reserve_highatomic_pageblock(struct page *page, struct zone *zone,
2795
2790
2796
2791
/* Yoink! */
2797
2792
mt = get_pageblock_migratetype (page );
2798
- if (! is_migrate_highatomic ( mt ) && ! is_migrate_isolate ( mt )
2799
- && ! is_migrate_cma (mt )) {
2793
+ /* Only reserve normal pageblocks (i.e., they can merge with others) */
2794
+ if ( migratetype_is_mergeable (mt )) {
2800
2795
zone -> nr_reserved_highatomic += pageblock_nr_pages ;
2801
2796
set_pageblock_migratetype (page , MIGRATE_HIGHATOMIC );
2802
2797
move_freepages_block (zone , page , MIGRATE_HIGHATOMIC , NULL );
@@ -3545,8 +3540,11 @@ int __isolate_free_page(struct page *page, unsigned int order)
3545
3540
struct page * endpage = page + (1 << order ) - 1 ;
3546
3541
for (; page < endpage ; page += pageblock_nr_pages ) {
3547
3542
int mt = get_pageblock_migratetype (page );
3548
- if (!is_migrate_isolate (mt ) && !is_migrate_cma (mt )
3549
- && !is_migrate_highatomic (mt ))
3543
+ /*
3544
+ * Only change normal pageblocks (i.e., they can merge
3545
+ * with others)
3546
+ */
3547
+ if (migratetype_is_mergeable (mt ))
3550
3548
set_pageblock_migratetype (page ,
3551
3549
MIGRATE_MOVABLE );
3552
3550
}
0 commit comments