Linux kernel source tree
Go to file
Ard Biesheuvel dd3fa54b2e apei/ghes: Use xchg_release() for updating new cache slot instead of cmpxchg()
Some documentation first, about how this machinery works:

It seems, the intent of the GHES error records cache is to collect
already reported errors - see the ghes_estatus_cached() checks. There's
even a sentence trying to say what this does:

  /*
   * GHES error status reporting throttle, to report more kinds of
   * errors, instead of just most frequently occurred errors.
   */

New elements are added to the cache this way:

  if (!ghes_estatus_cached(estatus)) {
          if (ghes_print_estatus(NULL, ghes->generic, estatus))
                  ghes_estatus_cache_add(ghes->generic, estatus);

The intent being, once this new error record is reported, it gets cached
so that it doesn't get reported for a while due to too many, same-type
error records getting reported in burst-like scenarios. I.e., new,
unreported error types can have a higher chance of getting reported.

Now, the loop in ghes_estatus_cache_add() is trying to pick out the
oldest element in there. Meaning, something which got reported already
but a long while ago, i.e., a LRU-type scheme.

And the cmpxchg() is there presumably to make sure when that selected
element slot_cache is removed, it really *is* that element that gets
removed and not one which replaced it in the meantime.

Now, ghes_estatus_cache_add() selects a slot, and either succeeds in
replacing its contents with a pointer to a newly cached item, or it just
gives up and frees the new item again, without attempting to select
another slot even if one might be available.

Since only inserting new items is being done here, the race can only
cause a failure if the selected slot was updated with another new item
concurrently, which means that it is arbitrary which of those two items
gets dropped.

And "dropped" here means, the item doesn't get added to the cache so
the next time it is seen, it'll get reported again and an insertion
attempt will be done again. Eventually, it'll get inserted and all those
times when the insertion fails, the item will get reported although the
cache is supposed to prevent that and "ratelimit" those repeated error
records. Not a big deal in any case.

This means the cmpxchg() and the special case are not necessary.
Therefore, just drop the existing item unconditionally.

Move the xchg_release() and call_rcu() out of rcu_read_lock/unlock
section since there is no actually dereferencing the pointer at all.

  [ bp:
    - Flesh out and summarize what was discussed on the thread now
      that that cache contraption is understood;
    - Touch up code style. ]

Co-developed-by: Jia He <justin.he@arm.com>
Signed-off-by: Jia He <justin.he@arm.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221010023559.69655-7-justin.he@arm.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2022-10-28 18:50:41 +02:00
arch dma-mapping updates for Linux 6.1 2022-10-10 13:24:55 -07:00
block cgroup changes for v6.1-rc1. 2022-10-10 11:12:25 -07:00
certs certs: make system keyring depend on built-in x509 parser 2022-09-24 04:31:18 +09:00
crypto crypto: tcrypt - add async speed test for aria cipher 2022-09-24 16:14:44 +08:00
Documentation IOMMU Updates for Linux v6.1: 2022-10-10 13:20:53 -07:00
drivers apei/ghes: Use xchg_release() for updating new cache slot instead of cmpxchg() 2022-10-28 18:50:41 +02:00
fs bitmap patches for v6.1-rc1 2022-10-10 12:49:34 -07:00
include ACPI: APEI: Fix integer overflow in ghes_estatus_pool_init() 2022-10-13 20:40:09 +02:00
init Kbuild updates for v6.1 2022-10-10 12:00:45 -07:00
io_uring for-6.1/passthrough-2022-10-04 2022-10-07 09:35:50 -07:00
ipc ipc: mqueue: fix possible memory leak in init_mqueue_fs() 2022-10-09 16:10:22 -07:00
kernel More ACPI updates for 6.1-rc1 2022-10-10 13:28:06 -07:00
lib dma-mapping updates for Linux 6.1 2022-10-10 13:24:55 -07:00
LICENSES LICENSES/LGPL-2.1: Add LGPL-2.1-or-later as valid identifiers 2021-12-16 14:33:10 +01:00
mm cgroup changes for v6.1-rc1. 2022-10-10 11:12:25 -07:00
net cgroup changes for v6.1-rc1. 2022-10-10 11:12:25 -07:00
rust Kbuild: add Rust support 2022-09-28 09:02:20 +02:00
samples Tracing updates for 6.1: 2022-10-10 12:20:55 -07:00
scripts Devicetree updates for v6.1: 2022-10-10 13:13:51 -07:00
security tpmdd updates for Linux v6.1-rc1 2022-10-10 13:09:33 -07:00
sound sound updates for 6.1-rc1 2022-10-05 12:02:07 -07:00
tools tpmdd updates for Linux v6.1-rc1 2022-10-10 13:09:33 -07:00
usr Not a lot of material this cycle. Many singleton patches against various 2022-05-27 11:22:03 -07:00
virt KVM: remove KVM_REQ_UNHALT 2022-09-26 12:37:21 -04:00
.clang-format PCI/DOE: Add DOE mailbox support functions 2022-07-19 15:38:04 -07:00
.cocciconfig scripts: add Linux .cocciconfig for coccinelle 2016-07-22 12:13:39 +02:00
.get_maintainer.ignore get_maintainer: add Alan to .get_maintainer.ignore 2022-08-20 15:17:44 -07:00
.gitattributes .gitattributes: use 'dts' diff driver for dts files 2019-12-04 19:44:11 -08:00
.gitignore Kbuild: add Rust support 2022-09-28 09:02:20 +02:00
.mailmap The first batch of KVM patches, mostly covering x86, which I 2022-10-09 09:39:55 -07:00
.rustfmt.toml rust: add .rustfmt.toml 2022-09-28 09:02:20 +02:00
COPYING COPYING: state that all contributions really are covered by this file 2020-02-10 13:32:20 -08:00
CREDITS drm for 5.20/6.0 2022-08-03 19:52:08 -07:00
Kbuild Kbuild updates for v6.1 2022-10-10 12:00:45 -07:00
Kconfig kbuild: ensure full rebuild when the compiler is updated 2020-05-12 13:28:33 +09:00
MAINTAINERS dma-mapping updates for Linux 6.1 2022-10-10 13:24:55 -07:00
Makefile Devicetree updates for v6.1: 2022-10-10 13:13:51 -07: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.