Change ddebug_parse_flags to accept optional filterflags before the required operator [-+=]. Read the flags into the filter_flags parameter added in the previous patch. So this now supplies the filterflags to ddebug_exec_query. filterflags work like query terms, they constrain what callsites get matched before theyre modified. So like a query, they can be empty. Filterflags let you read callsite's flagstate, including results of previous modifications, and require that certain flags are set, before modifying the callsite further. So you can build up sets of callsites by marking them with a particular flagstate, for example 'fmlt', then enable that set in a batch. echo fmlt+p >control Naturally you can use almost any combo of flags you want for marking, and can mark several different sets with different patterns. And then you can activate them in a bunch: echo 'ft+p; mt+p; lt+p;' >control You just can't prohibit true flags. Signed-off-by: Jim Cromie <jim.cromie@xxxxxxxxx> --- .../admin-guide/dynamic-debug-howto.rst | 18 ++++++++---- lib/dynamic_debug.c | 29 ++++++++++--------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentation/admin-guide/dynamic-debug-howto.rst index e5a8def45f3f..e1ea0c307fcf 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -218,13 +218,19 @@ line line -1605 // the 1605 lines from line 1 to line 1605 line 1600- // all lines from line 1600 to the end of the file -The flags specification comprises a change operation followed -by one or more flag characters. The change operation is one -of the characters:: +Flags Specification:: - - remove the given flags - + add the given flags - = set the flags to the given flags + flagspec ::= filterflags? OP modflags + filterflags ::= flagset + modflags ::= flagset + flagset ::= ([pfmltu_] | [PFMLTU_])+ # also cant have pP etc + OP ::= [-+=] + +OP: modify callsites per following flagset:: + + - remove the following flags + + add the following flags + = set the flags to the following flags The flags are:: diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 0fcc688789f4..cf3379b40483 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -452,33 +452,36 @@ static int ddebug_read_flags(const char *str, struct flag_settings *modifiers) } /* - * Parse `str' as a flags specification, format [-+=][p]+. - * Sets up *maskp and *flagsp to be used when changing the - * flags fields of matched _ddebug's. Returns 0 on success - * or <0 on error. + * Parse `str' as a flags-spec, ie: [pfmlt_]*[-+=][pfmlt_]+ + * Fills flagsettings provided. Returns 0 on success or <0 on error. */ static int ddebug_parse_flags(const char *str, struct flag_settings *modifiers, struct flag_settings *filter) { int op; + char *opp = strpbrk(str, "-+="); - switch (*str) { - case '+': - case '-': - case '=': - op = *str++; - break; - default: - pr_err("bad flag-op %c, at start of %s\n", *str, str); + if (!opp) { + pr_err("no OP given in %s\n", str); return -EINVAL; } + op = *opp; vpr_info("op='%c'\n", op); + if (opp != str) { + /* filterflags precedes OP, grab it */ + *opp++ = '\0'; + if (ddebug_read_flags(str, filter)) + return -EINVAL; + str = opp; + } else + str++; + if (ddebug_read_flags(str, modifiers)) return -EINVAL; - /* calculate final flags, mask based upon op */ + /* calculate final mods: flags, mask based upon op */ switch (op) { case '=': /* modifiers->flags already set */ -- 2.26.2