While buddy system fallbacks to allocate different migration type pages, it prefers the largest feasible pages and might split the chosen page into smalller ones. If the largest feasible pages are less than or equal to orde-3 and migration fallback happens frequently, then order-2 and order-3 pages can be exhausted easily. This patch aims to allocate the smallest feasible pages for the fallback mechanism under this condition. Signed-off-by: ChengYi He <chengyihetaipei@xxxxxxxxx> --- mm/page_alloc.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 50c325a..3fcb653 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1802,9 +1802,22 @@ __rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype) struct page *page; /* Find the largest possible block of pages in the other list */ - for (current_order = MAX_ORDER-1; - current_order >= order && current_order <= MAX_ORDER-1; - --current_order) { + for (current_order = MAX_ORDER - 1; + current_order >= max_t(unsigned int, PAGE_ALLOC_COSTLY_ORDER + 1, order); + --current_order) { + page = __rmqueue_fallback_order(zone, order, start_migratetype, + current_order); + + if (page) + return page; + } + + /* + * While current_order <= PAGE_ALLOC_COSTLY_ORDER, find the smallest + * feasible pages in the other list to avoid splitting high order pages + */ + for (current_order = order; current_order <= PAGE_ALLOC_COSTLY_ORDER; + ++current_order) { page = __rmqueue_fallback_order(zone, order, start_migratetype, current_order); -- 1.9.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>