From: Sasha Levin Date: Mon, 15 Apr 2024 08:53:55 +0000 (-0400) Subject: Drop ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch from... X-Git-Tag: v5.15.156~58 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4a1232647d88be80bc3197b6820a86c145ee04be;p=thirdparty%2Fkernel%2Fstable-queue.git Drop ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch from older trees --- diff --git a/queue-5.10/ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch b/queue-5.10/ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch deleted file mode 100644 index a30256295d8..00000000000 --- a/queue-5.10/ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch +++ /dev/null @@ -1,83 +0,0 @@ -From ffe3986fece696cf65e0ef99e74c75f848be8e30 Mon Sep 17 00:00:00 2001 -From: "Steven Rostedt (Google)" -Date: Tue, 9 Apr 2024 15:13:09 -0400 -Subject: ring-buffer: Only update pages_touched when a new page is touched - -From: Steven Rostedt (Google) - -commit ffe3986fece696cf65e0ef99e74c75f848be8e30 upstream. - -The "buffer_percent" logic that is used by the ring buffer splice code to -only wake up the tasks when there's no data after the buffer is filled to -the percentage of the "buffer_percent" file is dependent on three -variables that determine the amount of data that is in the ring buffer: - - 1) pages_read - incremented whenever a new sub-buffer is consumed - 2) pages_lost - incremented every time a writer overwrites a sub-buffer - 3) pages_touched - incremented when a write goes to a new sub-buffer - -The percentage is the calculation of: - - (pages_touched - (pages_lost + pages_read)) / nr_pages - -Basically, the amount of data is the total number of sub-bufs that have been -touched, minus the number of sub-bufs lost and sub-bufs consumed. This is -divided by the total count to give the buffer percentage. When the -percentage is greater than the value in the "buffer_percent" file, it -wakes up splice readers waiting for that amount. - -It was observed that over time, the amount read from the splice was -constantly decreasing the longer the trace was running. That is, if one -asked for 60%, it would read over 60% when it first starts tracing, but -then it would be woken up at under 60% and would slowly decrease the -amount of data read after being woken up, where the amount becomes much -less than the buffer percent. - -This was due to an accounting of the pages_touched incrementation. This -value is incremented whenever a writer transfers to a new sub-buffer. But -the place where it was incremented was incorrect. If a writer overflowed -the current sub-buffer it would go to the next one. If it gets preempted -by an interrupt at that time, and the interrupt performs a trace, it too -will end up going to the next sub-buffer. But only one should increment -the counter. Unfortunately, that was not the case. - -Change the cmpxchg() that does the real switch of the tail-page into a -try_cmpxchg(), and on success, perform the increment of pages_touched. This -will only increment the counter once for when the writer moves to a new -sub-buffer, and not when there's a race and is incremented for when a -writer and its preempting writer both move to the same new sub-buffer. - -Link: https://lore.kernel.org/linux-trace-kernel/20240409151309.0d0e5056@gandalf.local.home - -Cc: stable@vger.kernel.org -Cc: Mathieu Desnoyers -Fixes: 2c2b0a78b3739 ("ring-buffer: Add percentage of ring buffer full to wake up reader") -Acked-by: Masami Hiramatsu (Google) -Signed-off-by: Steven Rostedt (Google) -Signed-off-by: Greg Kroah-Hartman ---- - kernel/trace/ring_buffer.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/kernel/trace/ring_buffer.c -+++ b/kernel/trace/ring_buffer.c -@@ -1439,7 +1439,6 @@ static void rb_tail_page_update(struct r - old_write = local_add_return(RB_WRITE_INTCNT, &next_page->write); - old_entries = local_add_return(RB_WRITE_INTCNT, &next_page->entries); - -- local_inc(&cpu_buffer->pages_touched); - /* - * Just make sure we have seen our old_write and synchronize - * with any interrupts that come in. -@@ -1476,8 +1475,9 @@ static void rb_tail_page_update(struct r - */ - local_set(&next_page->page->commit, 0); - -- /* Again, either we update tail_page or an interrupt does */ -- (void)cmpxchg(&cpu_buffer->tail_page, tail_page, next_page); -+ /* Either we update tail_page or an interrupt does */ -+ if (try_cmpxchg(&cpu_buffer->tail_page, &tail_page, next_page)) -+ local_inc(&cpu_buffer->pages_touched); - } - } - diff --git a/queue-5.10/series b/queue-5.10/series index 5ebe62a63d7..e781fabc2ab 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -1,4 +1,3 @@ batman-adv-avoid-infinite-loop-trying-to-resize-local-tt.patch -ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch bluetooth-fix-memory-leak-in-hci_req_sync_complete.patch media-cec-core-remove-length-check-of-timer-status.patch diff --git a/queue-5.4/ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch b/queue-5.4/ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch deleted file mode 100644 index 73eefd6dd59..00000000000 --- a/queue-5.4/ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch +++ /dev/null @@ -1,83 +0,0 @@ -From ffe3986fece696cf65e0ef99e74c75f848be8e30 Mon Sep 17 00:00:00 2001 -From: "Steven Rostedt (Google)" -Date: Tue, 9 Apr 2024 15:13:09 -0400 -Subject: ring-buffer: Only update pages_touched when a new page is touched - -From: Steven Rostedt (Google) - -commit ffe3986fece696cf65e0ef99e74c75f848be8e30 upstream. - -The "buffer_percent" logic that is used by the ring buffer splice code to -only wake up the tasks when there's no data after the buffer is filled to -the percentage of the "buffer_percent" file is dependent on three -variables that determine the amount of data that is in the ring buffer: - - 1) pages_read - incremented whenever a new sub-buffer is consumed - 2) pages_lost - incremented every time a writer overwrites a sub-buffer - 3) pages_touched - incremented when a write goes to a new sub-buffer - -The percentage is the calculation of: - - (pages_touched - (pages_lost + pages_read)) / nr_pages - -Basically, the amount of data is the total number of sub-bufs that have been -touched, minus the number of sub-bufs lost and sub-bufs consumed. This is -divided by the total count to give the buffer percentage. When the -percentage is greater than the value in the "buffer_percent" file, it -wakes up splice readers waiting for that amount. - -It was observed that over time, the amount read from the splice was -constantly decreasing the longer the trace was running. That is, if one -asked for 60%, it would read over 60% when it first starts tracing, but -then it would be woken up at under 60% and would slowly decrease the -amount of data read after being woken up, where the amount becomes much -less than the buffer percent. - -This was due to an accounting of the pages_touched incrementation. This -value is incremented whenever a writer transfers to a new sub-buffer. But -the place where it was incremented was incorrect. If a writer overflowed -the current sub-buffer it would go to the next one. If it gets preempted -by an interrupt at that time, and the interrupt performs a trace, it too -will end up going to the next sub-buffer. But only one should increment -the counter. Unfortunately, that was not the case. - -Change the cmpxchg() that does the real switch of the tail-page into a -try_cmpxchg(), and on success, perform the increment of pages_touched. This -will only increment the counter once for when the writer moves to a new -sub-buffer, and not when there's a race and is incremented for when a -writer and its preempting writer both move to the same new sub-buffer. - -Link: https://lore.kernel.org/linux-trace-kernel/20240409151309.0d0e5056@gandalf.local.home - -Cc: stable@vger.kernel.org -Cc: Mathieu Desnoyers -Fixes: 2c2b0a78b3739 ("ring-buffer: Add percentage of ring buffer full to wake up reader") -Acked-by: Masami Hiramatsu (Google) -Signed-off-by: Steven Rostedt (Google) -Signed-off-by: Greg Kroah-Hartman ---- - kernel/trace/ring_buffer.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/kernel/trace/ring_buffer.c -+++ b/kernel/trace/ring_buffer.c -@@ -1163,7 +1163,6 @@ static void rb_tail_page_update(struct r - old_write = local_add_return(RB_WRITE_INTCNT, &next_page->write); - old_entries = local_add_return(RB_WRITE_INTCNT, &next_page->entries); - -- local_inc(&cpu_buffer->pages_touched); - /* - * Just make sure we have seen our old_write and synchronize - * with any interrupts that come in. -@@ -1200,8 +1199,9 @@ static void rb_tail_page_update(struct r - */ - local_set(&next_page->page->commit, 0); - -- /* Again, either we update tail_page or an interrupt does */ -- (void)cmpxchg(&cpu_buffer->tail_page, tail_page, next_page); -+ /* Either we update tail_page or an interrupt does */ -+ if (try_cmpxchg(&cpu_buffer->tail_page, &tail_page, next_page)) -+ local_inc(&cpu_buffer->pages_touched); - } - } - diff --git a/queue-5.4/series b/queue-5.4/series index 97def5ac885..e7e060a244e 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -1,3 +1,2 @@ batman-adv-avoid-infinite-loop-trying-to-resize-local-tt.patch -ring-buffer-only-update-pages_touched-when-a-new-page-is-touched.patch bluetooth-fix-memory-leak-in-hci_req_sync_complete.patch