• Zheng Yejian's avatar
    tracing: Fix cpu buffers unavailable due to 'record_disabled' missed · b71645d6
    Zheng Yejian authored
    Trace ring buffer can no longer record anything after executing
    following commands at the shell prompt:
    
      # cd /sys/kernel/tracing
      # cat tracing_cpumask
      fff
      # echo 0 > tracing_cpumask
      # echo 1 > snapshot
      # echo fff > tracing_cpumask
      # echo 1 > tracing_on
      # echo "hello world" > trace_marker
      -bash: echo: write error: Bad file descriptor
    
    The root cause is that:
      1. After `echo 0 > tracing_cpumask`, 'record_disabled' of cpu buffers
         in 'tr->array_buffer.buffer' became 1 (see tracing_set_cpumask());
      2. After `echo 1 > snapshot`, 'tr->array_buffer.buffer' is swapped
         with 'tr->max_buffer.buffer', then the 'record_disabled' became 0
         (see update_max_tr());
      3. After `echo fff > tracing_cpumask`, the 'record_disabled' become -1;
    Then array_buffer and max_buffer are both unavailable due to value of
    'record_disabled' is not 0.
    
    To fix it, enable or disable both array_buffer and max_buffer at the same
    time in tracing_set_cpumask().
    
    Link: https://lkml.kernel.org/r/20230805033816.3284594-2-zhengyejian1@huawei.com
    
    Cc: <mhiramat@kernel.org>
    Cc: <vnagarnaik@google.com>
    Cc: <shuah@kernel.org>
    Fixes: 71babb27 ("tracing: change CPU ring buffer state from tracing_cpumask")
    Signed-off-by: default avatarZheng Yejian <zhengyejian1@huawei.com>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    b71645d6
trace.c 257 KB