mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-30 19:07:15 +00:00
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
71 lines
2.5 KiB
C
71 lines
2.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LINUX_STACKTRACE_H
|
|
#define __LINUX_STACKTRACE_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/errno.h>
|
|
|
|
struct task_struct;
|
|
struct pt_regs;
|
|
|
|
#ifdef CONFIG_STACKTRACE
|
|
void stack_trace_print(unsigned long *trace, unsigned int nr_entries,
|
|
int spaces);
|
|
int stack_trace_snprint(char *buf, size_t size, unsigned long *entries,
|
|
unsigned int nr_entries, int spaces);
|
|
unsigned int stack_trace_save(unsigned long *store, unsigned int size,
|
|
unsigned int skipnr);
|
|
unsigned int stack_trace_save_tsk(struct task_struct *task,
|
|
unsigned long *store, unsigned int size,
|
|
unsigned int skipnr);
|
|
unsigned int stack_trace_save_regs(struct pt_regs *regs, unsigned long *store,
|
|
unsigned int size, unsigned int skipnr);
|
|
unsigned int stack_trace_save_user(unsigned long *store, unsigned int size);
|
|
|
|
/* Internal interfaces. Do not use in generic code */
|
|
struct stack_trace {
|
|
unsigned int nr_entries, max_entries;
|
|
unsigned long *entries;
|
|
int skip; /* input argument: How many entries to skip */
|
|
};
|
|
|
|
extern void save_stack_trace(struct stack_trace *trace);
|
|
extern void save_stack_trace_regs(struct pt_regs *regs,
|
|
struct stack_trace *trace);
|
|
extern void save_stack_trace_tsk(struct task_struct *tsk,
|
|
struct stack_trace *trace);
|
|
extern int save_stack_trace_tsk_reliable(struct task_struct *tsk,
|
|
struct stack_trace *trace);
|
|
|
|
extern void print_stack_trace(struct stack_trace *trace, int spaces);
|
|
extern int snprint_stack_trace(char *buf, size_t size,
|
|
struct stack_trace *trace, int spaces);
|
|
|
|
#ifdef CONFIG_USER_STACKTRACE_SUPPORT
|
|
extern void save_stack_trace_user(struct stack_trace *trace);
|
|
#else
|
|
# define save_stack_trace_user(trace) do { } while (0)
|
|
#endif
|
|
|
|
#else /* !CONFIG_STACKTRACE */
|
|
# define save_stack_trace(trace) do { } while (0)
|
|
# define save_stack_trace_tsk(tsk, trace) do { } while (0)
|
|
# define save_stack_trace_user(trace) do { } while (0)
|
|
# define print_stack_trace(trace, spaces) do { } while (0)
|
|
# define snprint_stack_trace(buf, size, trace, spaces) do { } while (0)
|
|
# define save_stack_trace_tsk_reliable(tsk, trace) ({ -ENOSYS; })
|
|
#endif /* CONFIG_STACKTRACE */
|
|
|
|
#if defined(CONFIG_STACKTRACE) && defined(CONFIG_HAVE_RELIABLE_STACKTRACE)
|
|
int stack_trace_save_tsk_reliable(struct task_struct *tsk, unsigned long *store,
|
|
unsigned int size);
|
|
#else
|
|
static inline int stack_trace_save_tsk_reliable(struct task_struct *tsk,
|
|
unsigned long *store,
|
|
unsigned int size)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
#endif
|
|
|
|
#endif /* __LINUX_STACKTRACE_H */
|