Commit f3ddb74a authored by Steven Rostedt (Google)'s avatar Steven Rostedt (Google)
Browse files

tracing: Wake up ring buffer waiters on closing of the file

When the file that represents the ring buffer is closed, there may be
waiters waiting on more input from the ring buffer. Call
ring_buffer_wake_waiters() to wake up any waiters when the file is
closed.

Link: https://lkml.kernel.org/r/20220927231825.182416969@goodmis.org



Cc: stable@vger.kernel.org
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Fixes: e30f53aa ("tracing: Do not busy wait in buffer splice")
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 7e9fbbb1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ struct trace_iterator {
	unsigned int		temp_size;
	char			*fmt;	/* modified format holder */
	unsigned int		fmt_size;
	long			wait_index;

	/* trace_seq for __print_flags() and __print_symbolic() etc. */
	struct trace_seq	tmp_seq;
+15 −0
Original line number Diff line number Diff line
@@ -8160,6 +8160,12 @@ static int tracing_buffers_release(struct inode *inode, struct file *file)

	__trace_array_put(iter->tr);

	iter->wait_index++;
	/* Make sure the waiters see the new wait_index */
	smp_wmb();

	ring_buffer_wake_waiters(iter->array_buffer->buffer, iter->cpu_file);

	if (info->spare)
		ring_buffer_free_read_page(iter->array_buffer->buffer,
					   info->spare_cpu, info->spare);
@@ -8313,6 +8319,8 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,

	/* did we read anything? */
	if (!spd.nr_pages) {
		long wait_index;

		if (ret)
			goto out;

@@ -8320,10 +8328,17 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
		if ((file->f_flags & O_NONBLOCK) || (flags & SPLICE_F_NONBLOCK))
			goto out;

		wait_index = READ_ONCE(iter->wait_index);

		ret = wait_on_pipe(iter, iter->tr->buffer_percent);
		if (ret)
			goto out;

		/* Make sure we see the new wait_index */
		smp_rmb();
		if (wait_index != iter->wait_index)
			goto out;

		goto again;
	}