Skip to content

Commit 91dcfae

Browse files
Fernand SieberPeter Zijlstra
authored andcommitted
perf/x86/intel: Do not enable BTS for guests
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
1 parent d06bf78 commit 91dcfae

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
@@ -1574,13 +1574,22 @@ static inline bool intel_pmu_has_bts_period(struct perf_event *event, u64 period
15741574
struct hw_perf_event *hwc = &event->hw;
15751575
unsigned int hw_event, bts_event;
15761576

1577-
if (event->attr.freq)
1577+
/*
1578+
* Only use BTS for fixed rate period==1 events.
1579+
*/
1580+
if (event->attr.freq || period != 1)
1581+
return false;
1582+
1583+
/*
1584+
* BTS doesn't virtualize.
1585+
*/
1586+
if (event->attr.exclude_host)
15781587
return false;
15791588

15801589
hw_event = hwc->config & INTEL_ARCH_EVENT_MASK;
15811590
bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS);
15821591

1583-
return hw_event == bts_event && period == 1;
1592+
return hw_event == bts_event;
15841593
}
15851594

15861595
static inline bool intel_pmu_has_bts(struct perf_event *event)

0 commit comments

Comments
 (0)