The current page_owner function can display the allocate and free process of a page, but there is no accurate information corresponding to the page. This patchset can make the slab page to know which kmem cache the page is requested from. For the file page, it can know the corresponding file inode, if this file page is mapped to the process address space, we can know the virtual address corresponding to a certain process. For the anon page, since it must be mapped to the process address space, at this time, we can also know the virtual address corresponding to a certain process. To implement it, we only need to add a callback function in the struct page_owner, this let the slab layer or the anon/file handler layer or any other memory-allocated layers to implement what they would like to tell. For example, for slab page, a line is added to the result of page_owner added: "SLAB_PAGE slab_name:kmalloc-32" Page allocated via order 0, mask 0x12cc0(GFP_KERNEL|__GFP_NOWARN|__GFP_NORETRY), pid 1, tgid 1 (swapper/0), ts 340615384 ns SLAB_PAGE slab_name:kmalloc-32 PFN 0x4be0 type Unmovable Block 37 type Unmovable Flags 0x1fffc0000000800(slab|node=0|zone=1|lastcpupid=0x3fff) post_alloc_hook+0x77/0xf0 get_page_from_freelist+0x58d/0x14e0 __alloc_pages+0x1b2/0x380 alloc_pages_mpol+0x97/0x1f0 allocate_slab+0x31f/0x410 ___slab_alloc+0x3e8/0x850 __kmem_cache_alloc_node+0x111/0x2b0 kmalloc_trace+0x29/0x90 iommu_setup_dma_ops+0x299/0x470 bus_iommu_probe+0xe1/0x150 iommu_device_register+0xad/0x120 intel_iommu_init+0xe3a/0x1260 pci_iommu_init+0x12/0x40 do_one_initcall+0x45/0x210 kernel_init_freeable+0x1a4/0x2e0 kernel_init+0x1a/0x1c0 added: "SLAB_PAGE slab_name:mm_struct" Page allocated via order 3, mask 0xd20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), \ pid 86, tgid 86 (linuxrc), ts 1121118666 ns SLAB_PAGE slab_name:mm_struct PFN 0x6388 type Unmovable Block 49 type Unmovable Flags 0x1fffc0000000840(slab|head|node=0|zone=1|lastcpupid=0x3fff) post_alloc_hook+0x77/0xf0 get_page_from_freelist+0x58d/0x14e0 __alloc_pages+0x1b2/0x380 alloc_pages_mpol+0x97/0x1f0 allocate_slab+0x31f/0x410 ___slab_alloc+0x3e8/0x850 kmem_cache_alloc+0x2b8/0x2f0 mm_alloc+0x1a/0x50 alloc_bprm+0x8a/0x300 do_execveat_common.isra.0+0x68/0x240 __x64_sys_execve+0x37/0x50 do_syscall_64+0x42/0xf0 entry_SYSCALL_64_after_hwframe+0x6e/0x76 For the pid 98: [root@JeffXie ]# cat /proc/98/maps 00400000-00401000 r--p 00000000 fd:00 1954 /test/mm/a.out 00401000-00499000 r-xp 00001000 fd:00 1954 /test/mm/a.out 00499000-004c2000 r--p 00099000 fd:00 1954 /test/mm/a.out 004c2000-004c6000 r--p 000c1000 fd:00 1954 /test/mm/a.out 004c6000-004c9000 rw-p 000c5000 fd:00 1954 /test/mm/a.out 004c9000-004ce000 rw-p 00000000 00:00 0 01d97000-01db9000 rw-p 00000000 00:00 0 [heap] 7f1588fc8000-7f1588fc9000 rw-p 00000000 fd:00 1945 /a.txt 7ffda207a000-7ffda209b000 rw-p 00000000 00:00 0 [stack] 7ffda2152000-7ffda2156000 r--p 00000000 00:00 0 [vvar] 7ffda2156000-7ffda2158000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] For file page: added: "FILE_PAGE dev 253:0 ino:1954 index:0xc1 mapcount:1 refcount:2 0x4c2000 - 0x4c3000" Page allocated via order 0, mask 0x152c4a(GFP_NOFS|__GFP_HIGHMEM|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_HARDWALL|__GFP_MOVABLE),\ pid 98, tgid 98 (a.out), ts 28441476044 ns FILE_PAGE dev 253:0 ino:1954 index:0xc1 mapcount:1 refcount:2 0x4c2000 - 0x4c3000 PFN 0x5be8e type Movable Block 735 type Movable Flags 0x1fffc0000020028(uptodate|lru|mappedtodisk|node=0|zone=1|lastcpupid=0x3fff) post_alloc_hook+0x77/0xf0 get_page_from_freelist+0x58d/0x14e0 __alloc_pages+0x1b2/0x380 alloc_pages_mpol+0x97/0x1f0 folio_alloc+0x18/0x50 page_cache_ra_unbounded+0x9b/0x1a0 filemap_fault+0x5f7/0xc20 __do_fault+0x31/0xc0 __handle_mm_fault+0x1333/0x1760 handle_mm_fault+0xbc/0x2f0 do_user_addr_fault+0x1f8/0x5e0 exc_page_fault+0x73/0x170 asm_exc_page_fault+0x26/0x30 Charged to memcg / For anon page: added: "ANON_PAGE address 0x4c4000" Page allocated via order 0, mask 0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), pid 98, tgid 98 (a.out), ts 28442066180 ns ANON_PAGE address 0x4c4000 PFN 0x2c3db type Movable Block 353 type Movable Flags 0x1fffc00000a0028(uptodate|lru|mappedtodisk|swapbacked|node=0|zone=1|lastcpupid=0x3fff) post_alloc_hook+0x77/0xf0 get_page_from_freelist+0x58d/0x14e0 __alloc_pages+0x1b2/0x380 alloc_pages_mpol+0x97/0x1f0 vma_alloc_folio+0x5c/0xd0 do_wp_page+0x288/0xe30 __handle_mm_fault+0x8ca/0x1760 handle_mm_fault+0xbc/0x2f0 do_user_addr_fault+0x158/0x5e0 exc_page_fault+0x73/0x170 asm_exc_page_fault+0x26/0x30 Charged to memcg / Jeff Xie (4): mm, page_owner: add folio allocate post callback for struct page_owner to make the owner clearer mm, slub: implement slub allocate post callback for page_owner filemap: implement filemap allocate post callback for page_owner mm/rmap: implement anonmap allocate post callback for page_owner include/linux/page_owner.h | 9 ++++++++ include/linux/pagemap.h | 7 ++++++ include/linux/rmap.h | 7 ++++++ include/linux/slab.h | 8 ++++++- mm/filemap.c | 44 ++++++++++++++++++++++++++++++++++++++ mm/page_owner.c | 36 +++++++++++++++++++++++++++++++ mm/rmap.c | 15 ++++++++++++- mm/slub.c | 15 +++++++++++++ 8 files changed, 139 insertions(+), 2 deletions(-) based on mm-stable commit: be3ca57cfb77 -- 2.34.1