[PATCH v3 21/21] dyndbg: allow negating flag-chars in modifier flags

Jim Cromie
2020-06-17T16:26:55Z

This allows a user to set some flags and clear others at the same
time. This will make it easier to use the flags for creation of
transient sets, by making it easier to change the markings on those
sets by one flag, or all flags.

Consider the 3 operators [+-=]
= resets entire flag-set, no memory of before
- clears flags only, but preserves otherwise
+ sets flags only, but preserves otherwise

It would be nice to be able to set or clear all bits, or any subset,
while preserving untouched bits. Using -/+ and negating flags
together let you do so.

echo -ft > control # in all callsites, clear 2 bits, preserve others
echo f-ft > control # if f-bit is true, clear 2 bits, preserve others

using non-empty query terms gives another dimension of selectivity

echo $qtrms -ft > control # for a callsite subset, clear 2 bits, preserve others
echo $qtrms f-ft > control # for a callsite subset, if f-bit is true, clear 2 bits, preserve others

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
Documentation/admin-guide/dynamic-debug-howto.rst | 10 ++++++----
lib/dynamic_debug.c | 6 ++++--
2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentation/admin-guide/dynamic-debug-howto.rst
index e910865b2edc..4539793e39bf 100644
--- a/Documentation/admin-guide/dynamic-debug-howto.rst
+++ b/Documentation/admin-guide/dynamic-debug-howto.rst
@@ -258,9 +258,11 @@ only callsites with ``u`` and ``f`` cleared.

Flagsets cannot contain ``pP`` etc, a flag cannot be true and false.

-modflags containing upper-case flags is reserved/undefined for now.
-inverted-flags are currently ignored, usage gets trickier if given
-``-pXy``, it should leave x set.
+modflags may contain upper-case flags also, using these lets you
+invert the flag setting implied by the OP; '-pU' means disable
+printing, and mark that callsite with the user-flag to create a group,
+for optional further manipulation. Generally, '+p' and '-p' is your
+main choice, and use of negating flags in modflags is rare.

Notes::

@@ -270,7 +272,7 @@ For ``print_hex_dump_debug()`` and ``print_hex_dump_bytes()``, only
For display, the flags are preceded by ``=``
(mnemonic: what the flags are currently equal to).

-Note the regexp ``^[-+=][flmptu_]+$`` matches a flags specification.
+Note the regexp ``/^[-+=][flmptu_]+$/i`` matches a flags specification.
To clear all flags at once, use ``=_`` or ``-flmptu``.

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index a302a7d8a722..c539bdd7fbe3 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -498,16 +498,18 @@ static int ddebug_parse_flags(const char *str,

/* calculate final mods: flags, mask based upon op */
switch (op) {
+ unsigned int tmp;
case '=':
/* modifiers->flags already set */
modifiers->mask = 0;
break;
case '+':
- modifiers->mask = ~0U;
+ modifiers->mask = ~modifiers->mask;
break;
case '-':
+ tmp = modifiers->mask;
modifiers->mask = ~modifiers->flags;
- modifiers->flags = 0;
+ modifiers->flags = tmp;
break;
}
vpr_info("mods:flags=0x%x,mask=0x%x filter:flags=0x%x,mask=0x%x\n",
--
2.26.2