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); -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html