[RFC PATCH v6 17/34] dyndbg: add _index to struct _ddebug

Jim Cromie
2021-05-29T20:03:00Z

we have: dp->site doing mapping: &__dyndbgs[N] -> &__dyndbg_sites[N].

We want to drop site, and do an indirect "up-over-down" maneuver (or
"back-over-and-map") to access sites[N]; this new _ddebug._index field
is that "N" above. This is a debug/unlikely path, so access cost is
unimportant compared to memory savings.

Once we can go from any N to 0, we have &array, and can use it in
container_of(), along with array-member name, to get the containing
struct (which doesnt exist yet).

The ._index is free, from unused padding in struct _ddebug (at least
on 64 bit machines). This commit just adds the ._index member, and
initializes it. That job falls to ddebug_add_module(). 2 cases:

loadable modules: ddebug_add_module( &whole-elf-section )
builtin modules: ddebug_add_module( &slice-of-DATA ), iteratively.

Previously, it didnt care which slice of "__dyndbgs" it was working,
but now we need to know the origin of the allocated memory, to
initialize our way back to it. Simplest way is to pass in the base
index of the current slice.

Since ddebug_add_module() is used indirectly by module.c, the new arg
is hidden in __ddebug_add_module(), and defaults to 0 in the wrapper.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
include/linux/dynamic_debug.h | 2 ++
lib/dynamic_debug.c | 25 ++++++++++++++++++++-----
2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index f789608ab935..c866b4a9760a 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -29,6 +29,7 @@ struct _ddebug {
/* format is always needed, lineno shares word with flags */
const char *format;
const unsigned lineno:18;
+ unsigned _index:14;
/*
* The flags field controls the behaviour at the callsite.
* The bits here are changed dynamically when the user
@@ -52,6 +53,7 @@ struct _ddebug {
#define _DPRINTK_FLAGS_DEFAULT 0
#endif
unsigned int flags:8;
+
#ifdef CONFIG_JUMP_LABEL
union {
struct static_key_true dd_key_true;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index db7563a88d8a..ce134c939f01 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -1028,10 +1028,12 @@ static const struct proc_ops proc_fops = {
* Allocate a new ddebug_table for the given module
* and add it to the global list.
*/
-int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
- unsigned int numdbgs, const char *modname)
+static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
+ unsigned int numdbgs, unsigned int base,
+ const char *modname)
{
struct ddebug_table *dt;
+ int i;

v3pr_info("add-module: %s.%d sites\n", modname, numdbgs);
if (!numdbgs) {
@@ -1055,6 +1057,12 @@ int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
dt->ddebugs = tab;
dt->sites = sites;

+ for (i = 0; i < numdbgs; i++) {
+ tab[i]._index = base + i;
+ v3pr_info(" %d %d %s.%s.%d\n", i, tab[i]._index,
+ modname, sites[i].function, tab[i].lineno);
+ }
+
mutex_lock(&ddebug_lock);
list_add(&dt->link, &ddebug_tables);
mutex_unlock(&ddebug_lock);
@@ -1063,6 +1071,12 @@ int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
return 0;
}

+int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
+ unsigned int numdbgs, const char *modname)
+{
+ return __ddebug_add_module(tab, sites, numdbgs, 0, modname);
+}
+
/* helper for ddebug_dyndbg_(boot|module)_param_cb */
static int ddebug_dyndbg_param_cb(char *param, char *val,
const char *modname, int on_err)
@@ -1177,6 +1191,7 @@ static int __init dynamic_debug_init(void)
char *cmdline;
int ret = 0;
int site_ct = 0, entries = 0, modct = 0;
+ int mod_index = 0;

if (&__start___dyndbg == &__stop___dyndbg) {
if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
@@ -1200,8 +1215,8 @@ static int __init dynamic_debug_init(void)
if (strcmp(modname, site->modname)) {
modct++;

- ret = ddebug_add_module(iter_mod_start, site_mod_start,
- site_ct, modname);
+ ret = __ddebug_add_module(iter_mod_start, site_mod_start,
+ site_ct, mod_index, modname);
if (ret)
goto out_err;
site_ct = 0;
@@ -1211,7 +1226,7 @@ static int __init dynamic_debug_init(void)
}
site_ct++;
}
- ret = ddebug_add_module(iter_mod_start, site_mod_start, site_ct, modname);
+ ret = __ddebug_add_module(iter_mod_start, site_mod_start, site_ct, mod_index, modname);
if (ret)
goto out_err;

--
2.31.1