On 2/14/24 18:01, Oscar Salvador wrote: > This patch adds a new directory called 'page_owner_stacks' under > /sys/kernel/debug/, with a file called 'show_stacks' in it. > Reading from that file will show all stacks that were added by page_owner > followed by their counting, giving us a clear overview of stack <-> count > relationship. > > E.g: > > prep_new_page+0xa9/0x120 > get_page_from_freelist+0x801/0x2210 > __alloc_pages+0x18b/0x350 > alloc_pages_mpol+0x91/0x1f0 > folio_alloc+0x14/0x50 > filemap_alloc_folio+0xb2/0x100 > __filemap_get_folio+0x14a/0x490 > ext4_write_begin+0xbd/0x4b0 [ext4] > generic_perform_write+0xc1/0x1e0 > ext4_buffered_write_iter+0x68/0xe0 [ext4] > ext4_file_write_iter+0x70/0x740 [ext4] > vfs_write+0x33d/0x420 > ksys_write+0xa5/0xe0 > do_syscall_64+0x80/0x160 > entry_SYSCALL_64_after_hwframe+0x6e/0x76 > stack_count: 4578 > > The seq stack_{start,next} functions will iterate through the list > stack_list in order to print all stacks. > > Signed-off-by: Oscar Salvador <osalvador@xxxxxxx> > Acked-by: Marco Elver <elver@xxxxxxxxxx> Reviewed-by: Vlastimil Babka <vbabka@xxxxxxx> ... > +static int stack_print(struct seq_file *m, void *v) > +{ > + int i; > + struct stack *stack = v; > + unsigned long *entries; > + unsigned long nr_entries; > + struct stack_record *stack_record = stack->stack_record; > + > + nr_entries = stack_record->size; > + entries = stack_record->entries; > + > + if (!nr_entries || nr_entries < 0 || > + refcount_read(&stack_record->count) < 2) > + return 0; > + > + for (i = 0; i < nr_entries; i++) > + seq_printf(m, " %pS\n", (void *)entries[i]); > + seq_printf(m, "stack_count: %d\n\n", refcount_read(&stack_record->count)); So count - 1 here to report actual usage, as explained in reply to 4/7?