mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 11:56:58 +00:00
dynamic_debug: add support for print stack
In practical problem diagnosis, especially during the boot phase, it is often desirable to know the call sequence. However, currently, apart from adding print statements and recompiling the kernel, there seems to be no good alternative. If dynamic_debug supported printing the call stack, it would be very helpful for diagnosing issues. This patch add support '+d' for dump stack. Link: https://lkml.kernel.org/r/20251025080003.312536-1-yebin@huaweicloud.com Signed-off-by: Ye Bin <yebin10@huawei.com> Cc: Jason Baron <jbaron@akamai.com> Cc: Jim Cromie <jim.cromie@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
@@ -223,12 +223,13 @@ The flags are::
|
||||
f Include the function name
|
||||
s Include the source file name
|
||||
l Include line number
|
||||
d Include call trace
|
||||
|
||||
For ``print_hex_dump_debug()`` and ``print_hex_dump_bytes()``, only
|
||||
the ``p`` flag has meaning, other flags are ignored.
|
||||
|
||||
Note the regexp ``^[-+=][fslmpt_]+$`` matches a flags specification.
|
||||
To clear all flags at once, use ``=_`` or ``-fslmpt``.
|
||||
Note the regexp ``^[-+=][fslmptd_]+$`` matches a flags specification.
|
||||
To clear all flags at once, use ``=_`` or ``-fslmptd``.
|
||||
|
||||
|
||||
Debug messages during Boot Process
|
||||
|
||||
@@ -38,11 +38,12 @@ struct _ddebug {
|
||||
#define _DPRINTK_FLAGS_INCL_LINENO (1<<3)
|
||||
#define _DPRINTK_FLAGS_INCL_TID (1<<4)
|
||||
#define _DPRINTK_FLAGS_INCL_SOURCENAME (1<<5)
|
||||
#define _DPRINTK_FLAGS_INCL_STACK (1<<6)
|
||||
|
||||
#define _DPRINTK_FLAGS_INCL_ANY \
|
||||
(_DPRINTK_FLAGS_INCL_MODNAME | _DPRINTK_FLAGS_INCL_FUNCNAME |\
|
||||
_DPRINTK_FLAGS_INCL_LINENO | _DPRINTK_FLAGS_INCL_TID |\
|
||||
_DPRINTK_FLAGS_INCL_SOURCENAME)
|
||||
_DPRINTK_FLAGS_INCL_SOURCENAME | _DPRINTK_FLAGS_INCL_STACK)
|
||||
|
||||
#if defined DEBUG
|
||||
#define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
|
||||
@@ -160,6 +161,12 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
|
||||
const struct ib_device *ibdev,
|
||||
const char *fmt, ...);
|
||||
|
||||
#define __dynamic_dump_stack(desc) \
|
||||
{ \
|
||||
if (desc.flags & _DPRINTK_FLAGS_INCL_STACK) \
|
||||
dump_stack(); \
|
||||
}
|
||||
|
||||
#define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt) \
|
||||
static struct _ddebug __aligned(8) \
|
||||
__section("__dyndbg") name = { \
|
||||
@@ -220,8 +227,10 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
|
||||
*/
|
||||
#define __dynamic_func_call_cls(id, cls, fmt, func, ...) do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \
|
||||
if (DYNAMIC_DEBUG_BRANCH(id)) \
|
||||
if (DYNAMIC_DEBUG_BRANCH(id)) { \
|
||||
func(&id, ##__VA_ARGS__); \
|
||||
__dynamic_dump_stack(id); \
|
||||
} \
|
||||
} while (0)
|
||||
#define __dynamic_func_call(id, fmt, func, ...) \
|
||||
__dynamic_func_call_cls(id, _DPRINTK_CLASS_DFLT, fmt, \
|
||||
@@ -229,8 +238,10 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
|
||||
|
||||
#define __dynamic_func_call_cls_no_desc(id, cls, fmt, func, ...) do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA_CLS(id, cls, fmt); \
|
||||
if (DYNAMIC_DEBUG_BRANCH(id)) \
|
||||
if (DYNAMIC_DEBUG_BRANCH(id)) { \
|
||||
func(__VA_ARGS__); \
|
||||
__dynamic_dump_stack(id); \
|
||||
} \
|
||||
} while (0)
|
||||
#define __dynamic_func_call_no_desc(id, fmt, func, ...) \
|
||||
__dynamic_func_call_cls_no_desc(id, _DPRINTK_CLASS_DFLT, \
|
||||
|
||||
@@ -95,6 +95,7 @@ static const struct { unsigned flag:8; char opt_char; } opt_array[] = {
|
||||
{ _DPRINTK_FLAGS_INCL_SOURCENAME, 's' },
|
||||
{ _DPRINTK_FLAGS_INCL_LINENO, 'l' },
|
||||
{ _DPRINTK_FLAGS_INCL_TID, 't' },
|
||||
{ _DPRINTK_FLAGS_INCL_STACK, 'd' },
|
||||
{ _DPRINTK_FLAGS_NONE, '_' },
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user