mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
mm: page_alloc: consolidate free page accounting
Free page accounting currently happens a bit too high up the call stack, where it has to deal with guard pages, compaction capturing, block stealing and even page isolation. This is subtle and fragile, and makes it difficult to hack on the code. Now that type violations on the freelists have been fixed, push the accounting down to where pages enter and leave the freelist. [hannes@cmpxchg.org: undo unrelated drive-by line wrap] Link: https://lkml.kernel.org/r/20240327185736.GA7597@cmpxchg.org [hannes@cmpxchg.org: remove unused page parameter from account_freepages()] Link: https://lkml.kernel.org/r/20240327185831.GB7597@cmpxchg.org [baolin.wang@linux.alibaba.com: fix free page accounting] Link: https://lkml.kernel.org/r/a2a48baca69f103aa431fd201f8a06e3b95e203d.1712648441.git.baolin.wang@linux.alibaba.com [andriy.shevchenko@linux.intel.com: avoid defining unused function] Link: https://lkml.kernel.org/r/20240423161506.2637177-1-andriy.shevchenko@linux.intel.com Link: https://lkml.kernel.org/r/20240320180429.678181-11-hannes@cmpxchg.org Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> Reviewed-by: Vlastimil Babka <vbabka@suse.cz> Tested-by: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: David Hildenbrand <david@redhat.com> Cc: "Huang, Ying" <ying.huang@intel.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
fd919a85cd
commit
e0932b6c1f
@@ -32,8 +32,7 @@ static int __init debug_guardpage_minorder_setup(char *buf)
|
||||
}
|
||||
early_param("debug_guardpage_minorder", debug_guardpage_minorder_setup);
|
||||
|
||||
bool __set_page_guard(struct zone *zone, struct page *page, unsigned int order,
|
||||
int migratetype)
|
||||
bool __set_page_guard(struct zone *zone, struct page *page, unsigned int order)
|
||||
{
|
||||
if (order >= debug_guardpage_minorder())
|
||||
return false;
|
||||
@@ -41,19 +40,12 @@ bool __set_page_guard(struct zone *zone, struct page *page, unsigned int order,
|
||||
__SetPageGuard(page);
|
||||
INIT_LIST_HEAD(&page->buddy_list);
|
||||
set_page_private(page, order);
|
||||
/* Guard pages are not available for any usage */
|
||||
if (!is_migrate_isolate(migratetype))
|
||||
__mod_zone_freepage_state(zone, -(1 << order), migratetype);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void __clear_page_guard(struct zone *zone, struct page *page, unsigned int order,
|
||||
int migratetype)
|
||||
void __clear_page_guard(struct zone *zone, struct page *page, unsigned int order)
|
||||
{
|
||||
__ClearPageGuard(page);
|
||||
|
||||
set_page_private(page, 0);
|
||||
if (!is_migrate_isolate(migratetype))
|
||||
__mod_zone_freepage_state(zone, (1 << order), migratetype);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user