recompose struct _ddebug_info, inserting proper sub-structs.

The struct _ddebug_info has 2 pairs of _vec, num_##_vec fields, for
descs and classes respectively.  for_subvec() makes walking these
vectors less cumbersome, now lets move those field pairs into their
own "vec" structs: _ddebug_descs & _ddebug_class_maps, and re-compose
struct _ddebug_info to contain them cleanly.  This also lets us get
rid of for_subvec()'s num_##_vec paste-up.

Also recompose struct ddebug_table to contain a _ddebug_info.  This
reinforces _ddebug_info's use as a cursor into relevant data for a
builtin module, and access to the full _ddebug state for modules.

NOTES:

Change section names together, for more obvious name pairing.

Invariant: These vectors ref a contiguous subrange of __section memory
in builtin/DATA or in loadable modules via mod->dyndbg_info; with
guaranteed life-time for us.

struct module contains a _ddebug_info field and module/main.c sets it
up, so that gets adjusted rather obviously.

Signed-off-by: Jim Cromie <[email protected]>
Reviewed-by: Louis Chauvet <[email protected]>
---

v3: squash in section name changes.

v2:

Move RvB after SoB
In structs _ddebug_descs & _ddebug_class_maps, change int length to unsigned int
No use of <0 vals is contemplated.

dyndbg: improve section names

change __dyndbg to __dyndbg_descs
change __dyndbg_classes to __dyndbg_class_maps

this sets up for adding __dyndbg_class_users
---
 drivers/gpu/drm/drm_print.c      |  2 +-
 include/asm-generic/dyndbg.lds.h | 14 +++---
 include/linux/dynamic_debug.h    | 34 +++++++++-----
 kernel/module/main.c             | 12 ++---
 lib/dynamic_debug.c              | 98 ++++++++++++++++++++--------------------
 5 files changed, 86 insertions(+), 74 deletions(-)

diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c
index 711ae6606c6e..da2171186c6b 100644
--- a/drivers/gpu/drm/drm_print.c
+++ b/drivers/gpu/drm/drm_print.c
@@ -69,7 +69,7 @@ DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, 
DD_CLASS_TYPE_DISJOINT_BITS, 0,
                        "DRM_UT_DP",
                        "DRM_UT_DRMRES");
 
