aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/stacktrace.h
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2019-04-25 05:44:55 -0400
committerThomas Gleixner <tglx@linutronix.de>2019-04-29 06:37:46 -0400
commite9b98e162aa53cbea7c8b0d6c9d5dc6e0f822b9c (patch)
treee9371b3d5931ee441424286cc581d6393407d983 /include/linux/stacktrace.h
parent3d9a8072915366b5932beeed97f158f8d4955768 (diff)
stacktrace: Provide helpers for common stack trace operations
All operations with stack traces are based on struct stack_trace. That's a horrible construct as the struct is a kitchen sink for input and output. Quite some usage sites embed it into their own data structures which creates weird indirections. There is absolutely no point in doing so. For all use cases a storage array and the number of valid stack trace entries in the array is sufficient. Provide helper functions which avoid the struct stack_trace indirection so the usage sites can be cleaned up. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Alexander Potapenko <glider@google.com> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Christoph Lameter <cl@linux.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: linux-mm@kvack.org Cc: David Rientjes <rientjes@google.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: kasan-dev@googlegroups.com Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> Cc: Akinobu Mita <akinobu.mita@gmail.com> Cc: Christoph Hellwig <hch@lst.de> Cc: iommu@lists.linux-foundation.org Cc: Robin Murphy <robin.murphy@arm.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Johannes Thumshirn <jthumshirn@suse.de> Cc: David Sterba <dsterba@suse.com> Cc: Chris Mason <clm@fb.com> Cc: Josef Bacik <josef@toxicpanda.com> Cc: linux-btrfs@vger.kernel.org Cc: dm-devel@redhat.com Cc: Mike Snitzer <snitzer@redhat.com> Cc: Alasdair Kergon <agk@redhat.com> Cc: Daniel Vetter <daniel@ffwll.ch> Cc: intel-gfx@lists.freedesktop.org Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: dri-devel@lists.freedesktop.org Cc: David Airlie <airlied@linux.ie> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Tom Zanussi <tom.zanussi@linux.intel.com> Cc: Miroslav Benes <mbenes@suse.cz> Cc: linux-arch@vger.kernel.org Link: https://lkml.kernel.org/r/20190425094801.324810708@linutronix.de
Diffstat (limited to 'include/linux/stacktrace.h')
-rw-r--r--include/linux/stacktrace.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/include/linux/stacktrace.h b/include/linux/stacktrace.h
index ba29a0613e66..a24340b3e9e1 100644
--- a/include/linux/stacktrace.h
+++ b/include/linux/stacktrace.h
@@ -3,11 +3,26 @@
3#define __LINUX_STACKTRACE_H 3#define __LINUX_STACKTRACE_H
4 4
5#include <linux/types.h> 5#include <linux/types.h>
6#include <asm/errno.h>
6 7
7struct task_struct; 8struct task_struct;
8struct pt_regs; 9struct pt_regs;
9 10
10#ifdef CONFIG_STACKTRACE 11#ifdef CONFIG_STACKTRACE
12void stack_trace_print(unsigned long *trace, unsigned int nr_entries,
13 int spaces);
14int stack_trace_snprint(char *buf, size_t size, unsigned long *entries,
15 unsigned int nr_entries, int spaces);
16unsigned int stack_trace_save(unsigned long *store, unsigned int size,
17 unsigned int skipnr);
18unsigned int stack_trace_save_tsk(struct task_struct *task,
19 unsigned long *store, unsigned int size,
20 unsigned int skipnr);
21unsigned int stack_trace_save_regs(struct pt_regs *regs, unsigned long *store,
22 unsigned int size, unsigned int skipnr);
23unsigned int stack_trace_save_user(unsigned long *store, unsigned int size);
24
25/* Internal interfaces. Do not use in generic code */
11struct stack_trace { 26struct stack_trace {
12 unsigned int nr_entries, max_entries; 27 unsigned int nr_entries, max_entries;
13 unsigned long *entries; 28 unsigned long *entries;
@@ -41,4 +56,16 @@ extern void save_stack_trace_user(struct stack_trace *trace);
41# define save_stack_trace_tsk_reliable(tsk, trace) ({ -ENOSYS; }) 56# define save_stack_trace_tsk_reliable(tsk, trace) ({ -ENOSYS; })
42#endif /* CONFIG_STACKTRACE */ 57#endif /* CONFIG_STACKTRACE */
43 58
59#if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE)
60int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store,
61 unsigned int size);
62#else
63static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk,
64 unsigned long *store,
65 unsigned int size)
66{
67 return -ENOSYS;
68}
69#endif
70
44#endif /* __LINUX_STACKTRACE_H */ 71#endif /* __LINUX_STACKTRACE_H */