kernel_samsung_a53x/kernel/trace
Steven Rostedt (Google) d8475538b7 ring-buffer: Fix full_waiters_pending in poll
[ Upstream commit 8145f1c35fa648da662078efab299c4467b85ad5 ]

If a reader of the ring buffer is doing a poll, and waiting for the ring
buffer to hit a specific watermark, there could be a case where it gets
into an infinite ping-pong loop.

The poll code has:

  rbwork->full_waiters_pending = true;
  if (!cpu_buffer->shortest_full ||
      cpu_buffer->shortest_full > full)
         cpu_buffer->shortest_full = full;

The writer will see full_waiters_pending and check if the ring buffer is
filled over the percentage of the shortest_full value. If it is, it calls
an irq_work to wake up all the waiters.

But the code could get into a circular loop:

	CPU 0					CPU 1
	-----					-----
 [ Poll ]
   [ shortest_full = 0 ]
   rbwork->full_waiters_pending = true;
					  if (rbwork->full_waiters_pending &&
					      [ buffer percent ] > shortest_full) {
					         rbwork->wakeup_full = true;
					         [ queue_irqwork ]

   cpu_buffer->shortest_full = full;

					  [ IRQ work ]
					  if (rbwork->wakeup_full) {
					        cpu_buffer->shortest_full = 0;
					        wakeup poll waiters;
  [woken]
   if ([ buffer percent ] > full)
      break;
   rbwork->full_waiters_pending = true;
					  if (rbwork->full_waiters_pending &&
					      [ buffer percent ] > shortest_full) {
					         rbwork->wakeup_full = true;
					         [ queue_irqwork ]

   cpu_buffer->shortest_full = full;

					  [ IRQ work ]
					  if (rbwork->wakeup_full) {
					        cpu_buffer->shortest_full = 0;
					        wakeup poll waiters;
  [woken]

 [ Wash, rinse, repeat! ]

In the poll, the shortest_full needs to be set before the
full_pending_waiters, as once that is set, the writer will compare the
current shortest_full (which is incorrect) to decide to call the irq_work,
which will reset the shortest_full (expecting the readers to update it).

Also move the setting of full_waiters_pending after the check if the ring
buffer has the required percentage filled. There's no reason to tell the
writer to wake up waiters if there are no waiters.

Link: https://lore.kernel.org/linux-trace-kernel/20240312131952.630922155@goodmis.org

Cc: stable@vger.kernel.org
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Fixes: 42fb0a1e84ff5 ("tracing/ring-buffer: Have polling block on watermark")
Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-19 09:22:35 +01:00
..
blktrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bpf_trace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bpf_trace.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
error_report-traces.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fgraph.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ftrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ftrace_internal.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipc_logging.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipc_logging_debug.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipc_logging_private.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kprobe_event_gen_test.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
power-traces.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
preemptirq_delay_test.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ring_buffer.c ring-buffer: Fix full_waiters_pending in poll 2024-11-19 09:22:35 +01:00
ring_buffer_benchmark.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rpm-traces.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
synth_event_gen_test.c tracing / synthetic: Disable events after testing in synth_event_gen_test_init() 2024-11-18 12:12:01 +01:00
trace.c tracing: Inform kmemleak of saved_cmdlines allocation 2024-11-18 12:13:33 +01:00
trace.h Revert "tracing: Have trace_event_file have ref counters" 2024-11-18 11:57:24 +01:00
trace_benchmark.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_benchmark.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_boot.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_branch.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_clock.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_dynevent.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_dynevent.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_entries.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_event_perf.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_events.c Revert "tracing: Have trace_event_file have ref counters" 2024-11-18 11:57:24 +01:00
trace_events_filter.c Revert "tracing: Have trace_event_file have ref counters" 2024-11-18 11:57:24 +01:00
trace_events_filter_test.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_events_hist.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_events_inject.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_events_synth.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_events_trigger.c tracing/trigger: Fix to return error if failed to alloc snapshot 2024-11-18 12:13:28 +01:00
trace_export.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_functions.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_functions_graph.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_hwlat.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_irqsoff.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_kdb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_kprobe.c tracing/kprobes: Fix the order of argument descriptions 2024-11-18 11:43:11 +01:00
trace_kprobe_selftest.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_kprobe_selftest.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_mmiotrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_nop.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_output.c tracing: Add size check when printing trace_marker output 2024-11-18 12:12:16 +01:00
trace_output.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_preemptirq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_printk.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_probe.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_probe.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_probe_tmpl.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_readwrite.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_sched_switch.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_sched_wakeup.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_selftest.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_selftest_dynamic.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_seq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_stack.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_stat.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_stat.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_synth.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_syscalls.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_uprobe.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tracing_map.c tracing: Ensure visibility when inserting an element into tracing_map 2024-11-18 12:13:00 +01:00
tracing_map.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00