No description
Find a file
Steven Rostedt (Google) ceb52ccfb0 ring-buffer: Fix race between reset page and reading page
commit a0fcaaed0c upstream.

The ring buffer is broken up into sub buffers (currently of page size).
Each sub buffer has a pointer to its "tail" (the last event written to the
sub buffer). When a new event is requested, the tail is locally
incremented to cover the size of the new event. This is done in a way that
there is no need for locking.

If the tail goes past the end of the sub buffer, the process of moving to
the next sub buffer takes place. After setting the current sub buffer to
the next one, the previous one that had the tail go passed the end of the
sub buffer needs to be reset back to the original tail location (before
the new event was requested) and the rest of the sub buffer needs to be
"padded".

The race happens when a reader takes control of the sub buffer. As readers
do a "swap" of sub buffers from the ring buffer to get exclusive access to
the sub buffer, it replaces the "head" sub buffer with an empty sub buffer
that goes back into the writable portion of the ring buffer. This swap can
happen as soon as the writer moves to the next sub buffer and before it
updates the last sub buffer with padding.

Because the sub buffer can be released to the reader while the writer is
still updating the padding, it is possible for the reader to see the event
that goes past the end of the sub buffer. This can cause obvious issues.

To fix this, add a few memory barriers so that the reader definitely sees
the updates to the sub buffer, and also waits until the writer has put
back the "tail" of the sub buffer back to the last event that was written
on it.

To be paranoid, it will only spin for 1 second, otherwise it will
warn and shutdown the ring buffer code. 1 second should be enough as
the writer does have preemption disabled. If the writer doesn't move
within 1 second (with preemption disabled) something is horribly
wrong. No interrupt should last 1 second!

Link: https://lore.kernel.org/all/20220830120854.7545-1-jiazi.li@transsion.com/
Link: https://bugzilla.kernel.org/show_bug.cgi?id=216369
Link: https://lkml.kernel.org/r/20220929104909.0650a36c@gandalf.local.home

Cc: Ingo Molnar <mingo@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: stable@vger.kernel.org
Fixes: c7b0930857 ("ring-buffer: prevent adding write in discarded area")
Reported-by: Jiazi.Li <jiazi.li@transsion.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-10-24 09:56:57 +02:00
arch powerpc/boot: Explicitly disable usage of SPE instructions 2022-10-24 09:56:50 +02:00
block Revert "block: freeze the queue earlier in del_gendisk" 2022-09-28 11:32:28 +02:00
certs certs: make system keyring depend on built-in x509 parser 2022-09-28 11:32:27 +02:00
crypto KEYS: asymmetric: enforce SM2 signature use pkey algo 2022-08-17 15:16:17 +02:00
Documentation fs: record I_DIRTY_TIME even if inode already has I_DIRTY_INODE 2022-10-24 09:56:52 +02:00
drivers hwrng: core - let sleep be interrupted when unregistering hwrng 2022-10-24 09:56:51 +02:00
fs ext4: update 'state->fc_regions_size' after successful memory allocation 2022-10-24 09:56:56 +02:00
include ring-buffer: Add ring_buffer_wake_waiters() 2022-10-24 09:56:57 +02:00
init arm64: fix rodata=full 2022-08-31 17:18:19 +02:00
io_uring io_uring: correct pinned_vm accounting 2022-10-24 09:56:40 +02:00
ipc ipc: Free mq_sysctls if ipc namespace creation failed 2022-06-22 17:47:41 -05:00
kernel ring-buffer: Fix race between reset page and reading page 2022-10-24 09:56:57 +02:00
lib Makefile.debug: re-enable debug info for .S files 2022-09-28 11:32:27 +02:00
LICENSES LICENSES/LGPL-2.1: Add LGPL-2.1-or-later as valid identifiers 2021-12-16 14:33:10 +01:00
mm mm/mmap: undo ->mmap() when arch_validate_flags() fails 2022-10-24 09:56:48 +02:00
net io_uring/af_unix: defer registered files gc to io_uring release 2022-10-24 09:56:40 +02:00
samples sample: bpf: xdp_router_ipv4: Allow the kernel to send arp requests 2022-08-17 15:14:25 +02:00
scripts Makefile.extrawarn: Move -Wcast-function-type-strict to W=1 2022-10-12 09:51:23 +02:00
security efi: Correct Macmini DMI match in uefi cert quirk 2022-10-15 08:01:43 +02:00
sound ASoC: wcd934x: fix order of Slimbus unprepare/disable 2022-10-24 09:56:44 +02:00
tools perf tests record: Fail the test if the 'errs' counter is not zero 2022-10-05 10:40:54 +02:00
usr Not a lot of material this cycle. Many singleton patches against various 2022-05-27 11:22:03 -07:00
virt KVM: Unconditionally get a ref to /dev/kvm module when creating a VM 2022-08-25 11:45:05 +02:00
.clang-format clang-format: Fix space after for_each macros 2022-05-20 19:27:16 +02:00
.cocciconfig
.get_maintainer.ignore Opt out of scripts/get_maintainer.pl 2019-05-16 10:53:40 -07:00
.gitattributes .gitattributes: use 'dts' diff driver for dts files 2019-12-04 19:44:11 -08:00
.gitignore kbuild: split the second line of *.mod into *.usyms 2022-05-08 03:16:59 +09:00
.mailmap ARM: SoC fixes for 5.19, part 4 2022-07-27 09:43:07 -07:00
COPYING COPYING: state that all contributions really are covered by this file 2020-02-10 13:32:20 -08:00
CREDITS MAINTAINERS: mark ARM/PALM TREO SUPPORT orphan 2022-07-07 15:17:00 +02:00
Kbuild kbuild: rename hostprogs-y/always to hostprogs/always-y 2020-02-04 01:53:07 +09:00
Kconfig kbuild: ensure full rebuild when the compiler is updated 2020-05-12 13:28:33 +09:00
MAINTAINERS io_uring: move to separate directory 2022-08-17 15:14:20 +02:00
Makefile Linux 5.19.16 2022-10-15 08:01:46 +02:00
README Drop all 00-INDEX files from Documentation/ 2018-09-09 15:08:58 -06:00

Linux kernel
============

There are several guides for kernel developers and users. These guides can
be rendered in a number of formats, like HTML and PDF. Please read
Documentation/admin-guide/README.rst first.

In order to build the documentation, use ``make htmldocs`` or
``make pdfdocs``.  The formatted documentation can also be read online at:

    https://www.kernel.org/doc/html/latest/

There are various text files in the Documentation/ subdirectory,
several of them using the Restructured Text markup notation.

Please read the Documentation/process/changes.rst file, as it contains the
requirements for building and running the kernel, and information about
the problems which may result by upgrading your kernel.