On Tue, Aug 06, 2024 at 02:06:02PM +0200, David Hildenbrand wrote: > On 05.08.24 16:59, Kirill A. Shutemov wrote: > > The new page type allows physical memory scanners to detect unaccepted > > memory and handle it accordingly. > > > > The page type is serialized with zone lock. > > > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > > --- > > include/linux/page-flags.h | 3 +++ > > mm/page_alloc.c | 2 ++ > > 2 files changed, 5 insertions(+) > > > > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h > > index 5769fe6e4950..e19eac9c2b5c 100644 > > --- a/include/linux/page-flags.h > > +++ b/include/linux/page-flags.h > > @@ -943,6 +943,7 @@ enum pagetype { > > PG_hugetlb = 0x04000000, > > PG_slab = 0x02000000, > > PG_zsmalloc = 0x01000000, > > + PG_unaccepted = 0x00800000, > > PAGE_TYPE_BASE = 0x80000000, > > @@ -1076,6 +1077,8 @@ FOLIO_TEST_FLAG_FALSE(hugetlb) > > PAGE_TYPE_OPS(Zsmalloc, zsmalloc, zsmalloc) > > +PAGE_TYPE_OPS(Unaccepted, unaccepted, unaccepted) > > I'm sure you're able to come up with some documentation ;) Will do. > > + > > /** > > * PageHuge - Determine if the page belongs to hugetlbfs > > * @page: The page to test. > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > index 90a1f01d5996..a35efb114496 100644 > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -6972,6 +6972,7 @@ static bool try_to_accept_memory_one(struct zone *zone) > > account_freepages(zone, -MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE); > > __mod_zone_page_state(zone, NR_UNACCEPTED, -MAX_ORDER_NR_PAGES); > > + __ClearPageUnaccepted(page); > > spin_unlock_irqrestore(&zone->lock, flags); > > accept_page(page, MAX_PAGE_ORDER); > > @@ -7030,6 +7031,7 @@ static bool __free_unaccepted(struct page *page) > > list_add_tail(&page->lru, &zone->unaccepted_pages); > > account_freepages(zone, MAX_ORDER_NR_PAGES, MIGRATE_MOVABLE); > > __mod_zone_page_state(zone, NR_UNACCEPTED, MAX_ORDER_NR_PAGES); > > + __SetPageUnaccepted(page); > > spin_unlock_irqrestore(&zone->lock, flags); > > if (first) > > At the point PG_unaccepted is set/cleared, we don't have another type set, > right? (IOW, PG_buddy is only set after we cleared PG_unaccepted) Right. PG_buddy is set after we clear PG_unaccepted. There's brief period when the page is under accept when PG_unaccepted already cleared, but PG_buddy is not yet set. But I don't think it can be problematic. -- Kiryl Shutsemau / Kirill A. Shutemov