tracing: Fix cpu buffers unavailable due to 'record_disabled' missed
[ Upstream commit b71645d6af10196c46cbe3732de2ea7d36b3ff6d ]
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: 71babb2705
("tracing: change CPU ring buffer state from tracing_cpumask")
Signed-off-by: Zheng Yejian <zhengyejian1@huawei.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
7e862cce34
commit
7d0c2b0de2
@ -5189,11 +5189,17 @@ int tracing_set_cpumask(struct trace_array *tr,
|
||||
!cpumask_test_cpu(cpu, tracing_cpumask_new)) {
|
||||
atomic_inc(&per_cpu_ptr(tr->array_buffer.data, cpu)->disabled);
|
||||
ring_buffer_record_disable_cpu(tr->array_buffer.buffer, cpu);
|
||||
#ifdef CONFIG_TRACER_MAX_TRACE
|
||||
ring_buffer_record_disable_cpu(tr->max_buffer.buffer, cpu);
|
||||
#endif
|
||||
}
|
||||
if (!cpumask_test_cpu(cpu, tr->tracing_cpumask) &&
|
||||
cpumask_test_cpu(cpu, tracing_cpumask_new)) {
|
||||
atomic_dec(&per_cpu_ptr(tr->array_buffer.data, cpu)->disabled);
|
||||
ring_buffer_record_enable_cpu(tr->array_buffer.buffer, cpu);
|
||||
#ifdef CONFIG_TRACER_MAX_TRACE
|
||||
ring_buffer_record_enable_cpu(tr->max_buffer.buffer, cpu);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
arch_spin_unlock(&tr->max_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user