On 2/12/24 23:30, 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> ... > +static int stack_print(struct seq_file *m, void *v) > +{ > + char *buf; > + int ret = 0; > + struct stack *stack = v; > + struct stack_record *stack_record = stack->stack_record; > + > + if (!stack_record->size || stack_record->size < 0 || > + refcount_read(&stack_record->count) < 2) > + return 0; > + > + buf = kzalloc(PAGE_SIZE, GFP_KERNEL); > + > + ret += stack_trace_snprint(buf, PAGE_SIZE, stack_record->entries, > + stack_record->size, 0); > + if (!ret) > + goto out; > + > + scnprintf(buf + ret, PAGE_SIZE - ret, "stack_count: %d\n\n", > + refcount_read(&stack_record->count)); > + > + seq_printf(m, buf); > + seq_puts(m, "\n\n"); > +out: > + kfree(buf); Seems rather wasteful to do kzalloc/kfree so you can print into that buffer first and then print/copy it again using seq_printf. If you give up on using stack_trace_snprintf() it's not much harder to print the stack directly with a loop of seq_printf. See e.g. slab_debugfs_show(). > + > + return 0; > +} > +