[Patch v5 00/18] perf/x86: Fix multiple LBR sampling issues
From: Dapeng Mi
Date: Thu Oct 29 2026 - 00:49:02 EST
This patch series fixes several x86 LBR sampling issues discovered during
review and debugging. Most of them are related to BPF LBR snapshotting
support.
The series originally targeted the BPF stack out-of-bounds access issue,
but additional problems were found during debugging and code review,
including:
- PMU and LBR being re-enabled unconditionally at BPF snapshotting exit,
even when they had already been disabled before BPF snapshotting on both
AMD and Intel.
- LBR not being fully frozen in the PMI handler on Intel, which allows
branches in the PMI path to pollute the BPF LBR snapshot.
- BPF snapshotting overwriting the cached LBR stack of PEBS LBR events on
Intel.
- PEBS LBR events overwriting the LBR stack of non-PEBS LBR events on
Intel when both overflow in the same PMI.
- LBR counter events reporting zero counters on Intel when multiple
LBR counter events overflow in the same PMI.
Patch layout:
- Patch 01: Add a sanity check to ensure the LBR stack does not exceed
MAX_LBR_ENTRIES.
- Patch 02: Validate that hardware LBR data has actually been stored in
the XSAVE area before parsing it.
- Patch 03-04: Fix the potential LBR stack out-of-bounds access issue on
AMD and Intel separately.
- Patch 05-08: Fix the incorrect PMU and LBR re-enabling issue
in perf_snapshot_branch_stack() for AMD and Intel separately.
- Patch 09: Freeze LBR throughout the PMI processing period and ensure
all LBR events observe a consistent LBR stack in the PMI handler.
- Patch 10-11: Add a dedicated LBR stack for BPF LBR snapshotting to avoid
overwriting the default LBR stack of other LBR events.
- Patch 12: Ensure perf_snapshot_branch_stack() snapshots the live
hardware LBR data instead of the cached PEBS LBR stack.
- Patch 13: Prevent PEBS LBR data from overwriting non-PEBS LBR data when
both overflow in the same PMI.
- Patch 14: Add the missing lbr_pebs_users accounting for arch-PEBS.
- Patch 15-16: Ensure LBR counters are not dropped when multiple LBR
counter events overflow in the same PMI.
- Patch 17: Clamp the parsed PEBS LBR stack depth to x86_pmu.lbr_nr to
avoid LBR stack out-of-bounds access.
- Patch 18: Fix the shared LBR stack depth truncation issue.
Changes in v5:
- Patch 02: Clear xsave->header.xfeatures before calling the xsaves
instructuion to read LBR states.
- Patch 05-18: New patches to fix newly discovered issues described above.
Changes in v4:
- Patch 01: Disable LBR if parsed x86_pmu.lbr_nr exceeds
MAX_LBR_ENTRIES (Sashiko).
- Patch 05: New patch, which always snapshots live hardware LBR stack
for BPF path (Sashiko).
Changes in v3:
- Patch 01: A new patch to ensure x86_pmu.lbr_nr not to exclude
MAX_LBR_ENTRIES (Internal Sashiko).
- Patch 03: Clean cached LBR stack when reseting hardware LBR registers,
which prevents stale LBR stack leakage.
- Patch 04: Don't reset cached LBR stack if all LBR events are PEBS
events. This ensures PEBS captured LBR stack isn't cleared (Sashiko).
Changes in v2:
- Include a fix for Intel LBR.
- Add Tested-by from Dapeng to the Intel fix.
https://lore.kernel.org/all/eb6c7bda-0dcf-4fac-ad69-9f5b24abc21b@xxxxxxxxxxxxxxx/
History:
v4: https://lore.kernel.org/all/20261021050711.4043703-1-dapeng1.mi@xxxxxxxxxxxxxxx/
v3: https://lore.kernel.org/all/20261019070836.2972403-1-dapeng1.mi@xxxxxxxxxxxxxxx/
v2: https://lore.kernel.org/all/cover.1792064123.git.sandipan.das@xxxxxxx/
v1: https://lore.kernel.org/all/20261007181002.4005262-1-sandipan.das@xxxxxxx/
Dapeng Mi (17):
perf/x86: Disable LBR if x86_pmu.lbr_nr exceeds MAX_LBR_ENTRIES
perf/x86/intel: Validate LBR XSAVE state before updating LBR stack
perf/x86/intel/lbr: Limit branch snapshots to valid entries
perf/x86: Add lbr_enabled to track LBR state
perf/x86/amd: Avoid re-enabling PMU and LBR for BPF when disabled
perf/x86/intel: Add helper to enable PMU without LBR
perf/x86/intel: Avoid re-enabling PMU and LBR for BPF when disabled
perf/x86/intel: Keep LBR frozen throughout PMI handling
perf/x86/intel: Allow LBR read helpers to operate on explicit stacks
perf/x86/intel: Use a dedicated LBR stack for BPF snapshotting
perf/x86/intel: Always snapshot live hardware LBR state for BPF
perf/x86/intel: Refresh LBR stack for non-PEBS LBR events if needed
perf/x86/intel: Account arch-PEBS in lbr_pebs_users
perf/x86/intel: Clear raw LBR counters in the LBR stack
perf/x86/intel: Refill LBR stack for LBR counter events in PMI handler
perf/x86/intel: Pass LBR stack size into store_lbr()
perf/core: Don't overwrite shared LBR stack depth
Sandipan Das (1):
perf/x86/amd/lbr: Limit branch snapshots to valid entries
arch/x86/events/amd/core.c | 14 +++-
arch/x86/events/amd/lbr.c | 14 +++-
arch/x86/events/intel/core.c | 135 ++++++++++++++++++++++++++-----
arch/x86/events/intel/ds.c | 8 +-
arch/x86/events/intel/lbr.c | 153 ++++++++++++++++++++++-------------
arch/x86/events/perf_event.h | 37 +++++++--
include/linux/perf_event.h | 13 ++-
kernel/events/core.c | 8 +-
8 files changed, 285 insertions(+), 97 deletions(-)
base-commit: f5a78ecccd98a04c47cea1cd63c2a2fdce8a4b48
--
2.34.1