[PATCH v4 18/39] dyndbg: add label keyword handling

From: Łukasz Bartosik
Date: Sat Feb 10 2024 - 18:54:53 EST


From: Jim Cromie <jim.cromie@xxxxxxxxx>

Add a new user_label field to struct ddebug_query, label keyword
handling and saving to the struct, and update ddebug_change to test if
a given user_label is found in the list of known trace-instances.

Signed-off-by: Jim Cromie <jim.cromie@xxxxxxxxx>
---
lib/dynamic_debug.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index dbae1ed6ab5b..17df4bf6863a 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -61,6 +61,7 @@ struct ddebug_query {
const char *function;
const char *format;
const char *class_string;
+ const char *user_label;
unsigned int first_lineno, last_lineno;
};

@@ -300,13 +301,14 @@ static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
fmtlen--;
}

- v3pr_info("%s: func=\"%s\" file=\"%s\" module=\"%s\" format=\"%.*s\" lineno=%u-%u class=%s\n",
+ v3pr_info("%s: func=\"%s\" file=\"%s\" module=\"%s\" format=\"%.*s\" lineno=%u-%u class=%s label=%s\n",
msg,
query->function ?: "",
query->filename ?: "",
query->module ?: "",
fmtlen, query->format ?: "",
- query->first_lineno, query->last_lineno, query->class_string);
+ query->first_lineno, query->last_lineno,
+ query->class_string, query->user_label);
}

static bool is_dd_trace_cmd(const char *str)
@@ -574,6 +576,16 @@ static int ddebug_change(const struct ddebug_query *query,
if (dp->class_id != valid_class)
continue;

+ /* match against a given label */
+ if (query->user_label) {
+ int idx = find_tr_instance(query->user_label);
+
+ if (idx < 0)
+ continue;
+ if (idx != get_trace_dst(dp))
+ continue;
+ }
+
/* match against the source filename */
if (query->filename &&
!match_wildcard(query->filename, dp->filename) &&
@@ -770,6 +782,8 @@ static int check_set(const char **dest, char *src, char *name)
* file <full-pathname>
* file <base-filename>
* module <module-name>
+ * class <class_name>
+ * label <user_label>
* format <escaped-string-to-find-in-format>
* line <lineno>
* line <first-lineno>-<last-lineno> // where either may be empty
@@ -825,6 +839,8 @@ static int ddebug_parse_query(char *words[], int nwords,
return -EINVAL;
} else if (!strcmp(keyword, "class")) {
rc = check_set(&query->class_string, arg, "class");
+ } else if (!strcmp(keyword, "label")) {
+ rc = check_set(&query->user_label, arg, "label");
} else {
pr_err("unknown keyword \"%s\"\n", keyword);
return -EINVAL;
--
2.43.0.687.g38aa6559b0-goog