kernel/module: add __dyndbg_classes section
authorJim Cromie <jim.cromie@gmail.com>
Sun, 4 Sep 2022 21:40:52 +0000 (15:40 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 7 Sep 2022 15:04:49 +0000 (17:04 +0200)
Add __dyndbg_classes section, using __dyndbg as a model. Use it:

vmlinux.lds.h:

KEEP the new section, which also silences orphan section warning on
loadable modules.  Add (__start_/__stop_)__dyndbg_classes linker
symbols for the c externs (below).

kernel/module/main.c:
- fill new fields in find_module_sections(), using section_objs()
- extend callchain prototypes
  to pass classes, length
  load_module(): pass new info to dynamic_debug_setup()
  dynamic_debug_setup(): new params, pass through to ddebug_add_module()

dynamic_debug.c:
- add externs to the linker symbols.

ddebug_add_module():
- It currently builds a debug_table, and *will* find and attach classes.

dynamic_debug_init():
- add class fields to the _ddebug_info cursor var: di.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Link: https://lore.kernel.org/r/20220904214134.408619-16-jim.cromie@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/asm-generic/vmlinux.lds.h
include/linux/dynamic_debug.h
kernel/module/main.c
lib/dynamic_debug.c

index 7515a465ec03a64f1a28db6b917e1d259d2aaade..9b8bd5504ad9e13319839f38d34f5546f04df1fb 100644 (file)
        *(__tracepoints)                                                \
        /* implement dynamic printk debug */                            \
        . = ALIGN(8);                                                   \
+       __start___dyndbg_classes = .;                                   \
+       KEEP(*(__dyndbg_classes))                                       \
+       __stop___dyndbg_classes = .;                                    \
        __start___dyndbg = .;                                           \
        KEEP(*(__dyndbg))                                               \
        __stop___dyndbg = .;                                            \
index 98dbf1d49984a946cb5843ad858cad0d69940869..9073a43a2039a645e525d212a67c51a91ae03ace 100644 (file)
@@ -114,7 +114,9 @@ struct ddebug_class_map {
 /* encapsulate linker provided built-in (or module) dyndbg data */
 struct _ddebug_info {
        struct _ddebug *descs;
+       struct ddebug_class_map *classes;
        unsigned int num_descs;
+       unsigned int num_classes;
 };
 
 #if defined(CONFIG_DYNAMIC_DEBUG_CORE)
index a26b436ad992341d00e24d45cbcf232cd30dea1c..00641d1022a57881ead2d4ff376ddade4ce7fefa 100644 (file)
@@ -2113,6 +2113,8 @@ static int find_module_sections(struct module *mod, struct load_info *info)
 
        info->dyndbg.descs = section_objs(info, "__dyndbg",
                                        sizeof(*info->dyndbg.descs), &info->dyndbg.num_descs);
+       info->dyndbg.classes = section_objs(info, "__dyndbg_classes",
+                                       sizeof(*info->dyndbg.classes), &info->dyndbg.num_classes);
 
        return 0;
 }
index c358ccdf4a39350278ee4b02eb133001bd0df3ba..fb31a1a2fc3fd106f781a64c3f9fd2f5122b4834 100644 (file)
@@ -41,6 +41,8 @@
 
 extern struct _ddebug __start___dyndbg[];
 extern struct _ddebug __stop___dyndbg[];
+extern struct ddebug_class_map __start___dyndbg_classes[];
+extern struct ddebug_class_map __stop___dyndbg_classes[];
 
 struct ddebug_table {
        struct list_head link;
@@ -1079,7 +1081,9 @@ static int __init dynamic_debug_init(void)
 
        struct _ddebug_info di = {
                .descs = __start___dyndbg,
+               .classes = __start___dyndbg_classes,
                .num_descs = __stop___dyndbg - __start___dyndbg,
+               .num_classes = __stop___dyndbg_classes - __start___dyndbg_classes,
        };
 
        if (&__start___dyndbg == &__stop___dyndbg) {
@@ -1122,6 +1126,9 @@ static int __init dynamic_debug_init(void)
                 i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10),
                 (int)((i * sizeof(struct _ddebug)) >> 10));
 
+       if (di.num_classes)
+               v2pr_info("  %d builtin ddebug class-maps\n", di.num_classes);
+
        /* now that ddebug tables are loaded, process all boot args
         * again to find and activate queries given in dyndbg params.
         * While this has already been done for known boot params, it