Re: [PATCH] perf/x86/intel/pt: Don't die on VMXON
From: Peter Zijlstra
Date: Wed Apr 06 2016 - 04:52:35 EST
On Fri, Apr 01, 2016 at 07:24:14PM +0300, Alexander Shishkin wrote:
> +static void pt_config_stop(struct perf_event *event)
> {
> + u64 ctl = READ_ONCE(event->hw.config);
>
> + /* may be already stopped by a PMI*/
> + if (!(ctl & RTIT_CTL_TRACEEN))
> + return;
> +
> + ctl ^= RTIT_CTL_TRACEEN;
Would that not be much less confusing when written like |= ?
> wrmsrl(MSR_IA32_RTIT_CTL, ctl);
>
> + WRITE_ONCE(event->hw.config, ctl);
> +
> /*
> * A wrmsr that disables trace generation serializes other PT
> * registers and causes all data packets to be written to memory,
> +void intel_pt_vmxon(int entry)
> +{
> + struct pt *pt = this_cpu_ptr(&pt_ctx);
> + struct perf_event *event;
> + unsigned long flags;
> +
> + /* PT plays nice with VMX, do nothing */
> + if (pt_pmu.vmx)
> + return;
> +
> + /*
> + * VMX entry will clear RTIT_CTL.TraceEn; we need to make
> + * sure to not try to set it while VMX is on. Disable
> + * interrupts to avoid racing with pmu callbacks;
> + * concurrent PMI should be handled fine.
> + */
> + local_irq_save(flags);
> + WRITE_ONCE(pt->vmx_on, entry);
So you mix: "VMX is on" and "VMX entry", please pick one.
Since the function is called vmxon, I find .entry a very confusing
argument name.
> +
> + if (entry) {
> + /* prevent pt_config_stop() from writing RTIT_CTL */
> + event = pt->handle.event;
> + if (event)
> + event->hw.config = 0;
> + }
> + local_irq_restore(flags);
> +}
> +EXPORT_SYMBOL_GPL(intel_pt_vmxon);