mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
BACKPORT: mm/page_alloc: split out buddy removal code from rmqueue into separate helper
This is a preparation page to allow the buddy removal code to be reused in
a later patch.
No functional change.
Link: https://lkml.kernel.org/r/20220624125423.6126-4-mgorman@techsingularity.net
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
Tested-by: Minchan Kim <minchan@kernel.org>
Acked-by: Minchan Kim <minchan@kernel.org>
Reviewed-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Tested-by: Yu Zhao <yuzhao@google.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Michal Hocko <mhocko@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Bug: 230899966
(cherry picked from commit 589d9973c1)
[surenb: resolved conflicts created by
"ANDROID: cma: redirect page allocation to CMA"]
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Change-Id: I4584fbfdebf2637534d6a68635a44a81a176c253
This commit is contained in:
committed by
Carlos Llamas
parent
233075bea4
commit
273e22d4d9
@@ -3748,6 +3748,51 @@ static inline void zone_statistics(struct zone *preferred_zone, struct zone *z,
|
||||
#endif
|
||||
}
|
||||
|
||||
static __always_inline
|
||||
struct page *rmqueue_buddy(struct zone *preferred_zone, struct zone *zone,
|
||||
unsigned int order, unsigned int alloc_flags,
|
||||
int migratetype)
|
||||
{
|
||||
struct page *page;
|
||||
unsigned long flags;
|
||||
|
||||
do {
|
||||
page = NULL;
|
||||
spin_lock_irqsave(&zone->lock, flags);
|
||||
/*
|
||||
* order-0 request can reach here when the pcplist is skipped
|
||||
* due to non-CMA allocation context. HIGHATOMIC area is
|
||||
* reserved for high-order atomic allocation, so order-0
|
||||
* request should skip it.
|
||||
*/
|
||||
if (order > 0 && alloc_flags & ALLOC_HARDER) {
|
||||
page = __rmqueue_smallest(zone, order, MIGRATE_HIGHATOMIC);
|
||||
if (page)
|
||||
trace_mm_page_alloc_zone_locked(page, order, migratetype);
|
||||
}
|
||||
if (!page) {
|
||||
if (alloc_flags & ALLOC_CMA && migratetype == MIGRATE_MOVABLE)
|
||||
page = __rmqueue_cma(zone, order, migratetype,
|
||||
alloc_flags);
|
||||
if (!page)
|
||||
page = __rmqueue(zone, order, migratetype,
|
||||
alloc_flags);
|
||||
}
|
||||
if (!page) {
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
return NULL;
|
||||
}
|
||||
__mod_zone_freepage_state(zone, -(1 << order),
|
||||
get_pcppage_migratetype(page));
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
} while (check_new_pages(page, order));
|
||||
|
||||
__count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order);
|
||||
zone_statistics(preferred_zone, zone, 1);
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
/* Remove page from the per-cpu list, caller must protect the list */
|
||||
static inline
|
||||
struct page *__rmqueue_pcplist(struct zone *zone, unsigned int order,
|
||||
@@ -3819,7 +3864,6 @@ struct page *rmqueue(struct zone *preferred_zone,
|
||||
gfp_t gfp_flags, unsigned int alloc_flags,
|
||||
int migratetype)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct page *page;
|
||||
|
||||
if (likely(pcp_allowed_order(order))) {
|
||||
@@ -3833,39 +3877,10 @@ struct page *rmqueue(struct zone *preferred_zone,
|
||||
* allocate greater than order-1 page units with __GFP_NOFAIL.
|
||||
*/
|
||||
WARN_ON_ONCE((gfp_flags & __GFP_NOFAIL) && (order > 1));
|
||||
spin_lock_irqsave(&zone->lock, flags);
|
||||
|
||||
do {
|
||||
page = NULL;
|
||||
/*
|
||||
* order-0 request can reach here when the pcplist is skipped
|
||||
* due to non-CMA allocation context. HIGHATOMIC area is
|
||||
* reserved for high-order atomic allocation, so order-0
|
||||
* request should skip it.
|
||||
*/
|
||||
if (order > 0 && alloc_flags & ALLOC_HARDER) {
|
||||
page = __rmqueue_smallest(zone, order, MIGRATE_HIGHATOMIC);
|
||||
if (page)
|
||||
trace_mm_page_alloc_zone_locked(page, order, migratetype);
|
||||
}
|
||||
if (!page) {
|
||||
if (alloc_flags & ALLOC_CMA && migratetype == MIGRATE_MOVABLE)
|
||||
page = __rmqueue_cma(zone, order, migratetype,
|
||||
alloc_flags);
|
||||
if (!page)
|
||||
page = __rmqueue(zone, order, migratetype,
|
||||
alloc_flags);
|
||||
}
|
||||
} while (page && check_new_pages(page, order));
|
||||
if (!page)
|
||||
goto failed;
|
||||
|
||||
__mod_zone_freepage_state(zone, -(1 << order),
|
||||
get_pcppage_migratetype(page));
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
|
||||
__count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order);
|
||||
zone_statistics(preferred_zone, zone, 1);
|
||||
page = rmqueue_buddy(preferred_zone, zone, order, alloc_flags,
|
||||
migratetype);
|
||||
if (unlikely(!page))
|
||||
return NULL;
|
||||
trace_android_vh_rmqueue(preferred_zone, zone, order,
|
||||
gfp_flags, alloc_flags, migratetype);
|
||||
|
||||
@@ -3878,10 +3893,6 @@ out:
|
||||
|
||||
VM_BUG_ON_PAGE(page && bad_range(zone, page), page);
|
||||
return page;
|
||||
|
||||
failed:
|
||||
spin_unlock_irqrestore(&zone->lock, flags);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FAIL_PAGE_ALLOC
|
||||
|
||||
Reference in New Issue
Block a user