Skip to content

Commit cdb3f95

Browse files
Fernand Siebergregkh
authored andcommitted
perf/x86/intel: Do not enable BTS for guests
commit 91dcfae upstream. By default when users program perf to sample branch instructions (PERF_COUNT_HW_BRANCH_INSTRUCTIONS) with a sample period of 1, perf interprets this as a special case and enables BTS (Branch Trace Store) as an optimization to avoid taking an interrupt on every branch. Since BTS doesn't virtualize, this optimization doesn't make sense when the request originates from a guest. Add an additional check that prevents this optimization for virtualized events (exclude_host). Reported-by: Jan H. Schönherr <jschoenh@amazon.de> Suggested-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Fernand Sieber <sieberf@amazon.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: <stable@vger.kernel.org> Link: https://patch.msgid.link/20251211183604.868641-1-sieberf@amazon.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f8cf136 commit cdb3f95

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

arch/x86/events/perf_event.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,13 +1558,22 @@ static inline bool intel_pmu_has_bts_period(struct perf_event *event, u64 period
15581558
struct hw_perf_event *hwc = &event->hw;
15591559
unsigned int hw_event, bts_event;
15601560

1561-
if (event->attr.freq)
1561+
/*
1562+
* Only use BTS for fixed rate period==1 events.
1563+
*/
1564+
if (event->attr.freq || period != 1)
1565+
return false;
1566+
1567+
/*
1568+
* BTS doesn't virtualize.
1569+
*/
1570+
if (event->attr.exclude_host)
15621571
return false;
15631572

15641573
hw_event = hwc->config & INTEL_ARCH_EVENT_MASK;
15651574
bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS);
15661575

1567-
return hw_event == bts_event && period == 1;
1576+
return hw_event == bts_event;
15681577
}
15691578

15701579
static inline bool intel_pmu_has_bts(struct perf_event *event)

0 commit comments

Comments
 (0)