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

Reply via email to