The body of ddebug_attach_module_classes() is just a code-block that
finds the contiguous subrange of classmaps matching on modname, and
saves it into the ddebug_table's info record.

Implement this block in a macro to accommodate different component
vectors in the "box" (as named in the for_subvec macro).  We will
reuse this macro shortly.

And hoist its invocation out of ddebug_attach_module_classes() up into
ddebug_add_module().  This moves the filtering step up closer to
dynamic_debug_init(), which already segments the builtin pr_debug
descriptors on their mod_name boundaries.

Signed-off-by: Jim Cromie <[email protected]>
Reviewed-by: Louis Chauvet <[email protected]>
---
v2:

move RvB after SoB

finish hoist - drop old fn - ddebug_attach_module_classes

the v1 rev left the old ddebug_attach_module_classes in place, but it
is completely redundant now, since it already lost the list-linking
job it was doing.

It was being cut out later in the patchset (in the unsent API
adaptation phase), but for cleaner review, lets excise it now.

OLD all-in-1-series (pre split into reviewable chunks)

v10?- reordered params to match kdoc

v12- refactor/rename: s/dd_mark_vector_subrange/dd_set_module_subrange/

1. Renamed the macro from dd_mark_vector_subrange to
   dd_set_module_subrange to better reflect its purpose of narrowing a
   vector to a module-specific subrange.

2. Simplified the arguments by removing the redundant _dst, as the _di
   pointer already provides access to the target _ddebug_info struct.

3. Refactored for Clarity: Instead of overwriting the struct's start
   pointer while the for_subvec loop is using it to iterate, I
   introduced a temporary __start variable. This avoids the "subtle"
   side effect and makes the logic easier to follow.

4. Updated Documentation: Improved the comment block to explicitly
   state that the macro scans for the first match and counts
   contiguous elements.
---
 lib/dynamic_debug.c | 65 +++++++++++++++++++++++++++--------------------------
 1 file changed, 33 insertions(+), 32 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 4a9b9bc9efc5..b877f4c6d778 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -162,8 +162,8 @@ static void vpr_info_dq(const struct ddebug_query *query, 
const char *msg)
 }
 
 static struct _ddebug_class_map *ddebug_find_valid_class(struct ddebug_table 
const *dt,
-                                                       const char 
*class_string,
-                                                       int *class_id)
+                                                        const char 
*class_string,
+                                                        int *class_id)
 {
        struct _ddebug_class_map *map;
        int i, idx;
@@ -1166,34 +1166,34 @@ static const struct proc_ops proc_fops = {
        .proc_write = ddebug_proc_write
 };
 
-static void ddebug_attach_module_classes(struct ddebug_table *dt, struct 
_ddebug_info *di)
-{
-       struct _ddebug_class_map *cm;
-       int i, nc = 0;
-
-       /*
-        * Find this module's classmaps in a subrange/wholerange of
-        * the builtin/modular classmap vector/section.  Save the start
-        * and length of the subrange at its edges.
-        */
-       for_subvec(i, cm, di, maps) {
-               if (!strcmp(cm->mod_name, dt->info.mod_name)) {
-                       if (!nc) {
-                               v2pr_info("start subrange, class[%d]: module:%s 
base:%d len:%d ty:%d\n",
-                                         i, cm->mod_name, cm->base, 
cm->length, cm->map_type);
-                               dt->info.maps.start = cm;
-                       }
-                       nc++;
-               } else if (nc) {
-                       /* end of matching classmaps */
-                       break;
-               }
-       }
-       if (nc) {
-               dt->info.maps.len = nc;
-               vpr_info("module:%s attached %d classes\n", dt->info.mod_name, 
nc);
-       }
-}
+/*
+ * Narrow a _ddebug_info's vector (@_vec) to the contiguous subrange
+ * of elements where ->mod_name matches @__di->mod_name.
+ *
+ * This scans the @_di->_vec for the first element matching the module
+ * name, and counts contiguous matches to define the subrange.
+ *
+ * @_i:   caller-provided index var
+ * @_sp:  cursor into @_vec
+ * @_di:  pointer to the struct _ddebug_info to be narrowed
+ * @_vec: name of the vector member (must have .start and .len)
+ */
+#define dd_set_module_subrange(_i, _sp, _di, _vec) ({                  \
+       struct _ddebug_info *__di = (_di);                              \
+       typeof(__di->_vec.start) __start = NULL;                        \
+       int __nc = 0;                                                   \
+       for_subvec(_i, _sp, __di, _vec) {                               \
+               if (!strcmp((_sp)->mod_name, __di->mod_name)) {         \
+                       if (!__nc++)                                    \
+                               __start = (_sp);                        \
+               } else if (__nc) {                                      \
+                       break; /* end of consecutive matches */         \
+               }                                                       \
+       }                                                               \
+       if (__nc)                                                       \
+               __di->_vec.start = __start;                             \
+       __di->_vec.len = __nc;                                          \
+})
 
 /*
  * Allocate a new ddebug_table for the given module
@@ -1202,6 +1202,8 @@ static void ddebug_attach_module_classes(struct 
ddebug_table *dt, struct _ddebug
 static int ddebug_add_module(struct _ddebug_info *di)
 {
        struct ddebug_table *dt;
+       struct _ddebug_class_map *cm;
+       int i;
 
        if (!di->descs.len)
                return 0;
@@ -1223,8 +1225,7 @@ static int ddebug_add_module(struct _ddebug_info *di)
 
        INIT_LIST_HEAD(&dt->link);
 
-       if (di->maps.len)
-               ddebug_attach_module_classes(dt, di);
+       dd_set_module_subrange(i, cm, &dt->info, maps);
 
        mutex_lock(&ddebug_lock);
        list_add_tail(&dt->link, &ddebug_tables);

-- 
2.54.0


Reply via email to