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.cro...@gmail.com>
---
 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

Reply via email to