[RFC PATCH v6 33/34] dyndbg: pack pr-debug site-recs in builtin modules

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

This extends HEAD~1 by packing not just into the each module's
sub-vector (slice of builtin dyndbg_sites[] vector), but into
the whole vector.

__ddebug_add_module() gets 2 new parameters to enable this; it
re-writes the packed_sites[] vector with each unique site record, and
tracks index of the last record written in packed_base.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
lib/dynamic_debug.c | 36 ++++++++++++++++++++++++------------
1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 43f4c82d24c3..66b48f1cb2d0 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -1069,13 +1069,16 @@ static const struct proc_ops proc_fops = {
*/
static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
unsigned int numdbgs, unsigned int base,
- const char *modname)
+ const char *modname,
+ struct _ddebug_site *packed_sites,
+ unsigned int *packed_base)
{
struct ddebug_table *dt;
union _ddebug_header *dh = (union _ddebug_header *) &tab[0];
int i, j;

- v3pr_info("add-module: %s.%d sites\n", modname, numdbgs);
+ v3pr_info("add-module: %s.%d sites, to %d->%d\n", modname, numdbgs,
+ base, *packed_base);

if (numdbgs && is_dyndbg_header_pair(dh, sites)) {

@@ -1116,12 +1119,13 @@ static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
for (i = j = 0; i < numdbgs; i++) {
tab[i]._back = base + i; /* index back to header */

- /* find 1st row with new fn, copy it to stack on j */
- if (sites[i].function != sites[j].function)
- memcpy((void *) &sites[++j], (void *) &sites[i],
- sizeof(struct _ddebug_site));
-
- tab[i]._map = base + j;
+ /* find 1st row with new fn, copy it to stack on packed_base */
+ if (sites[i].function != packed_sites[*packed_base].function) {
+ j++;
+ memcpy((void *) &packed_sites[++(*packed_base)],
+ (void *) &sites[i], sizeof(struct _ddebug_site));
+ }
+ tab[i]._map = *packed_base;

v3pr_info(" %d %d %d %d %s.%s.%d\n", i, j, tab[i]._back, tab[i]._map,
modname, sites[i].function, tab[i].lineno);
@@ -1140,7 +1144,10 @@ static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
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);
+ unsigned int packed_base = 0; /* skip the header */
+
+ return __ddebug_add_module(tab, sites, numdbgs, 0, modname,
+ sites, &packed_base);
}

/* helper for ddebug_dyndbg_(boot|module)_param_cb */
@@ -1253,10 +1260,12 @@ static int __init dynamic_debug_init(void)
{
struct _ddebug *iter, *iter_mod_start;
struct _ddebug_site *site, *site_mod_start;
+
const char *modname = NULL;
char *cmdline;
int ret = 0;
int i, site_ct = 0, modct = 0, mod_index = 0;
+ unsigned int site_base;

if (&__start___dyndbg == &__stop___dyndbg) {
if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
@@ -1272,7 +1281,7 @@ static int __init dynamic_debug_init(void)
site = site_mod_start = __start___dyndbg_sites;
modname = site->modname;

- for (i = 0; iter < __stop___dyndbg; iter++, site++, i++) {
+ for (site_base = i = 0; iter < __stop___dyndbg; iter++, site++, i++) {

SITE_CHK_(BUG_ON(site != iter->site));

@@ -1280,7 +1289,8 @@ static int __init dynamic_debug_init(void)
modct++;

ret = __ddebug_add_module(iter_mod_start, site_mod_start,
- site_ct, mod_index, modname);
+ site_ct, mod_index, modname,
+ __start___dyndbg_sites, &site_base);
if (ret)
goto out_err;

@@ -1292,7 +1302,9 @@ static int __init dynamic_debug_init(void)
}
site_ct++;
}
- ret = __ddebug_add_module(iter_mod_start, site_mod_start, site_ct, mod_index, modname);
+ ret = __ddebug_add_module(iter_mod_start, site_mod_start,
+ site_ct, mod_index, modname,
+ __start___dyndbg_sites, &site_base);
if (ret)
goto out_err;

--
2.31.1