[PATCH v6 44/57] dyndbg: extend __ddebug_add_module proto to allow packing sites

From: Jim Cromie
Date: Sun Sep 04 2022 - 17:46:03 EST


In order to actually reclaim useful blocks of memory, we need to
repack the vector of redundant site recs, not just detect the
duplicates. To allow this, extend __ddebug_add_module()s prototype by
adding:

struct _ddebug_site *packed_sites - address of empty "stack"
unsigned int *packed_base - index of Top-of-Stack

This allows dynamic_debug_init() to tell __ddebug_add_module() where
to push the unique site recs it finds while de-duplicating, and to
communicate the new TOS back for the next iteration.

Since we know we are shrinking data, we can overwrite _ddebug_sites[],
for both builtins, and loadable modules, via ddebug_add_module().

For ddebug_add_module(), which is called from kernel/module/main, the
2 args: reuse the module.sites vector, with a 0 offset. This will
allow de-duplication of the local vector.

No de-duplication is done yet, so no use of the stack.

Signed-off-by: Jim Cromie <jim.cromie@xxxxxxxxx>
---
lib/dynamic_debug.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 506a7e2e59d6..1b57e43e9c31 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -1341,7 +1341,8 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt,
* and add it to the global list.
*/
static int __ddebug_add_module(struct _ddebug_info *di, unsigned int base,
- const char *modname)
+ const char *modname, struct _ddebug_site *packed_sites,
+ unsigned int *packed_base)
{
struct ddebug_table *dt;
int i;
@@ -1390,7 +1391,8 @@ static int __ddebug_add_module(struct _ddebug_info *di, unsigned int base,

int ddebug_add_module(struct _ddebug_info *di, const char *modname)
{
- return __ddebug_add_module(di, 0, modname);
+ unsigned int packed_base = 0;
+ return __ddebug_add_module(di, 0, modname, di->sites, &packed_base);
}

/* helper for ddebug_dyndbg_(boot|module)_param_cb */
@@ -1506,7 +1508,7 @@ static int __init dynamic_debug_init(void)
{
struct _ddebug *iter, *iter_mod_start;
struct _ddebug_site *site, *site_mod_start;
- int ret, i, mod_sites, mod_ct;
+ int ret, i, mod_sites, mod_ct, site_base;
const char *modname;
char *cmdline;

@@ -1550,7 +1552,8 @@ static int __init dynamic_debug_init(void)
di.num_descs = mod_sites;
di.descs = iter_mod_start;
di.sites = site_mod_start;
- ret = __ddebug_add_module(&di, i - mod_sites, modname);
+ ret = __ddebug_add_module(&di, i - mod_sites, modname,
+ __start___dyndbg_sites, &site_base);
if (ret)
goto out_err;

@@ -1563,11 +1566,13 @@ static int __init dynamic_debug_init(void)
di.num_descs = mod_sites;
di.descs = iter_mod_start;
di.sites = site_mod_start;
- ret = __ddebug_add_module(&di, i - mod_sites, modname);
+ ret = __ddebug_add_module(&di, i - mod_sites, modname,
+ __start___dyndbg_sites, &site_base);
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",
i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10),
(int)((i * sizeof(struct _ddebug)) >> 10));
--
2.37.2