For monitoring the memory usage per stack trace, it is more efficient to read _just_ the handle number of the stack traces _without_ stack traces themselves, and their number of base pages. The stack traces are required only at the time to associate memory usage of a handle number with its stack trace (eg, see top-consuming handles). Before that, it is sufficient to have just the handle number, as it can be matched with a stack trace later (possible with the previous patch). This patch adds the option 'print_stack' option (enabled by default) to print stack traces in 'show_stacks'. Testing: - Enable handle numbers: # echo 1 >/sys/kernel/debug/page_owner_stacks/print_handle - With stacks (default): # cat /sys/kernel/debug/page_owner_stacks/show_stacks > f1 - Without stacks (new option): # echo 0 >/sys/kernel/debug/page_owner_stacks/print_stack # cat /sys/kernel/debug/page_owner_stacks/show_stacks > f2 - Differences: # cat f1 get_page_from_freelist+0x14ab/0x16a0 ... do_syscall_64+0xa4/0x290 handle: 15728651 nr_base_pages: 2 get_page_from_freelist+0x14ab/0x16a0 ... do_sys_openat2+0x8a/0xe0 handle: 8388619 nr_base_pages: 16 ... # cat f2 handle: 15728651 nr_base_pages: 2 handle: 8388619 nr_base_pages: 16 ... Signed-off-by: Mauricio Faria de Oliveira --- mm/page_owner.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/mm/page_owner.c b/mm/page_owner.c index 420426749239..25221676676d 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -888,6 +888,7 @@ static void *stack_next(struct seq_file *m, void *v, loff_t *ppos) static unsigned long page_owner_pages_threshold; static bool page_owner_print_handle; +static bool page_owner_print_stack = true; static int stack_print(struct seq_file *m, void *v) { @@ -900,15 +901,17 @@ static int stack_print(struct seq_file *m, void *v) if (!stack->stack_record) return 0; - nr_entries = stack_record->size; - entries = stack_record->entries; nr_base_pages = refcount_read(&stack_record->count) - 1; if (nr_base_pages < 1 || nr_base_pages < page_owner_pages_threshold) return 0; - for (i = 0; i < nr_entries; i++) - seq_printf(m, " %pS\n", (void *)entries[i]); + if (page_owner_print_stack) { + nr_entries = stack_record->size; + entries = stack_record->entries; + for (i = 0; i < nr_entries; i++) + seq_printf(m, " %pS\n", (void *)entries[i]); + } if (page_owner_print_handle) seq_printf(m, "handle: %d\n", stack_record->handle.handle); seq_printf(m, "nr_base_pages: %d\n\n", nr_base_pages); @@ -973,6 +976,8 @@ static int __init pageowner_init(void) &proc_page_owner_threshold); debugfs_create_bool("print_handle", 0600, dir, &page_owner_print_handle); + debugfs_create_bool("print_stack", 0600, dir, + &page_owner_print_stack); return 0; } -- 2.48.1