From: Pasha Tatashin <pasha.tatashin@soleen.com>
To: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
akpm@linux-foundation.org, x86@kernel.org, bp@alien8.de,
brauner@kernel.org, bristot@redhat.com, bsegall@google.com,
dave.hansen@linux.intel.com, dianders@chromium.org,
dietmar.eggemann@arm.com, eric.devolder@oracle.com,
hca@linux.ibm.com, hch@infradead.org, hpa@zytor.com,
jacob.jun.pan@linux.intel.com, jgg@ziepe.ca, jpoimboe@kernel.org,
jroedel@suse.de, juri.lelli@redhat.com,
kent.overstreet@linux.dev, kinseyho@google.com,
kirill.shutemov@linux.intel.com, lstoakes@gmail.com,
luto@kernel.org, mgorman@suse.de, mic@digikod.net,
michael.christie@oracle.com, mingo@redhat.com, mjguzik@gmail.com,
mst@redhat.com, npiggin@gmail.com, peterz@infradead.org,
pmladek@suse.com, rick.p.edgecombe@intel.com,
rostedt@goodmis.org, surenb@google.com, tglx@linutronix.de,
urezki@gmail.com, vincent.guittot@linaro.org,
vschneid@redhat.com, pasha.tatashin@soleen.com
Subject: [RFC 13/14] task_stack.h: Add stack_not_used() support for dynamic stack
Date: Mon, 11 Mar 2024 16:46:37 +0000 [thread overview]
Message-ID: <20240311164638.2015063-14-pasha.tatashin@soleen.com> (raw)
In-Reply-To: <20240311164638.2015063-1-pasha.tatashin@soleen.com>
CONFIG_DEBUG_STACK_USAGE is enabled by default on most architectures.
Its purpose is to determine and print the maximum stack depth on
thread exit.
The way it works, is it starts from the buttom of the stack and
searches the first non-zero word in the stack. With dynamic stack it
does not work very well, as it means it faults every pages in every
stack.
Instead, add a specific version of stack_not_used() for dynamic stacks
where instead of starting from the buttom of the stack, we start from
the last page mapped in the stack.
In addition to not doing uncessary page faulting, this search is
optimized by skipping search through zero pages.
Also, because dynamic stack does not end with MAGIC_NUMBER, there is
no need to skeep the buttom most word in the stack.
Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
---
arch/Kconfig | 1 -
include/linux/sched/task_stack.h | 38 +++++++++++++++++++++++---------
2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/arch/Kconfig b/arch/Kconfig
index da3df347b069..759b2bb7edb6 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -1266,7 +1266,6 @@ config DYNAMIC_STACK
depends on HAVE_ARCH_DYNAMIC_STACK
depends on VMAP_STACK
depends on !KASAN
- depends on !DEBUG_STACK_USAGE
depends on !STACK_GROWSUP
help
Dynamic kernel stacks allow to save memory on machines with a lot of
diff --git a/include/linux/sched/task_stack.h b/include/linux/sched/task_stack.h
index 396d5418ae32..c5fb679b31ee 100644
--- a/include/linux/sched/task_stack.h
+++ b/include/linux/sched/task_stack.h
@@ -9,6 +9,7 @@
#include <linux/sched.h>
#include <linux/magic.h>
#include <linux/refcount.h>
+#include <linux/vmalloc.h>
#ifdef CONFIG_THREAD_INFO_IN_TASK
@@ -109,6 +110,21 @@ static inline void dynamic_stack(struct task_struct *tsk)
static inline void set_task_stack_end_magic(struct task_struct *tsk) {}
+#ifdef CONFIG_DEBUG_STACK_USAGE
+static inline unsigned long stack_not_used(struct task_struct *p)
+{
+ struct vm_struct *vm_area = p->stack_vm_area;
+ unsigned long alloc_size = vm_area->nr_pages << PAGE_SHIFT;
+ unsigned long stack = (unsigned long)p->stack;
+ unsigned long *n = (unsigned long *)(stack + THREAD_SIZE - alloc_size);
+
+ while (!*n)
+ n++;
+
+ return (unsigned long)n - stack;
+}
+#endif /* CONFIG_DEBUG_STACK_USAGE */
+
#else /* !CONFIG_DYNAMIC_STACK */
#define task_stack_end_corrupted(task) \
@@ -123,17 +139,6 @@ static inline bool dynamic_stack_fault(struct task_struct *tsk,
return false;
}
-#endif /* CONFIG_DYNAMIC_STACK */
-
-static inline int object_is_on_stack(const void *obj)
-{
- void *stack = task_stack_page(current);
-
- return (obj >= stack) && (obj < (stack + THREAD_SIZE));
-}
-
-extern void thread_stack_cache_init(void);
-
#ifdef CONFIG_DEBUG_STACK_USAGE
#ifdef CONFIG_STACK_GROWSUP
static inline unsigned long stack_not_used(struct task_struct *p)
@@ -160,6 +165,17 @@ static inline unsigned long stack_not_used(struct task_struct *p)
#endif /* CONFIG_STACK_GROWSUP */
#endif /* CONFIG_DEBUG_STACK_USAGE */
+#endif /* CONFIG_DYNAMIC_STACK */
+
+static inline int object_is_on_stack(const void *obj)
+{
+ void *stack = task_stack_page(current);
+
+ return (obj >= stack) && (obj < (stack + THREAD_SIZE));
+}
+
+extern void thread_stack_cache_init(void);
+
static inline int kstack_end(void *addr)
{
/* Reliable end of stack detection:
--
2.44.0.278.ge034bb2e1d-goog
next prev parent reply other threads:[~2024-03-11 16:47 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-11 16:46 [RFC 00/14] Dynamic Kernel Stacks Pasha Tatashin
2024-03-11 16:46 ` [RFC 01/14] task_stack.h: remove obsolete __HAVE_ARCH_KSTACK_END check Pasha Tatashin
2024-03-17 14:36 ` Christophe JAILLET
2024-03-17 15:13 ` Pasha Tatashin
2024-03-11 16:46 ` [RFC 02/14] fork: Clean-up ifdef logic around stack allocation Pasha Tatashin
2024-03-11 16:46 ` [RFC 03/14] fork: Clean-up naming of vm_strack/vm_struct variables in vmap stacks code Pasha Tatashin
2024-03-17 14:42 ` Christophe JAILLET
2024-03-19 16:32 ` Pasha Tatashin
2024-03-11 16:46 ` [RFC 04/14] fork: Remove assumption that vm_area->nr_pages equals to THREAD_SIZE Pasha Tatashin
2024-03-17 14:45 ` Christophe JAILLET
2024-03-17 15:14 ` Pasha Tatashin
2024-03-11 16:46 ` [RFC 05/14] fork: check charging success before zeroing stack Pasha Tatashin
2024-03-12 15:57 ` Kirill A. Shutemov
2024-03-12 16:52 ` Pasha Tatashin
2024-03-11 16:46 ` [RFC 06/14] fork: zero vmap stack using clear_page() instead of memset() Pasha Tatashin
2024-03-12 7:15 ` Nikolay Borisov
2024-03-12 16:53 ` Pasha Tatashin
2024-03-14 7:55 ` Christophe Leroy
2024-03-14 13:52 ` Pasha Tatashin
2024-03-17 14:48 ` Christophe JAILLET
2024-03-17 15:15 ` Pasha Tatashin
2024-03-11 16:46 ` [RFC 07/14] fork: use the first page in stack to store vm_stack in cached_stacks Pasha Tatashin
2024-03-11 16:46 ` [RFC 08/14] fork: separate vmap stack alloction and free calls Pasha Tatashin
2024-03-14 15:18 ` Jeff Xie
2024-03-14 17:14 ` Pasha Tatashin
2024-03-17 14:51 ` Christophe JAILLET
2024-03-17 15:15 ` Pasha Tatashin
2024-03-11 16:46 ` [RFC 09/14] mm/vmalloc: Add a get_vm_area_node() and vmap_pages_range_noflush() public functions Pasha Tatashin
2024-03-11 16:46 ` [RFC 10/14] fork: Dynamic Kernel Stacks Pasha Tatashin
2024-03-11 19:32 ` Randy Dunlap
2024-03-11 19:55 ` Pasha Tatashin
2024-03-11 16:46 ` [RFC 11/14] x86: add support for " Pasha Tatashin
2024-03-11 22:17 ` Andy Lutomirski
2024-03-11 23:10 ` Pasha Tatashin
2024-03-11 23:33 ` Thomas Gleixner
2024-03-11 23:34 ` Andy Lutomirski
2024-03-12 0:08 ` Pasha Tatashin
2024-03-12 0:23 ` Pasha Tatashin
2024-03-11 23:34 ` Dave Hansen
2024-03-11 23:41 ` Andy Lutomirski
2024-03-11 23:56 ` Nadav Amit
2024-03-12 0:02 ` Andy Lutomirski
2024-03-12 7:20 ` Nadav Amit
2024-03-12 0:53 ` Dave Hansen
2024-03-12 1:25 ` H. Peter Anvin
2024-03-12 2:16 ` Andy Lutomirski
2024-03-12 2:20 ` H. Peter Anvin
2024-03-12 21:58 ` Andi Kleen
2024-03-13 10:23 ` Thomas Gleixner
2024-03-13 13:43 ` Pasha Tatashin
2024-03-13 15:28 ` Pasha Tatashin
2024-03-13 16:12 ` Thomas Gleixner
2024-03-14 14:03 ` Pasha Tatashin
2024-03-14 18:26 ` Thomas Gleixner
2024-03-11 16:46 ` [RFC 12/14] task_stack.h: Clean-up stack_not_used() implementation Pasha Tatashin
2024-03-11 16:46 ` Pasha Tatashin [this message]
2024-03-11 16:46 ` [RFC 14/14] fork: Dynamic Kernel Stack accounting Pasha Tatashin
2024-03-11 17:09 ` [RFC 00/14] Dynamic Kernel Stacks Mateusz Guzik
2024-03-11 18:58 ` Pasha Tatashin
2024-03-11 19:21 ` Mateusz Guzik
2024-03-11 19:55 ` Pasha Tatashin
2024-03-12 17:18 ` H. Peter Anvin
2024-03-12 19:45 ` Pasha Tatashin
2024-03-12 21:36 ` H. Peter Anvin
2024-03-14 19:05 ` Kent Overstreet
2024-03-14 19:23 ` Pasha Tatashin
2024-03-14 19:28 ` Kent Overstreet
2024-03-14 19:34 ` Pasha Tatashin
2024-03-14 19:49 ` Kent Overstreet
2024-03-12 22:18 ` David Laight
2024-03-14 19:43 ` Matthew Wilcox
2024-03-14 19:53 ` Kent Overstreet
2024-03-14 19:57 ` Matthew Wilcox
2024-03-14 19:58 ` Kent Overstreet
2024-03-15 3:13 ` Pasha Tatashin
2024-03-15 3:39 ` H. Peter Anvin
2024-03-16 19:17 ` Pasha Tatashin
2024-03-17 0:41 ` Matthew Wilcox
2024-03-17 1:32 ` Kent Overstreet
2024-03-17 14:19 ` Pasha Tatashin
2024-03-17 14:43 ` Brian Gerst
2024-03-17 16:15 ` Pasha Tatashin
2024-03-17 21:30 ` Brian Gerst
2024-03-18 14:59 ` Pasha Tatashin
2024-03-18 21:02 ` Brian Gerst
2024-03-19 14:56 ` Pasha Tatashin
2024-03-17 18:57 ` David Laight
2024-03-18 15:09 ` Pasha Tatashin
2024-03-18 15:13 ` Pasha Tatashin
2024-03-18 15:19 ` Matthew Wilcox
2024-03-18 15:30 ` Pasha Tatashin
2024-03-18 15:53 ` David Laight
2024-03-18 16:57 ` Pasha Tatashin
2024-03-18 15:38 ` David Laight
2024-03-18 17:00 ` Pasha Tatashin
2024-03-18 17:37 ` Pasha Tatashin
2024-03-15 4:17 ` H. Peter Anvin
2024-03-17 0:47 ` H. Peter Anvin
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=20240311164638.2015063-14-pasha.tatashin@soleen.com \
--to=pasha.tatashin@soleen.com \
--cc=akpm@linux-foundation.org \
--cc=bp@alien8.de \
--cc=brauner@kernel.org \
--cc=bristot@redhat.com \
--cc=bsegall@google.com \
--cc=dave.hansen@linux.intel.com \
--cc=dianders@chromium.org \
--cc=dietmar.eggemann@arm.com \
--cc=eric.devolder@oracle.com \
--cc=hca@linux.ibm.com \
--cc=hch@infradead.org \
--cc=hpa@zytor.com \
--cc=jacob.jun.pan@linux.intel.com \
--cc=jgg@ziepe.ca \
--cc=jpoimboe@kernel.org \
--cc=jroedel@suse.de \
--cc=juri.lelli@redhat.com \
--cc=kent.overstreet@linux.dev \
--cc=kinseyho@google.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lstoakes@gmail.com \
--cc=luto@kernel.org \
--cc=mgorman@suse.de \
--cc=mic@digikod.net \
--cc=michael.christie@oracle.com \
--cc=mingo@redhat.com \
--cc=mjguzik@gmail.com \
--cc=mst@redhat.com \
--cc=npiggin@gmail.com \
--cc=peterz@infradead.org \
--cc=pmladek@suse.com \
--cc=rick.p.edgecombe@intel.com \
--cc=rostedt@goodmis.org \
--cc=surenb@google.com \
--cc=tglx@linutronix.de \
--cc=urezki@gmail.com \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
--cc=x86@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox