tracing/probe: Add immediate parameter support
authorMasami Hiramatsu <mhiramat@kernel.org>
Wed, 19 Jun 2019 15:08:27 +0000 (00:08 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Sat, 31 Aug 2019 16:19:39 +0000 (12:19 -0400)
Add immediate value parameter (\1234) support to
probe events. This allows you to specify an immediate
(or dummy) parameter instead of fetching from memory
or register.

This feature looks odd, but imagine when you put a probe
on a code to trace some data. If the code is compiled into
2 instructions and 1 instruction has a value but other has
nothing since it is optimized out.
In that case, you can not fold those into one event, even
if ftrace supported multiple probes on one event.
With this feature, you can set a dummy value like
foo=\deadbeef instead of something like foo=%di.

Link: http://lkml.kernel.org/r/156095690733.28024.13258186548822649469.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Documentation/trace/kprobetrace.rst
Documentation/trace/uprobetracer.rst
kernel/trace/trace.c
kernel/trace/trace_probe.c
kernel/trace/trace_probe.h

index fbb314bfa11270af97e877930af14c0262958815..55993055902c6213917fa0888ead247183959f09 100644 (file)
@@ -52,6 +52,7 @@ Synopsis of kprobe_events
   $retval      : Fetch return value.(\*2)
   $comm                : Fetch current task comm.
   +|-[u]OFFS(FETCHARG) : Fetch memory at FETCHARG +|- OFFS address.(\*3)(\*4)
+  \IMM         : Store an immediate value to the argument.
   NAME=FETCHARG : Set NAME as the argument name of FETCHARG.
   FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types
                  (u8/u16/u32/u64/s8/s16/s32/s64), hexadecimal types
index 6e75a6c5a2c86f29f44d10496abd3b9d344642c6..98cde99939d73f651bf6e7ae1b9f0a4722e083b0 100644 (file)
@@ -45,6 +45,7 @@ Synopsis of uprobe_tracer
    $retval     : Fetch return value.(\*1)
    $comm       : Fetch current task comm.
    +|-[u]OFFS(FETCHARG) : Fetch memory at FETCHARG +|- OFFS address.(\*2)(\*3)
+   \IMM                : Store an immediate value to the argument.
    NAME=FETCHARG     : Set NAME as the argument name of FETCHARG.
    FETCHARG:TYPE     : Set TYPE as the type of FETCHARG. Currently, basic types
                       (u8/u16/u32/u64/s8/s16/s32/s64), hexadecimal types
index c7797a81a37e1f655fa0a4e79f92913d8b8adde4..fb4003c10151fba23332f163a383a60b06261535 100644 (file)
@@ -4848,7 +4848,7 @@ static const char readme_msg[] =
 #else
        "\t           $stack<index>, $stack, $retval, $comm,\n"
 #endif
-       "\t           +|-[u]<offset>(<fetcharg>)\n"
+       "\t           +|-[u]<offset>(<fetcharg>), \\imm-value\n"
        "\t     type: s8/16/32/64, u8/16/32/64, x8/16/32/64, string, symbol,\n"
        "\t           b<bit-width>@<bit-offset>/<container-size>, ustring,\n"
        "\t           <type>\\[<array-size>\\]\n"
index f8c3c65c035dbfd91616f6882c2b803da43dfa92..fb90baec3cd83509b9c09a38903b4f7cab1778a0 100644 (file)
@@ -316,6 +316,17 @@ inval_var:
        return -EINVAL;
 }
 
+static int str_to_immediate(char *str, unsigned long *imm)
+{
+       if (isdigit(str[0]))
+               return kstrtoul(str, 0, imm);
+       else if (str[0] == '-')
+               return kstrtol(str, 0, (long *)imm);
+       else if (str[0] == '+')
+               return kstrtol(str + 1, 0, (long *)imm);
+       return -EINVAL;
+}
+
 /* Recursive argument parser */
 static int
 parse_probe_arg(char *arg, const struct fetch_type *type,
@@ -444,6 +455,13 @@ parse_probe_arg(char *arg, const struct fetch_type *type,
                        code->offset = offset;
                }
                break;
+       case '\\':      /* Immediate value */
+               ret = str_to_immediate(arg + 1, &code->immediate);
+               if (ret)
+                       trace_probe_log_err(offs + 1, BAD_IMM);
+               else
+                       code->op = FETCH_OP_IMM;
+               break;
        }
        if (!ret && code->op == FETCH_OP_NOP) {
                /* Parsed, but do not find fetch method */
index 2dcc4e3177875cd93d29bcd9a8ff48292249ddd0..cc113b82a4ce030ab5de1fbc7f62101d4cff7671 100644 (file)
@@ -408,6 +408,7 @@ extern int traceprobe_define_arg_fields(struct trace_event_call *event_call,
        C(BAD_VAR,              "Invalid $-valiable specified"),        \
        C(BAD_REG_NAME,         "Invalid register name"),               \
        C(BAD_MEM_ADDR,         "Invalid memory address"),              \
+       C(BAD_IMM,              "Invalid immediate value"),             \
        C(FILE_ON_KPROBE,       "File offset is not available with kprobe"), \
        C(BAD_FILE_OFFS,        "Invalid file offset value"),           \
        C(SYM_ON_UPROBE,        "Symbol is not available with uprobe"), \