All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: Oscar Salvador <osalvador@suse.de>,
	Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	Michal Hocko <mhocko@suse.com>,
	Eric Dumazet <edumazet@google.com>,
	Waiman Long <longman@redhat.com>,
	Suren Baghdasaryan <surenb@google.com>,
	Marco Elver <elver@google.com>,
	Andrey Konovalov <andreyknvl@gmail.com>,
	Alexander Potapenko <glider@google.com>
Subject: Re: [PATCH v2 3/3] mm,page_owner: Filter out stacks by a threshold counter
Date: Mon, 19 Sep 2022 17:23:23 +0200	[thread overview]
Message-ID: <9440ffc2-cfda-ade0-839c-71e9378193fb@suse.cz> (raw)
In-Reply-To: <20220905031012.4450-4-osalvador@suse.de>

On 9/5/22 05:10, Oscar Salvador wrote:
> We want to be able to filter out the output on a threshold basis,
> in this way we can get rid of a lot of noise and focus only on those
> stacks which have an allegedly high counter.
> 
> We can control the threshold value by a new file called
> 'page_owner_threshold', which is 0 by default.

The name could suggest it has to do something with "page_owner" but in fact
it only affects "page_owner_stacks".
So maybe "page_owner_stacks_threshold" ? But now it's rather long. Or maybe
"page_owner_stacks_min_count" ? Also long but maybe the most self-evident?

> Signed-off-by: Oscar Salvador <osalvador@suse.de>
> ---
>  include/linux/stackdepot.h |  3 ++-
>  lib/stackdepot.c           |  6 +++--
>  mm/page_owner.c            | 51 +++++++++++++++++++++++++++++++++++++-
>  3 files changed, 56 insertions(+), 4 deletions(-)
> 
> diff --git a/include/linux/stackdepot.h b/include/linux/stackdepot.h
> index 19d3f8295df8..742038216cd0 100644
> --- a/include/linux/stackdepot.h
> +++ b/include/linux/stackdepot.h
> @@ -25,7 +25,8 @@ depot_stack_handle_t __stack_depot_save(unsigned long *entries,
>  					gfp_t gfp_flags, bool can_alloc,
>  					enum stack_depot_action action);
>  void stack_depot_dec_count(depot_stack_handle_t handle);
> -int stack_depot_print_stacks_threshold(char *buf, size_t size, loff_t *pos);
> +int stack_depot_print_stacks_threshold(char *buf, size_t size, loff_t *pos,
> +				       unsigned long threshold);
>  
>  /*
>   * Every user of stack depot has to call stack_depot_init() during its own init
> diff --git a/lib/stackdepot.c b/lib/stackdepot.c
> index a198b2dbe3fb..a31e882853ab 100644
> --- a/lib/stackdepot.c
> +++ b/lib/stackdepot.c
> @@ -566,7 +566,8 @@ depot_stack_handle_t stack_depot_save_action(unsigned long *entries,
>  }
>  EXPORT_SYMBOL_GPL(stack_depot_save_action);
>  
> -int stack_depot_print_stacks_threshold(char *buf, size_t size, loff_t *pos)
> +int stack_depot_print_stacks_threshold(char *buf, size_t size, loff_t *pos,
> +				       unsigned long threshold)
>  {
>  	int i = *pos, ret = 0;
>  	struct stack_record **stacks, *stack;
> @@ -585,7 +586,8 @@ int stack_depot_print_stacks_threshold(char *buf, size_t size, loff_t *pos)
>  	for (; stack; stack = stack->next) {
>  		if (!stack->size || stack->size < 0 ||
>  		    stack->size > size || stack->handle.valid != 1 ||
> -		    refcount_read(&stack->count) < 1)
> +		    refcount_read(&stack->count) < 1 ||
> +		    refcount_read(&stack->count) < threshold)
>  			continue;
>  
>  		ret += stack_trace_snprint(buf, size, stack->entries, stack->size, 0);
> diff --git a/mm/page_owner.c b/mm/page_owner.c
> index d88e6b4aefa0..5b895d347c5f 100644
> --- a/mm/page_owner.c
> +++ b/mm/page_owner.c
> @@ -43,6 +43,8 @@ static depot_stack_handle_t early_handle;
>  
>  static void init_early_allocated_pages(void);
>  
> +static unsigned long threshold;
> +
>  static int __init early_page_owner_param(char *buf)
>  {
>  	int ret = kstrtobool(buf, &page_owner_enabled);
> @@ -675,7 +677,7 @@ static ssize_t read_page_owner_stacks(struct file *file, char __user *buf,
>  	if (!kbuf)
>  		return -ENOMEM;
>  
> -	ret += stack_depot_print_stacks_threshold(kbuf, count, pos);
> +	ret += stack_depot_print_stacks_threshold(kbuf, count, pos, threshold);
>  	if (copy_to_user(buf, kbuf, ret))
>  		ret = -EFAULT;
>  
> @@ -683,6 +685,51 @@ static ssize_t read_page_owner_stacks(struct file *file, char __user *buf,
>  	return ret;
>  }
>  
> +static int page_owner_threshold_show(struct seq_file *p, void *v)
> +{
> +	 seq_printf(p, "%lu\n", threshold);
> +	return 0;
> +}
> +
> +static ssize_t write_page_owner_threshold(struct file *file, const 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;
> +
> +	if (copy_from_user(kbuf, buf, count)) {
> +		ret = -EFAULT;
> +		goto out;
> +	}
> +
> +	kbuf[count - 1] = '\0';
> +
> +	ret = kstrtoul(kbuf, 10, &threshold);
> +
> +out:
> +	kfree(kbuf);
> +	return ret ? ret : count;
> +}
> +
> +static int open_page_owner_threshold(struct inode *inode, struct file *file)
> +{
> +	return single_open(file, page_owner_threshold_show, NULL);
> +}
> +
> +
> +static const struct file_operations proc_page_owner_threshold = {
> +	.open = open_page_owner_threshold,
> +	.read = seq_read,
> +	.llseek = seq_lseek,
> +	.write = write_page_owner_threshold,
> +	.release = single_release,
> +};
> +
>  static const struct file_operations proc_page_owner_stacks = {
>  	.read = read_page_owner_stacks,
>  };
> @@ -702,6 +749,8 @@ static int __init pageowner_init(void)
>  			    &proc_page_owner_operations);
>  	debugfs_create_file("page_owner_stacks", 0400, NULL, NULL,
>  			    &proc_page_owner_stacks);
> +	debugfs_create_file("page_owner_threshold", 0600, NULL, NULL,
> +			     &proc_page_owner_threshold);
>  
>  	return 0;
>  }


      parent reply	other threads:[~2022-09-19 15:24 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
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 [this message]

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=9440ffc2-cfda-ade0-839c-71e9378193fb@suse.cz \
    --to=vbabka@suse.cz \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@gmail.com \
    --cc=edumazet@google.com \
    --cc=elver@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 \
    /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.