dyndbg: reverse module.callsite walk in cat control
authorJim Cromie <jim.cromie@gmail.com>
Sun, 4 Sep 2022 21:40:42 +0000 (15:40 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 7 Sep 2022 14:58:23 +0000 (16:58 +0200)
Walk the module's vector of callsites backwards; ie N..0.  This
"corrects" the backwards appearance of a module's prdbg vector when
walked 0..N.  I think this is due to linker mechanics, which I'm
inclined to treat as immutable, and the order is fixable in display.

No functional changes.

Combined with previous commit, which reversed tables-list, we get:

  :#> head -n7 /proc/dynamic_debug/control
  # filename:lineno [module]function flags format
  init/main.c:1179 [main]initcall_blacklist =_ "blacklisting initcall %s\012"
  init/main.c:1218 [main]initcall_blacklisted =_ "initcall %s blacklisted\012"
  init/main.c:1424 [main]run_init_process =_ "  with arguments:\012"
  init/main.c:1426 [main]run_init_process =_ "    %s\012"
  init/main.c:1427 [main]run_init_process =_ "  with environment:\012"
  init/main.c:1429 [main]run_init_process =_ "    %s\012"

Acked-by: Jason Baron <jbaron@akamai.com>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Link: https://lore.kernel.org/r/20220904214134.408619-6-jim.cromie@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
lib/dynamic_debug.c

index 7fb99492c16f3a7cfc37787125718be7e9f93639..8ff11977b8bdd01622bb99b4bd76a3b9d3ccefce 100644 (file)
@@ -59,7 +59,7 @@ struct ddebug_query {
 
 struct ddebug_iter {
        struct ddebug_table *table;
-       unsigned int idx;
+       int idx;
 };
 
 struct flag_settings {
@@ -805,13 +805,12 @@ static struct _ddebug *ddebug_iter_first(struct ddebug_iter *iter)
 {
        if (list_empty(&ddebug_tables)) {
                iter->table = NULL;
-               iter->idx = 0;
                return NULL;
        }
        iter->table = list_entry(ddebug_tables.next,
                                 struct ddebug_table, link);
-       iter->idx = 0;
-       return &iter->table->ddebugs[iter->idx];
+       iter->idx = iter->table->num_ddebugs;
+       return &iter->table->ddebugs[--iter->idx];
 }
 
 /*
@@ -824,15 +823,16 @@ static struct _ddebug *ddebug_iter_next(struct ddebug_iter *iter)
 {
        if (iter->table == NULL)
                return NULL;
-       if (++iter->idx == iter->table->num_ddebugs) {
+       if (--iter->idx < 0) {
                /* iterate to next table */
-               iter->idx = 0;
                if (list_is_last(&iter->table->link, &ddebug_tables)) {
                        iter->table = NULL;
                        return NULL;
                }
                iter->table = list_entry(iter->table->link.next,
                                         struct ddebug_table, link);
+               iter->idx = iter->table->num_ddebugs;
+               --iter->idx;
        }
        return &iter->table->ddebugs[iter->idx];
 }