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@xxxxxxxxx> --- 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