• Zheng Yejian's avatar
    tracing/hist: Fix issue of losting command info in error_log · 608c6ed3
    Zheng Yejian authored
    When input some constructed invalid 'trigger' command, command info
    in 'error_log' are lost [1].
    
    The root cause is that there is a path that event_hist_trigger_parse()
    is recursely called once and 'last_cmd' which save origin command is
    cleared, then later calling of hist_err() will no longer record origin
    command info:
    
      event_hist_trigger_parse() {
        last_cmd_set()  // <1> 'last_cmd' save origin command here at first
        create_actions() {
          onmatch_create() {
            action_create() {
              trace_action_create() {
                trace_action_create_field_var() {
                  create_field_var_hist() {
                    event_hist_trigger_parse() {  // <2> recursely called once
                      hist_err_clear()  // <3> 'last_cmd' is cleared here
                    }
                    hist_err()  // <4> No longer find origin command!!!
    
    Since 'glob' is empty string while running into the recurse call, we
    can trickly check it and bypass the call of hist_err_clear() to solve it.
    
    [1]
     # cd /sys/kernel/tracing
     # echo "my_synth_event int v1; int v2; int v3;" >> synthetic_events
     # echo 'hist:keys=pid' >> events/sched/sched_waking/trigger
     # echo "hist:keys=next_pid:onmatch(sched.sched_waking).my_synth_event(\
    pid,pid1)" >> events/sched/sched_switch/trigger
     # cat error_log
    [  8.405018] hist:sched:sched_switch: error: Couldn't find synthetic event
      Command:
    hist:keys=next_pid:onmatch(sched.sched_waking).my_synth_event(pid,pid1)
                                                              ^
    [  8.816902] hist:sched:sched_switch: error: Couldn't find field
      Command:
    hist:keys=next_pid:onmatch(sched.sched_waking).my_synth_event(pid,pid1)
                              ^
    [  8.816902] hist:sched:sched_switch: error: Couldn't parse field variable
      Command:
    hist:keys=next_pid:onmatch(sched.sched_waking).my_synth_event(pid,pid1)
                              ^
    [  8.999880] : error: Couldn't find field
      Command:
               ^
    [  8.999880] : error: Couldn't parse field variable
      Command:
               ^
    [  8.999880] : error: Couldn't find field
      Command:
               ^
    [  8.999880] : error: Couldn't create histogram for field
      Command:
               ^
    
    Link: https://lore.kernel.org/linux-trace-kernel/20221207135326.3483216-1-zhengyejian1@huawei.com
    
    Cc: <mhiramat@kernel.org>
    Cc: <zanussi@kernel.org>
    Fixes: f404da6e ("tracing: Add 'last error' error facility for hist triggers")
    Signed-off-by: default avatarZheng Yejian <zhengyejian1@huawei.com>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    608c6ed3
trace_events_hist.c 165 KB