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); }