[GIT PULL] ring-buffer: Updates for 6.14

Steven Rostedt posted 1 patch 2 weeks, 2 days ago
kernel/trace/ring_buffer.c | 63 +++++++++++++---------------------------------
1 file changed, 17 insertions(+), 46 deletions(-)
[GIT PULL] ring-buffer: Updates for 6.14
Posted by Steven Rostedt 2 weeks, 2 days ago

Linus,

ring-buffer changes for v6.14

- Clean up the __rb_map_vma() logic

  The logic of __rb_map_vma() has a error check with WARN_ON() that makes
  sure that the index does not go past the end of the array of buffers. The
  test in the loop pretty much guarantees that it will never happen, but
  since the relation of the variables used is a little complex, the
  WARN_ON() check was added. It was noticed that the array was dereferenced
  before this check and if the logic does break and for some reason the
  logic goes past the array, there will be an out of bounds access here.
  Move the access to after the WARN_ON().

- Consolidate how the ring buffer is determined to be empty

  Currently there's two ways that are used to determine if the ring buffer
  is empty. One relies on the status of the commit and reader pages and what
  was read, and the other is on what was written vs what was read. By using
  the number of entries (written) method, it can be used for reading events
  that are out of the kernel's control (what pKVM will use). Move to this
  method to make it easier to implement a pKVM ring buffer that the kernel
  can read.


Please pull the latest trace-ringbuffer-v6.14 tree, which can be found at:


  git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
trace-ringbuffer-v6.14

Tag SHA1: c3bcb9593577fe2153f16021fdf4509ef7b3d9fd
Head SHA1: 6e31b759b076eebb4184117234f0c4eb9e4bc460


Jeongjun Park (1):
      ring-buffer: Make reading page consistent with the code logic

Vincent Donnefort (1):
      ring-buffer: Check for empty ring-buffer with rb_num_of_entries()

----
 kernel/trace/ring_buffer.c | 63 +++++++++++++---------------------------------
 1 file changed, 17 insertions(+), 46 deletions(-)
---------------------------
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 60210fb5b211..6d61ff78926b 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -4682,40 +4682,22 @@ int ring_buffer_write(struct trace_buffer *buffer,
 }
 EXPORT_SYMBOL_GPL(ring_buffer_write);
 
-static bool rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer)
+/*
+ * The total entries in the ring buffer is the running counter
+ * of entries entered into the ring buffer, minus the sum of
+ * the entries read from the ring buffer and the number of
+ * entries that were overwritten.
+ */
+static inline unsigned long
+rb_num_of_entries(struct ring_buffer_per_cpu *cpu_buffer)
 {
-	struct buffer_page *reader = cpu_buffer->reader_page;
-	struct buffer_page *head = rb_set_head_page(cpu_buffer);
-	struct buffer_page *commit = cpu_buffer->commit_page;
-
-	/* In case of error, head will be NULL */
-	if (unlikely(!head))
-		return true;
-
-	/* Reader should exhaust content in reader page */
-	if (reader->read != rb_page_size(reader))
-		return false;
-
-	/*
-	 * If writers are committing on the reader page, knowing all
-	 * committed content has been read, the ring buffer is empty.
-	 */
-	if (commit == reader)
-		return true;
-
-	/*
-	 * If writers are committing on a page other than reader page
-	 * and head page, there should always be content to read.
-	 */
-	if (commit != head)
-		return false;
+	return local_read(&cpu_buffer->entries) -
+		(local_read(&cpu_buffer->overrun) + cpu_buffer->read);
+}
 
-	/*
-	 * Writers are committing on the head page, we just need
-	 * to care about there're committed data, and the reader will
-	 * swap reader page with head page when it is to read data.
-	 */
-	return rb_page_commit(commit) == 0;
+static bool rb_per_cpu_empty(struct ring_buffer_per_cpu *cpu_buffer)
+{
+	return !rb_num_of_entries(cpu_buffer);
 }
 
 /**
@@ -4861,19 +4843,6 @@ void ring_buffer_record_enable_cpu(struct trace_buffer *buffer, int cpu)
 }
 EXPORT_SYMBOL_GPL(ring_buffer_record_enable_cpu);
 
-/*
- * The total entries in the ring buffer is the running counter
- * of entries entered into the ring buffer, minus the sum of
- * the entries read from the ring buffer and the number of
- * entries that were overwritten.
- */
-static inline unsigned long
-rb_num_of_entries(struct ring_buffer_per_cpu *cpu_buffer)
-{
-	return local_read(&cpu_buffer->entries) -
-		(local_read(&cpu_buffer->overrun) + cpu_buffer->read);
-}
-
 /**
  * ring_buffer_oldest_event_ts - get the oldest event timestamp from the buffer
  * @buffer: The ring buffer
@@ -7059,7 +7028,7 @@ static int __rb_map_vma(struct ring_buffer_per_cpu *cpu_buffer,
 	}
 
 	while (p < nr_pages) {
-		struct page *page = virt_to_page((void *)cpu_buffer->subbuf_ids[s]);
+		struct page *page;
 		int off = 0;
 
 		if (WARN_ON_ONCE(s >= nr_subbufs)) {
@@ -7067,6 +7036,8 @@ static int __rb_map_vma(struct ring_buffer_per_cpu *cpu_buffer,
 			goto out;
 		}
 
+		page = virt_to_page((void *)cpu_buffer->subbuf_ids[s]);
+
 		for (; off < (1 << (subbuf_order)); off++, page++) {
 			if (p >= nr_pages)
 				break;
Re: [GIT PULL] ring-buffer: Updates for 6.14
Posted by pr-tracker-bot@kernel.org 2 weeks ago
The pull request you sent on Sun, 19 Jan 2025 19:33:06 -0500:

> git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git trace-ringbuffer-v6.14

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/0074adea39b64d717407b913fd405ac586ee45ca

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/prtracker.html