ddebug_change() is a big (~100 lines) function with a nested for loop.

The outer loop walks the per-module ddebug_tables list, and does
module stuff: it filters on a query's "module FOO*" and "class BAR",
failures here skip the entire inner loop.

The inner loop (60 lines) scans a module's descriptors.  It starts
with a long block of filters on function, line, format, and the
validated "BAR" class (or the legacy/_DPRINTK_CLASS_DFLT).

These filters "continue" past pr_debugs that don't match the query
criteria, before it falls through the code below that counts matches,
then adjusts the flags and static-keys.  This is unnecessarily hard to
think about.

So move the per-descriptor filter-block into a boolean function:
ddebug_match_desc(desc), and change each "continue" to "return false".
This puts a clear interface in place, so any future changes are either
inside, outside, or across this interface.

also fix checkpatch complaints about spaces and braces.

Signed-off-by: Jim Cromie <[email protected]>
---
 lib/dynamic_debug.c | 83 +++++++++++++++++++++++++--------------------
 1 file changed, 47 insertions(+), 36 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 5a007952f7f2..eb5146bcfaca 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -171,6 +171,52 @@ static struct ddebug_class_map 
*ddebug_find_valid_class(struct ddebug_table cons
  * callsites, normally the same as number of changes.  If verbose,
  * logs the changes.  Takes ddebug_lock.
  */
+static bool ddebug_match_desc(const struct ddebug_query *query,
+                             struct _ddebug *dp,
+                             int valid_class)
+{
+       /* match site against query-class */
+       if (dp->class_id != valid_class)
+               return false;
+
+       /* match against the source filename */
+       if (query->filename &&
+           !match_wildcard(query->filename, dp->filename) &&
+           !match_wildcard(query->filename,
+                           kbasename(dp->filename)) &&
+           !match_wildcard(query->filename,
+                           trim_prefix(dp->filename)))
+               return false;
+
+       /* match against the function */
+       if (query->function &&
+           !match_wildcard(query->function, dp->function))
+               return false;
+
+       /* match against the format */
+       if (query->format) {
+               if (*query->format == '^') {
+                       char *p;
+                       /* anchored search. match must be at beginning */
+                       p = strstr(dp->format, query->format + 1);
+                       if (p != dp->format)
+                               return false;
+               } else if (!strstr(dp->format, query->format)) {
+                       return false;
+               }
+       }
+
+       /* match against the line number range */
+       if (query->first_lineno &&
+           dp->lineno < query->first_lineno)
+               return false;
+       if (query->last_lineno &&
+           dp->lineno > query->last_lineno)
+               return false;
+
+       return true;
+}
+
 static int ddebug_change(const struct ddebug_query *query,
                         struct flag_settings *modifiers)
 {
@@ -203,42 +249,7 @@ static int ddebug_change(const struct ddebug_query *query,
                for (i = 0; i < dt->num_ddebugs; i++) {
                        struct _ddebug *dp = &dt->ddebugs[i];
 
-                       /* match site against query-class */
-                       if (dp->class_id != valid_class)
-                               continue;
-
-                       /* match against the source filename */
-                       if (query->filename &&
-                           !match_wildcard(query->filename, dp->filename) &&
-                           !match_wildcard(query->filename,
-                                          kbasename(dp->filename)) &&
-                           !match_wildcard(query->filename,
-                                          trim_prefix(dp->filename)))
-                               continue;
-
-                       /* match against the function */
-                       if (query->function &&
-                           !match_wildcard(query->function, dp->function))
-                               continue;
-
-                       /* match against the format */
-                       if (query->format) {
-                               if (*query->format == '^') {
-                                       char *p;
-                                       /* anchored search. match must be at 
beginning */
-                                       p = strstr(dp->format, query->format+1);
-                                       if (p != dp->format)
-                                               continue;
-                               } else if (!strstr(dp->format, query->format))
-                                       continue;
-                       }
-
-                       /* match against the line number range */
-                       if (query->first_lineno &&
-                           dp->lineno < query->first_lineno)
-                               continue;
-                       if (query->last_lineno &&
-                           dp->lineno > query->last_lineno)
+                       if (!ddebug_match_desc(query, dp, valid_class))
                                continue;
 
                        nfound++;
-- 
2.51.1

Reply via email to