On Tue, Nov 24, 2020 at 5:10 PM Peter Zijlstra <pet...@infradead.org> wrote: > > On Tue, Nov 24, 2020 at 02:01:39PM +0900, Namhyung Kim wrote: > > > Yes, it's not about __intel_pmu_pebs_event(). I'm looking at > > intel_pmu_drain_pebs_nhm() specifically. There's code like > > > > /* log dropped samples number */ > > if (error[bit]) { > > perf_log_lost_samples(event, error[bit]); > > > > if (perf_event_account_interrupt(event)) > > x86_pmu_stop(event, 0); > > } > > > > if (counts[bit]) { > > __intel_pmu_pebs_event(event, iregs, base, > > top, bit, counts[bit], > > setup_pebs_fixed_sample_data); > > } > > > > There's a path to x86_pmu_stop() when an error bit is on. > > That would seem to suggest you try something like this: > > diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c > index 31b9e58b03fe..8c6ee8be8b6e 100644 > --- a/arch/x86/events/intel/ds.c > +++ b/arch/x86/events/intel/ds.c > @@ -1945,7 +1945,7 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs > *iregs, struct perf_sample_d > if (error[bit]) { > perf_log_lost_samples(event, error[bit]); > > - if (perf_event_account_interrupt(event)) > + if (iregs && perf_event_account_interrupt(event)) > x86_pmu_stop(event, 0); > } >
That would work too and much simpler! Thanks, Namhyung