Messages in this thread | | | Date | Mon, 26 Sep 2022 09:55:57 +0200 | From | David Hildenbrand <> | Subject | Re: [PATCH] mm: move PG_slab flag to page_type |
| |
On 25.09.22 01:04, Matthew Wilcox wrote: > On Mon, Sep 19, 2022 at 09:57:08PM +0900, Hyeonggon Yoo wrote: >> For now, only SLAB uses _mapcount field as a number of active objects in >> a slab, and other slab allocators do not use it. As 16 bits are enough >> for that, use remaining 16 bits of _mapcount as page_type even when >> SLAB is used. And then move PG_slab flag to page_type! >> >> Note that page_type is always placed in upper 16 bits of _mapcount to >> avoid confusing normal _mapcount as page_type. As underflow (actually >> I mean, yeah, overflow) is not a concern anymore, use more lower bits >> except bit zero. >> >> Add more folio helpers for PAGE_TYPE_OPS() not to break existing >> slab implementations. >> >> Remove PG_slab check from PAGE_FLAGS_CHECK_AT_FREE. buddy will still >> check if _mapcount is properly set at free. >> >> Exclude PG_slab from hwpoison and show_page_flags() for now. >> >> Note that with this patch, page_mapped() and folio_mapped() always return >> false for slab page. > > This is an interesting approach. It raises some questions. > > First, you say that folio_mapped() returns false for slab pages. That's > only true for order-0 slab pages. For larger pages, > > if (!folio_test_large(folio)) > return atomic_read(&folio->_mapcount) >= 0; > if (atomic_read(folio_mapcount_ptr(folio)) >= 0) > return true; > > so that's going to depend what folio_mapcount_ptr() aliases with. > > Second, this patch changes the behaviour of PageSlab() when applied to > tail pages. Which raises the further question of what PageBuddy(), > PageTable(), PageGuard() and PageIsolated() should do for multi-page > folios, if that is even possible.
IIRC, these flags never apply on real compound pages so far. For example, PageBuddy() is only set on the first page of a (budy-aligned) free chunk of memory, and all "remaining" (tail) pages have a refcount of zero and don't have the flag set.
There are page tables on some systems (e.g., s390x) that span multiple pages (pmd_alloc_one()). I think the behavior is similar -- no compound page, and only the first page has the flag set.
-- Thanks,
David / dhildenb
| |