Re: [PATCH 2/6] perf/x86/intel/pt: Stop tracing if VMXON has not yet happened
From: Adrian Hunter
Date: Mon Nov 02 2026 - 06:07:07 EST
On 02/11/2026 11:57, Peter Zijlstra wrote:
> On Mon, Nov 02, 2026 at 09:40:35AM +0200, Adrian Hunter wrote:
>
>> arch/x86/events/intel/pt.c | 16 +++++++++++++++-
>> 1 file changed, 15 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c
>> index 49349afee611..36bf039668d7 100644
>> --- a/arch/x86/events/intel/pt.c
>> +++ b/arch/x86/events/intel/pt.c
>> @@ -567,6 +567,15 @@ static void pt_config(struct perf_event *event)
>> pt_config_enable(event);
>> }
>>
>> +static bool pt_trace_enabled(void)
>> +{
>> + u64 ctl;
>> +
>> + rdmsrq(MSR_IA32_RTIT_CTL, ctl);
>> +
>> + return ctl & RTIT_CTL_TRACEEN;
>> +}
>> +
>> static void pt_config_stop(struct perf_event *event)
>> {
>> struct pt *pt = this_cpu_ptr(&pt_ctx);
>> @@ -577,7 +586,12 @@ static void pt_config_stop(struct perf_event *event)
>> return;
>>
>> ctl &= ~RTIT_CTL_TRACEEN;
>> - if (!READ_ONCE(pt->vmx_on))
>> + /*
>> + * vmx_on is set before VMXON, so tracing may not have stopped yet.
>> + * RTIT_CTL can be written until VMXON, and after VMXON TraceEn is
>> + * clear, so still write RTIT_CTL if TraceEn is set.
>> + */
>> + if (!READ_ONCE(pt->vmx_on) || pt_trace_enabled())
>> wrmsrq(MSR_IA32_RTIT_CTL, ctl);
>>
>> WRITE_ONCE(event->hw.aux_config, ctl);
>
> It seems rather unfortunate to issue a RDMSR for state we fully control.
> Surely we can track this?
The RDMSR only happens on BDW and only when VMX is on and someone still
tries to use Intel PT (even though no trace can be produced on BDW
while VMX is on).
There is a window between setting vmx_on and clearing TRACEEN. Dealing
with that would be complicated, compared with reading the MSR.