All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oscar Salvador <osalvador@suse.de>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: 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>,
	Oscar Salvador <osalvador@suse.de>
Subject: [PATCH 3/3] mm,page_owner: Filter out stacks by a threshold counter
Date: Thu,  1 Sep 2022 06:42:49 +0200	[thread overview]
Message-ID: <20220901044249.4624-4-osalvador@suse.de> (raw)
In-Reply-To: <20220901044249.4624-1-osalvador@suse.de>

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.

Signed-off-by: Oscar Salvador <osalvador@suse.de>
---
 include/linux/stackdepot.h |  3 +-
 lib/stackdepot.c           |  6 ++--
 mm/page_owner.c            | 61 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 66 insertions(+), 4 deletions(-)

diff --git a/include/linux/stackdepot.h b/include/linux/stackdepot.h
index 20f62039f23a..ee66be40a152 100644
--- a/include/linux/stackdepot.h
+++ b/include/linux/stackdepot.h
@@ -26,7 +26,8 @@ depot_stack_handle_t __stack_depot_save(unsigned long *entries,
 					stack_action_t 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,
-				       unsigned long *last_stack);
+				       unsigned long *last_stack,
+				       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 3090ae0f3958..b4a04f09a7b7 100644
--- a/lib/stackdepot.c
+++ b/lib/stackdepot.c
@@ -528,7 +528,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,
-				       unsigned long *last_stack)
+				       unsigned long *last_stack,
+				       unsigned long threshold)
 {
 	struct stack_record *stack = NULL, *last;
 	struct stack_record **stacks;
@@ -547,7 +548,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 8c67c7eb2451..ef10cf44aaec 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -44,6 +44,7 @@ static depot_stack_handle_t early_handle;
 static void init_early_allocated_pages(void);
 
 static unsigned long last_stack = 0;
+static unsigned long threshold_count = 0;
 
 static int __init early_page_owner_param(char *buf)
 {
@@ -676,7 +677,8 @@ 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, &last_stack);
+	ret += stack_depot_print_stacks_threshold(kbuf, count, pos, &last_stack,
+						  threshold_count);
 	if (copy_to_user(buf, kbuf, ret))
 		ret = -EFAULT;
 
@@ -687,6 +689,61 @@ static ssize_t read_page_owner_stacks(struct file *file, char __user *buf,
 	return ret;
 }
 
+static ssize_t read_page_owner_threshold(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);
+
+	if (*pos >= count)
+		return 0;
+
+	kbuf = kmalloc(count, GFP_KERNEL);
+	if (!kbuf)
+		return ENOMEM;
+
+	ret = scnprintf(kbuf, count, "%lu\n", threshold_count);
+	if (copy_to_user(buf, kbuf, ret))
+		ret = -EFAULT;
+
+	*pos += count;
+	kfree(kbuf);
+
+	return ret;
+}
+
+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_count);
+
+out:
+	kfree(kbuf);
+	return ret ? ret : count;
+}
+
+static const struct file_operations proc_page_owner_threshold = {
+	.read = read_page_owner_threshold,
+	.write = write_page_owner_threshold,
+};
+
 static const struct file_operations proc_page_owner_stacks = {
 	.read = read_page_owner_stacks,
 };
@@ -706,6 +763,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;
 }
-- 
2.35.3


  parent reply	other threads:[~2022-09-01  4:43 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-01  4:42 [PATCH 0/3] page_owner: print stacks and their counter Oscar Salvador
2022-09-01  4:42 ` [PATCH 1/3] lib/stackdepot: Add a refcount field in stack_record Oscar Salvador
2022-09-01  8:24   ` Marco Elver
2022-09-01  8:38     ` Michal Hocko
2022-09-01  9:18       ` Marco Elver
2022-09-01 10:01         ` Michal Hocko
2022-09-01 10:20           ` Marco Elver
2022-09-05 20:53         ` Andrey Konovalov
2022-09-02  3:27     ` Oscar Salvador
2022-09-01  4:42 ` [PATCH 2/3] mm, page_owner: Add page_owner_stacks file to print out only stacks and their counter Oscar Salvador
2022-09-01  8:16   ` Ammar Faizi
2022-09-02  3:33     ` Oscar Salvador
2022-09-01 19:29   ` kernel test robot
2022-09-02  0:56   ` kernel test robot
2022-09-01  4:42 ` Oscar Salvador [this message]
2022-09-01  8:31   ` [PATCH 3/3] mm,page_owner: Filter out stacks by a threshold counter Ammar Faizi
2022-09-02  3:36     ` Oscar Salvador
2022-09-01  8:40   ` Michal Hocko
2022-09-02  3:37     ` Oscar Salvador
2022-09-01  8:32 ` [PATCH 0/3] page_owner: print stacks and their counter Michal Hocko

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=20220901044249.4624-4-osalvador@suse.de \
    --to=osalvador@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=edumazet@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=longman@redhat.com \
    --cc=mhocko@suse.com \
    --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.