|
@@ -1960,6 +1960,12 @@ void perf_event_disable(struct perf_event *event)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(perf_event_disable);
|
|
|
|
|
|
+void perf_event_disable_inatomic(struct perf_event *event)
|
|
|
+{
|
|
|
+ event->pending_disable = 1;
|
|
|
+ irq_work_queue(&event->pending);
|
|
|
+}
|
|
|
+
|
|
|
static void perf_set_shadow_time(struct perf_event *event,
|
|
|
struct perf_event_context *ctx,
|
|
|
u64 tstamp)
|
|
@@ -7075,8 +7081,8 @@ static int __perf_event_overflow(struct perf_event *event,
|
|
|
if (events && atomic_dec_and_test(&event->event_limit)) {
|
|
|
ret = 1;
|
|
|
event->pending_kill = POLL_HUP;
|
|
|
- event->pending_disable = 1;
|
|
|
- irq_work_queue(&event->pending);
|
|
|
+
|
|
|
+ perf_event_disable_inatomic(event);
|
|
|
}
|
|
|
|
|
|
READ_ONCE(event->overflow_handler)(event, data, regs);
|