From: Marco Elver <elver@google.com>
To: Oscar Salvador <osalvador@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Michal Hocko <mhocko@suse.com>, Vlastimil Babka <vbabka@suse.cz>,
Eric Dumazet <edumazet@google.com>,
Waiman Long <longman@redhat.com>,
Suren Baghdasaryan <surenb@google.com>,
Andrey Konovalov <andreyknvl@gmail.com>,
Alexander Potapenko <glider@google.com>
Subject: Re: [PATCH v2 2/3] mm, page_owner: Add page_owner_stacks file to print out only stacks and their counter
Date: Mon, 5 Sep 2022 14:57:50 +0200 [thread overview]
Message-ID: <YxXyThZanSl3wboo@elver.google.com> (raw)
In-Reply-To: <20220905031012.4450-3-osalvador@suse.de>
On Mon, Sep 05, 2022 at 05:10AM +0200, Oscar Salvador wrote:
[...]
> +int stack_depot_print_stacks_threshold(char *buf, size_t size, loff_t *pos)
Can you add kernel-doc comment what this does (and also update
accordingly in 3/3 when you add 'threshold').
From what I see it prints *all* stacks that have a non-zero count.
Correct?
If so, should this be called stack_depot_print_all_count() (having
stack(s) in the name twice doesn't make it more obvious what it does)?
Then in the follow-up patch you add the 'threshold' arg.
> +{
> + int i = *pos, ret = 0;
> + struct stack_record **stacks, *stack;
> + static struct stack_record *last = NULL;
> + unsigned long stack_table_entries = stack_hash_mask + 1;
> +
> + /* Continue from the last stack if we have one */
> + if (last) {
> + stack = last->next;
This is dead code?
> + } else {
> +new_table:
> + stacks = &stack_table[i];
> + stack = (struct stack_record *)stacks;
> + }
> +
> + for (; stack; stack = stack->next) {
> + if (!stack->size || stack->size < 0 ||
> + stack->size > size || stack->handle.valid != 1 ||
> + refcount_read(&stack->count) < 1)
> + continue;
> +
> + ret += stack_trace_snprint(buf, size, stack->entries, stack->size, 0);
> + ret += scnprintf(buf + ret, size - ret, "stack count: %d\n\n",
> + refcount_read(&stack->count));
> + last = stack;
> + return ret;
> + }
> +
> + i++;
> + *pos = i;
> + last = NULL;
> +
> + /* Keep looking all tables for valid stacks */
> + if (i < stack_table_entries)
> + goto new_table;
> +
> + return 0;
> +}
Either I'm missing something really obvious, but I was able to simplify
the above function to just this (untested!):
int stack_depot_print_stacks_threshold(char *buf, size_t size, loff_t *pos)
{
const unsigned long stack_table_entries = stack_hash_mask + 1;
/* Iterate over all tables for valid stacks. */
for (; *pos < stack_table_entries; (*pos)++) {
for (struct stack_record *stack = stack_table[*pos]; stack; stack = stack->next) {
if (!stack->size || stack->size < 0 || stack->size > size ||
stack->handle.valid != 1 || refcount_read(&stack->count) < 1)
continue;
return stack_trace_snprint(buf, size, stack->entries, stack->size, 0) +
scnprintf(buf + ret, size - ret, "stack count: %d\n\n",
refcount_read(&stack->count));
}
}
return 0;
}
> diff --git a/mm/page_owner.c b/mm/page_owner.c
> index 8730f377fa91..d88e6b4aefa0 100644
> --- a/mm/page_owner.c
> +++ b/mm/page_owner.c
> @@ -664,6 +664,29 @@ static void init_early_allocated_pages(void)
> init_zones_in_node(pgdat);
> }
>
> +static ssize_t read_page_owner_stacks(struct file *file, char __user *buf,
> + size_t count, loff_t *pos)
> +{
> + char *kbuf;
> + int ret = 0;
> +
> + count = min_t(size_t, count, PAGE_SIZE);
> + kbuf = kmalloc(count, GFP_KERNEL);
> + if (!kbuf)
> + return -ENOMEM;
> +
> + ret += stack_depot_print_stacks_threshold(kbuf, count, pos);
If I understood right, this will print *all* stacks that have non-zero
count, and this isn't related to page_owner per-se. Correct?
This might not be a problem right now, but once there might be more
users that want to count stack usage, you'll end up with page_owner +
other stacks here.
next prev parent reply other threads:[~2022-09-05 12:58 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-05 3:10 [PATCH v2 0/3] page_owner: print stacks and their counter Oscar Salvador
2022-09-05 3:10 ` [PATCH v2 1/3] lib/stackdepot: Add a refcount field in stack_record Oscar Salvador
2022-09-05 20:57 ` Andrey Konovalov
2022-09-06 3:54 ` Oscar Salvador
2022-09-10 22:33 ` Andrey Konovalov
2022-09-19 15:01 ` Vlastimil Babka
2022-09-05 3:10 ` [PATCH v2 2/3] mm, page_owner: Add page_owner_stacks file to print out only stacks and their counter Oscar Salvador
2022-09-05 12:57 ` Marco Elver [this message]
2022-09-05 13:00 ` Marco Elver
2022-09-06 7:43 ` Oscar Salvador
2022-09-06 8:35 ` Marco Elver
2022-09-07 4:00 ` Oscar Salvador
2022-09-07 7:14 ` Marco Elver
2022-09-08 3:32 ` Oscar Salvador
2022-09-08 5:31 ` Marco Elver
2022-09-05 22:20 ` kernel test robot
2022-09-05 3:10 ` [PATCH v2 3/3] mm,page_owner: Filter out stacks by a threshold counter Oscar Salvador
2022-09-05 10:51 ` Ammar Faizi
2022-09-05 11:31 ` Michal Hocko
2022-09-05 11:54 ` Ammar Faizi
2022-09-05 12:02 ` Michal Hocko
2022-09-05 12:42 ` Ammar Faizi
2022-09-19 15:23 ` Vlastimil Babka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YxXyThZanSl3wboo@elver.google.com \
--to=elver@google.com \
--cc=akpm@linux-foundation.org \
--cc=andreyknvl@gmail.com \
--cc=edumazet@google.com \
--cc=glider@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=longman@redhat.com \
--cc=mhocko@suse.com \
--cc=osalvador@suse.de \
--cc=surenb@google.com \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.