On Thu, Jan 23, 2025 at 07:55:24PM +0000, Matthew Wilcox wrote: > The page reference count tracepoints currently look like this: > > __entry->pfn = page_to_pfn(page); > __entry->flags = page->flags; > __entry->count = page_ref_count(page); > __entry->mapcount = atomic_read(&page->_mapcount); > __entry->mapping = page->mapping; > __entry->mt = get_pageblock_migratetype(page); > TP_printk("pfn=0x%lx flags=%s count=%d mapcount=%d mapping=%p mt=%d val=%d", > > > Soon, pages will not have a ->mapping, nor a ->mapcount [1]. But they will > still have a refcount, at least for now. put_page() will move out of > line and look something like this: > > void put_page(struct page *page) > { > unsigned long memdesc = page->memdesc; > if (memdesc_is_folio(memdesc)) > return folio_put(memdesc_folio(memdesc)); > BUG_ON(memdesc_is_slab(memdesc)); > ... handle other memdesc types here ... > if (memdesc_is_compound_head(memdesc)) > page = memdesc_head_page(memdesc); > > if (put_page_testzero(page)) > __put_page(page); > } > > What I'm thinking is: > > - Define a set of folio_ref_* tracepoints which dump exactly the same info > as page_ref does today > - Remove mapping & mapcount from page_ref_* functions. > > Other ideas? I don't use these tracepoints myself; they generate far > too much data to be useful to me. I'm afraid I don't have any specific ideas but in the past I have used these tracepoints mostly to debug issues around what is holding a pin on a page and therefore preventing some operation, usually migration. For that page_ref_count(page) and page->_mapcount were the most important fields, with the latter required to determine the "expected" refcount. The ->mapping field was less interesting to me when I have used these tracepoints. > [1] In case you missed it, > https://lore.kernel.org/linux-mm/Z37pxbkHPbLYnDKn@xxxxxxxxxxxxxxxxxxxx/ >