linux/include/acpi
Tony Luck f2edc1fb9c ACPI: APEI: GHES: Improve ghes_notify_nmi() status check
ghes_notify_nmi() is called for every NMI and must check whether the NMI was
generated because an error was signalled by platform firmware.

This check is very expensive as for each registered GHES NMI source it reads
from the acpi generic address attached to this error source to get the physical
address of the acpi_hest_generic_status block.  It then checks the "block_status"
to see if an error was logged.

The ACPI/APEI code must create virtual mappings for each of those physical
addresses, and tear them down afterwards. On an Icelake system this takes around
15,000 TSC cycles. Enough to disturb efforts to profile system performance.

If that were not bad enough, there are some atomic accesses in the code path
that will cause cache line bounces between CPUs. A problem that gets worse as
the core count increases.

But BIOS changes neither the acpi generic address nor the physical address of
the acpi_hest_generic_status block. So this walk can be done once when the NMI is
registered to save the virtual address (unmapping if the NMI is ever unregistered).
The "block_status" can be checked directly in the NMI handler. This can be done
without any atomic accesses.

Resulting time to check that there is not an error record is around 900 cycles.

Reported-by: Andi Kleen <andi.kleen@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Tested-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com>
Reviewed-by: Hanjun Guo <guohanjun@huawei.com>
Link: https://patch.msgid.link/20260112032239.30023-2-xueshuai@linux.alibaba.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2026-01-14 17:05:05 +01:00
..
platform ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acbuffer.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acconfig.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acexcep.h ACPICA: Print error messages for too few or too many arguments 2025-09-15 12:20:13 +02:00
acnames.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acoutput.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acpi.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acpi_bus.h ACPI: bus: implement acpi_device_hid when !ACPI 2024-12-19 20:59:36 +01:00
acpi_drivers.h ACPI: platform: Move SMB0001 HID to the header and reuse 2023-07-04 19:28:20 +02:00
acpi_io.h Revert "ACPI: Add memory semantics to acpi_os_map_memory()" 2021-09-23 20:39:36 +02:00
acpi_lpat.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174 2019-05-30 11:26:41 -07:00
acpi_numa.h mm/fake-numa: allow later numa node hotplug 2025-01-25 20:22:29 -08:00
acpiosxf.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acpixf.h ACPICA: Update version to 20250807 2025-09-15 12:20:13 +02:00
acrestyp.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
actbl.h ACPICA: Apply ACPI_NONSTRING 2025-09-15 12:20:12 +02:00
actbl1.h CXL changes for v6.18 2025-10-04 12:02:50 -07:00
actbl2.h ACPICA: Add SoundWire File Table (SWFT) signature 2025-08-25 16:44:36 +02:00
actbl3.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
actypes.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
acuuid.h ACPICA: Update copyright year 2025-05-12 15:38:43 +02:00
apei.h ACPI: APEI: Fix missing ERST record id 2022-04-13 20:29:24 +02:00
battery.h ACPI: battery: add devm_battery_hook_register() 2024-07-01 21:22:18 +08:00
button.h ACPI: button: move HIDs to acpi/button.h 2020-02-13 23:36:23 +01:00
cppc_acpi.h ACPI: CPPC: Do not use CPUFREQ_ETERNAL as an error value 2025-10-01 13:57:13 +02:00
ghes.h ACPI: APEI: GHES: Improve ghes_notify_nmi() status check 2026-01-14 17:05:05 +01:00
hed.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 428 2019-06-05 17:37:16 +02:00
nfit.h acpi, nfit: Add function to look up nvdimm device and provide SMBIOS handle 2018-03-14 12:43:50 +01:00
nhlt.h ACPI: NHLT: Streamline struct naming 2024-03-27 16:36:45 +01:00
pcc.h mailbox/pcc: support mailbox management of the shared buffer 2025-08-07 23:49:56 -05:00
proc_cap_intel.h ACPI: processor: Introduce acpi_processor_osc() 2023-07-14 17:59:40 +02:00
processor.h Revert "ACPI: processor: idle: Optimize ACPI idle driver registration" 2025-11-25 16:08:06 +01:00
reboot.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
video.h ACPI: video: Add Dell UART backlight controller detection 2024-08-19 15:58:35 +02:00