-static struct ddebug_class_param drm_debug_bitmap = {
+static struct _ddebug_class_param drm_debug_bitmap = {
        .bits = &__drm_debug,
        .flags = "p",
        .map = &drm_debug_classes,
diff --git a/include/asm-generic/dyndbg.lds.h b/include/asm-generic/dyndbg.lds.h
index 9d8951bef688..ec661f9f3793 100644
--- a/include/asm-generic/dyndbg.lds.h
+++ b/include/asm-generic/dyndbg.lds.h
@@ -3,16 +3,16 @@
 #define __ASM_GENERIC_DYNDBG_LDS_H
 
 #include <asm-generic/bounded_sections.lds.h>
-#define DYNDBG_SECTIONS()                                      \
-       BOUNDED_SECTION_BY(__dyndbg, ___dyndbg)                 \
-       BOUNDED_SECTION_BY(__dyndbg_classes, ___dyndbg_classes)
+#define DYNDBG_SECTIONS()                                              \
+       BOUNDED_SECTION_BY(__dyndbg_descs, ___dyndbg_descs)             \
+       BOUNDED_SECTION_BY(__dyndbg_class_maps, ___dyndbg_class_maps)
 
 #define MOD_DYNDBG_SECTIONS()                                          \
-       __dyndbg 0 : ALIGN(8) {                                         \
-               KEEP(*(__dyndbg))                                       \
+       __dyndbg_descs 0 : ALIGN(8) {                                   \
+               KEEP(*(__dyndbg_descs))                                 \
        }                                                               \
-       __dyndbg_classes 0 : ALIGN(8) {                                 \
-               KEEP(*(__dyndbg_classes))                               \
+       __dyndbg_class_maps 0 : ALIGN(8) {                              \
+               KEEP(*(__dyndbg_class_maps))                            \
        }
 
 #endif /* __ASM_GENERIC_DYNDBG_LDS_H */
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 250b8391cb14..ca27bdd92693 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -87,7 +87,7 @@ enum ddebug_class_map_type {
 };
 
 struct ddebug_class_map {
-       struct module *mod;
+       struct module *mod;     /* NULL for builtins */
        const char *mod_name;   /* needed for builtins */
        const char **class_names;
        const int length;
@@ -95,12 +95,24 @@ struct ddebug_class_map {
        enum ddebug_class_map_type map_type;
 };
 
-/* encapsulate linker provided built-in (or module) dyndbg data */
+/*
+ * @_ddebug_info: gathers module/builtin dyndbg_* __sections together.
+ * For builtins, it is used as a cursor, with the inner structs
+ * marking sub-vectors of the builtin __sections in DATA.
+ */
+struct _ddebug_descs {
+       struct _ddebug *start;
+       unsigned int len;
+};
+
+struct _ddebug_class_maps {
+       struct ddebug_class_map *start;
+       unsigned int len;
+};
+
 struct _ddebug_info {
-       struct _ddebug *descs;
-       struct ddebug_class_map *classes;
-       unsigned int num_descs;
-       unsigned int num_classes;
+       struct _ddebug_descs descs;
+       struct _ddebug_class_maps maps;
 };
 
 struct ddebug_class_param {
@@ -121,7 +133,7 @@ struct ddebug_class_param {
 
 /**
  * DECLARE_DYNDBG_CLASSMAP - declare classnames known by a module
- * @_var:   a struct _ddebug_class_map, passed to module_param_cb
+ * @_var:   a struct ddebug_class_map, passed to module_param_cb
  * @_maptype: enum ddebug_class_map_type, chooses bits/verbose
  * @_base:  offset of 1st class-name. splits .class_id space
  * @classes: class-names used to control class'd prdbgs
@@ -129,7 +141,7 @@ struct ddebug_class_param {
 #define DECLARE_DYNDBG_CLASSMAP(_var, _maptype, _base, ...)            \
        static const char *_var##_classnames[] = { __VA_ARGS__ };       \
        static struct ddebug_class_map __aligned(8) __used              \
-               __section("__dyndbg_classes") _var = {                  \
+               __section("__dyndbg_class_maps") _var = {                       
\
                .mod = THIS_MODULE,                                     \
                .mod_name = DDEBUG_MODNAME,                             \
                .base = _base,                                          \
@@ -169,7 +181,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
 
 #define DEFINE_DYNAMIC_DEBUG_METADATA_CLS(name, cls, fmt)      \
        static struct _ddebug  __aligned(8)                     \
-       __section("__dyndbg") name = {                          \
+       __section("__dyndbg_descs") name = {                    \
                .modname = DDEBUG_MODNAME,                      \
                .function = __func__,                           \
                .filename = __FILE__,                           \
@@ -256,7 +268,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
  * macro.
  */
 #define _dynamic_func_call_cls(cls, fmt, func, ...)                    \
-       __dynamic_func_call_cls(__UNIQUE_ID(ddebug), cls, fmt, func, 
##__VA_ARGS__)
+       __dynamic_func_call_cls(__UNIQUE_ID(_ddebug), cls, fmt, func, 
##__VA_ARGS__)
 #define _dynamic_func_call(fmt, func, ...)                             \
        _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__)
 
@@ -266,7 +278,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
  * with precisely the macro's varargs.
  */
 #define _dynamic_func_call_cls_no_desc(cls, fmt, func, ...)            \
-       __dynamic_func_call_cls_no_desc(__UNIQUE_ID(ddebug), cls, fmt,  \
+       __dynamic_func_call_cls_no_desc(__UNIQUE_ID(_ddebug), cls, fmt, \
                                        func, ##__VA_ARGS__)
 #define _dynamic_func_call_no_desc(fmt, func, ...)                     \
        _dynamic_func_call_cls_no_desc(_DPRINTK_CLASS_DFLT, fmt,        \
diff --git a/kernel/module/main.c b/kernel/module/main.c
index 46dd8d25a605..bd7899a91755 100644
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -2774,12 +2774,12 @@ static int find_module_sections(struct module *mod, 
struct load_info *info)
                pr_warn("%s: Ignoring obsolete parameters\n", mod->name);
 
 #ifdef CONFIG_DYNAMIC_DEBUG_CORE
-       mod->dyndbg_info.descs = section_objs(info, "__dyndbg",
-                                             sizeof(*mod->dyndbg_info.descs),
-                                             &mod->dyndbg_info.num_descs);
-       mod->dyndbg_info.classes = section_objs(info, "__dyndbg_classes",
-                                               
sizeof(*mod->dyndbg_info.classes),
-                                               &mod->dyndbg_info.num_classes);
+       mod->dyndbg_info.descs.start = section_objs(info, "__dyndbg_descs",
+                                                   
sizeof(*mod->dyndbg_info.descs.start),
+                                                   
&mod->dyndbg_info.descs.len);
+       mod->dyndbg_info.maps.start = section_objs(info, "__dyndbg_class_maps",
+                                                  
sizeof(*mod->dyndbg_info.maps.start),
+                                                  &mod->dyndbg_info.maps.len);
 #endif
 
        return 0;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index af05f4ae3b55..5a884cbd6294 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -39,17 +39,15 @@
 
 #include <rdma/ib_verbs.h>
 
-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[];
+extern struct _ddebug __start___dyndbg_descs[];
+extern struct _ddebug __stop___dyndbg_descs[];
+extern struct ddebug_class_map __start___dyndbg_class_maps[];
+extern struct ddebug_class_map __stop___dyndbg_class_maps[];
 
 struct ddebug_table {
        struct list_head link;
        const char *mod_name;
-       struct _ddebug *ddebugs;
-       struct ddebug_class_map *classes;
-       unsigned int num_ddebugs, num_classes;
+       struct _ddebug_info info;
 };
 
 struct ddebug_query {
@@ -159,18 +157,18 @@ static void v3pr_info_dq(const struct ddebug_query 
*query, const char *msg)
  * @_vec: name of a member in @_box
  */
 #define for_subvec(_i, _sp, _box, _vec)                        \
-       for ((_i) = 0, (_sp) = (_box)->_vec;            \
-            (_i) < (_box)->num_##_vec;                 \
+       for ((_i) = 0, (_sp) = (_box)->_vec.start;      \
+            (_i) < (_box)->_vec.len;                   \
             (_i)++, (_sp)++)           /* { block } */
 
 static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table 
const *dt,
-                                                       const char 
*class_string,
-                                                       int *class_id)
+                                                        const char 
*class_string,
+                                                        int *class_id)
 {
        struct ddebug_class_map *map;
        int i, idx;
 
-       for_subvec(i, map, dt, classes) {
+       for_subvec(i, map, &dt->info, maps) {
                idx = match_string(map->class_names, map->length, class_string);
                if (idx >= 0) {
                        *class_id = idx + map->base;
@@ -267,8 +265,8 @@ static int ddebug_change(const struct ddebug_query *query,
                        valid_class = _DPRINTK_CLASS_DFLT;
                }
 
-               for (i = 0; i < dt->num_ddebugs; i++) {
-                       struct _ddebug *dp = &dt->ddebugs[i];
+               for (i = 0; i < dt->info.descs.len; i++) {
+                       struct _ddebug *dp = &dt->info.descs.start[i];
 
                        if (!ddebug_match_desc(query, dp, valid_class))
                                continue;
@@ -1013,8 +1011,8 @@ static struct _ddebug *ddebug_iter_first(struct 
ddebug_iter *iter)
        }
        iter->table = list_entry(ddebug_tables.next,
                                 struct ddebug_table, link);
-       iter->idx = iter->table->num_ddebugs;
-       return &iter->table->ddebugs[--iter->idx];
+       iter->idx = iter->table->info.descs.len;
+       return &iter->table->info.descs.start[--iter->idx];
 }
 
 /*
@@ -1035,10 +1033,10 @@ static struct _ddebug *ddebug_iter_next(struct 
ddebug_iter *iter)
                }
                iter->table = list_entry(iter->table->link.next,
                                         struct ddebug_table, link);
-               iter->idx = iter->table->num_ddebugs;
+               iter->idx = iter->table->info.descs.len;
                --iter->idx;
        }
-       return &iter->table->ddebugs[iter->idx];
+       return &iter->table->info.descs.start[iter->idx];
 }
 
 /*
@@ -1082,16 +1080,19 @@ static void *ddebug_proc_next(struct seq_file *m, void 
*p, loff_t *pos)
        return dp;
 }
 
-#define class_in_range(class_id, map)                                  \
-       (class_id >= map->base && class_id < map->base + map->length)
+static bool ddebug_class_in_range(const int class_id, const struct 
ddebug_class_map *map)
+{
+       return (class_id >= map->base &&
+               class_id < map->base + map->length);
+}
 
-static const char *ddebug_class_name(struct ddebug_iter *iter, struct _ddebug 
*dp)
+static const char *ddebug_class_name(struct ddebug_table *dt, struct _ddebug 
*dp)
 {
-       struct ddebug_class_map *map = iter->table->classes;
-       int i, nc = iter->table->num_classes;
+       struct ddebug_class_map *map;
+       int i;
 
-       for (i = 0; i < nc; i++, map++)
-               if (class_in_range(dp->class_id, map))
+       for_subvec(i, map, &dt->info, maps)
+               if (ddebug_class_in_range(dp->class_id, map))
                        return map->class_names[dp->class_id - map->base];
 
        return NULL;
@@ -1124,7 +1125,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
        seq_putc(m, '"');
 
        if (dp->class_id != _DPRINTK_CLASS_DFLT) {
-               class = ddebug_class_name(iter, dp);
+               class = ddebug_class_name(iter->table, dp);
                if (class)
                        seq_printf(m, " class:%s", class);
                else
@@ -1184,12 +1185,12 @@ static void ddebug_attach_module_classes(struct 
ddebug_table *dt, struct _ddebug
         * the builtin/modular classmap vector/section.  Save the start
         * and length of the subrange at its edges.
         */
-       for_subvec(i, cm, di, classes) {
+       for_subvec(i, cm, di, maps) {
                if (!strcmp(cm->mod_name, dt->mod_name)) {
                        if (!nc) {
                                v2pr_info("start subrange, class[%d]: module:%s 
base:%d len:%d ty:%d\n",
                                          i, cm->mod_name, cm->base, 
cm->length, cm->map_type);
-                               dt->classes = cm;
+                               dt->info.maps.start = cm;
                        }
                        nc++;
                } else if (nc) {
@@ -1198,7 +1199,7 @@ static void ddebug_attach_module_classes(struct 
ddebug_table *dt, struct _ddebug
                }
        }
        if (nc) {
-               dt->num_classes = nc;
+               dt->info.maps.len = nc;
                vpr_info("module:%s attached %d classes\n", dt->mod_name, nc);
        }
 }
@@ -1211,10 +1212,10 @@ static int ddebug_add_module(struct _ddebug_info *di, 
const char *modname)
 {
        struct ddebug_table *dt;
 
-       if (!di->num_descs)
+       if (!di->descs.len)
                return 0;
 
-       v3pr_info("add-module: %s %d sites\n", modname, di->num_descs);
+       v3pr_info("add-module: %s %d sites\n", modname, di->descs.len);
 
        dt = kzalloc_obj(*dt);
        if (dt == NULL) {
@@ -1228,19 +1229,18 @@ static int ddebug_add_module(struct _ddebug_info *di, 
const char *modname)
         * this struct ddebug_table.
         */
        dt->mod_name = modname;
-       dt->ddebugs = di->descs;
-       dt->num_ddebugs = di->num_descs;
+       dt->info = *di;
 
        INIT_LIST_HEAD(&dt->link);
 
-       if (di->classes && di->num_classes)
+       if (di->maps.len)
                ddebug_attach_module_classes(dt, di);
 
        mutex_lock(&ddebug_lock);
        list_add_tail(&dt->link, &ddebug_tables);
        mutex_unlock(&ddebug_lock);
 
-       vpr_info("%3u debug prints in module %s\n", di->num_descs, modname);
+       vpr_info("%3u debug prints in module %s\n", di->descs.len, modname);
        return 0;
 }
 
@@ -1387,10 +1387,10 @@ static int __init dynamic_debug_init(void)
        char *cmdline;
 
        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,
+               .descs.start = __start___dyndbg_descs,
+               .maps.start  = __start___dyndbg_class_maps,
+               .descs.len = __stop___dyndbg_descs - __start___dyndbg_descs,
+               .maps.len  = __stop___dyndbg_class_maps - 
__start___dyndbg_class_maps,
        };
 
 #ifdef CONFIG_MODULES
@@ -1401,7 +1401,7 @@ static int __init dynamic_debug_init(void)
        }
 #endif /* CONFIG_MODULES */
 
-       if (&__start___dyndbg == &__stop___dyndbg) {
+       if (&__start___dyndbg_descs == &__stop___dyndbg_descs) {
                if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
                        pr_warn("_ddebug table is empty in a 
CONFIG_DYNAMIC_DEBUG build\n");
                        return 1;
@@ -1411,16 +1411,16 @@ static int __init dynamic_debug_init(void)
                return 0;
        }
 
-       iter = iter_mod_start = __start___dyndbg;
+       iter = iter_mod_start = __start___dyndbg_descs;
        modname = iter->modname;
        i = mod_sites = mod_ct = 0;
 
-       for (; iter < __stop___dyndbg; iter++, i++, mod_sites++) {
+       for (; iter < __stop___dyndbg_descs; iter++, i++, mod_sites++) {
 
                if (strcmp(modname, iter->modname)) {
                        mod_ct++;
-                       di.num_descs = mod_sites;
-                       di.descs = iter_mod_start;
+                       di.descs.len = mod_sites;
+                       di.descs.start = iter_mod_start;
                        ret = ddebug_add_module(&di, modname);
                        if (ret)
                                goto out_err;
@@ -1430,19 +1430,19 @@ static int __init dynamic_debug_init(void)
                        iter_mod_start = iter;
                }
        }
-       di.num_descs = mod_sites;
-       di.descs = iter_mod_start;
+       di.descs.len = mod_sites;
+       di.descs.start = iter_mod_start;
        ret = ddebug_add_module(&di, modname);
        if (ret)
                goto out_err;
 
        ddebug_init_success = 1;
-       vpr_info("%d prdebugs in %d modules, %d KiB in ddebug tables, %d kiB in 
__dyndbg section\n",
+       vpr_info("%d prdebugs in %d modules, %d KiB in ddebug tables, %d kiB in 
__dyndbg_descs section\n",
                 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);
+       if (di.maps.len)
+               v2pr_info("  %d builtin ddebug class-maps\n", di.maps.len);
 
        /* now that ddebug tables are loaded, process all boot args
         * again to find and activate queries given in dyndbg params.

-- 
2.54.0


Reply via email to