[PATCH 0/2] Improve dump_page() output for slab pages

From: Sukrit Bhatnagar
Date: Wed May 22 2024 - 03:52:57 EST


While using dump_page() on a range of pages, I noticed that there were some
PG_slab pages that were also showing as PG_anon pages, according to the
function output.

[ 7.071985] page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x102768
[ 7.072602] head: order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0
[ 7.073085] anon flags: 0x8000000000000840(slab|head|zone=2)
[ 7.073777] raw: 8000000000000840 ffff8881000419c0 0000000000000000 dead000000000001

It was also printing the "page_type" field for slab pages, but that was fixed in
a very recent commit:
8f790d0c7cfe (mm: improve dumping of mapcount and page_type)

Given that the slab pages cannot be mapped to userspace, this output seems
misleading.

In dump_page(), folio_test_anon() is used, which checks the "mapping" field.
But the struct slab was separated from struct page.
So accessing the mapping field through a struct page pointer, which actually
points to a struct slab, will result in garbage memory access and the PG_anon
test can return true.

It seems that other parts of the kernel MM make the check for slab before
checking for anon, but dump_page() is not doing that.

On the other hand, the struct slab has kmem_cache which maintains another set
of flags. It would be nice to have these flags added as a part of the debug
output, and to have a convenient way to print them.

(The long chain of pointer dereferences for cache flags looks messy, but I
assume it should be fine for a debug function.)

Sukrit Bhatnagar (2):
mm: printk: introduce new format %pGs for slab flags
mm: debug: print correct information for slab folios

Documentation/core-api/printk-formats.rst | 2 +
include/linux/slab.h | 5 ++
include/trace/events/mmflags.h | 67 +++++++++++++++++++++++
lib/test_printf.c | 13 +++++
lib/vsprintf.c | 22 ++++++++
mm/debug.c | 12 +++-
mm/internal.h | 1 +
7 files changed, 121 insertions(+), 1 deletion(-)

--
2.34.1