diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 13a426cc54db..6e83272cf740 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -170,12 +170,6 @@ struct hw_perf_event { }; struct { /* aux / Intel-PT */ u64 aux_config; - /* - * For AUX area events, aux_paused cannot be a state - * flag because it can be updated asynchronously to - * state. - */ - unsigned int aux_paused; }; struct { /* software */ struct hrtimer hrtimer; @@ -300,7 +294,6 @@ struct perf_event_pmu_context; #define PERF_PMU_CAP_NO_EXCLUDE 0x0040 #define PERF_PMU_CAP_AUX_OUTPUT 0x0080 #define PERF_PMU_CAP_EXTENDED_HW_TYPE 0x0100 -#define PERF_PMU_CAP_AUX_PAUSE 0x0200 /** * pmu::scope @@ -391,8 +384,6 @@ struct pmu { #define PERF_EF_START 0x01 /* start the counter when adding */ #define PERF_EF_RELOAD 0x02 /* reload the counter when starting */ #define PERF_EF_UPDATE 0x04 /* update the counter when stopping */ -#define PERF_EF_PAUSE 0x08 /* AUX area event, pause tracing */ -#define PERF_EF_RESUME 0x10 /* AUX area event, resume tracing */ /* * Adds/Removes a counter to/from the PMU, can be done inside a @@ -432,18 +423,6 @@ struct pmu { * * ->start() with PERF_EF_RELOAD will reprogram the counter * value, must be preceded by a ->stop() with PERF_EF_UPDATE. - * - * ->stop() with PERF_EF_PAUSE will stop as simply as possible. Will not - * overlap another ->stop() with PERF_EF_PAUSE nor ->start() with - * PERF_EF_RESUME. - * - * ->start() with PERF_EF_RESUME will start as simply as possible but - * only if the counter is not otherwise stopped. Will not overlap - * another ->start() with PERF_EF_RESUME nor ->stop() with - * PERF_EF_PAUSE. - * - * Notably, PERF_EF_PAUSE/PERF_EF_RESUME *can* be concurrent with other - * ->stop()/->start() invocations, just not itself. */ void (*start) (struct perf_event *event, int flags); void (*stop) (struct perf_event *event, int flags); @@ -1724,13 +1703,6 @@ static inline bool has_aux(struct perf_event *event) return event->pmu->setup_aux; } -static inline bool has_aux_action(struct perf_event *event) -{ - return event->attr.aux_sample_size || - event->attr.aux_pause || - event->attr.aux_resume; -} - static inline bool is_write_backward(struct perf_event *event) { return !!event->attr.write_backward; diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 0524d541d4e3..4842c36fdf80 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -511,16 +511,7 @@ struct perf_event_attr { __u16 sample_max_stack; __u16 __reserved_2; __u32 aux_sample_size; - - union { - __u32 aux_action; - struct { - __u32 aux_start_paused : 1, /* start AUX area tracing paused */ - aux_pause : 1, /* on overflow, pause AUX area tracing */ - aux_resume : 1, /* on overflow, resume AUX area tracing */ - __reserved_3 : 29; - }; - }; + __u32 __reserved_3; /* * User provided data if sigtrap=1, passed back to user via diff --git a/kernel/events/core.c b/kernel/events/core.c index d5f0a18a7066..3e86024f74c7 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -2146,7 +2146,7 @@ static void perf_put_aux_event(struct perf_event *event) static bool perf_need_aux_event(struct perf_event *event) { - return event->attr.aux_output || has_aux_action(event); + return !!event->attr.aux_output || !!event->attr.aux_sample_size; } static int perf_get_aux_event(struct perf_event *event, @@ -2171,10 +2171,6 @@ static int perf_get_aux_event(struct perf_event *event, !perf_aux_output_match(event, group_leader)) return 0; - if ((event->attr.aux_pause || event->attr.aux_resume) && - !(group_leader->pmu->capabilities & PERF_PMU_CAP_AUX_PAUSE)) - return 0; - if (event->attr.aux_sample_size && !group_leader->pmu->snapshot_aux) return 0; @@ -8019,49 +8015,6 @@ void perf_prepare_header(struct perf_event_header *header, WARN_ON_ONCE(header->size & 7); } -static void __perf_event_aux_pause(struct perf_event *event, bool pause) -{ - if (pause) { - if (!event->hw.aux_paused) { - event->hw.aux_paused = 1; - event->pmu->stop(event, PERF_EF_PAUSE); - } - } else { - if (event->hw.aux_paused) { - event->hw.aux_paused = 0; - event->pmu->start(event, PERF_EF_RESUME); - } - } -} - -static void perf_event_aux_pause(struct perf_event *event, bool pause) -{ - struct perf_buffer *rb; - - if (WARN_ON_ONCE(!event)) - return; - - rb = ring_buffer_get(event); - if (!rb) - return; - - scoped_guard (irqsave) { - /* - * Guard against self-recursion here. Another event could trip - * this same from NMI context. - */ - if (READ_ONCE(rb->aux_in_pause_resume)) - break; - - WRITE_ONCE(rb->aux_in_pause_resume, 1); - barrier(); - __perf_event_aux_pause(event, pause); - barrier(); - WRITE_ONCE(rb->aux_in_pause_resume, 0); - } - ring_buffer_put(rb); -} - static __always_inline int __perf_event_output(struct perf_event *event, struct perf_sample_data *data, @@ -9865,12 +9818,9 @@ static int __perf_event_overflow(struct perf_event *event, ret = __perf_event_account_interrupt(event, throttle); - if (event->attr.aux_pause) - perf_event_aux_pause(event->aux_event, true); - if (event->prog && event->prog->type == BPF_PROG_TYPE_PERF_EVENT && !bpf_overflow_handler(event, data, regs)) - goto out; + return ret; /* * XXX event_limit might not quite work as expected on inherited @@ -9932,9 +9882,6 @@ static int __perf_event_overflow(struct perf_event *event, event->pending_wakeup = 1; irq_work_queue(&event->pending_irq); } -out: - if (event->attr.aux_resume) - perf_event_aux_pause(event->aux_event, false); return ret; } @@ -12351,25 +12298,11 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, } if (event->attr.aux_output && - (!(pmu->capabilities & PERF_PMU_CAP_AUX_OUTPUT) || - event->attr.aux_pause || event->attr.aux_resume)) { + !(pmu->capabilities & PERF_PMU_CAP_AUX_OUTPUT)) { err = -EOPNOTSUPP; goto err_pmu; } - if (event->attr.aux_pause && event->attr.aux_resume) { - err = -EINVAL; - goto err_pmu; - } - - if (event->attr.aux_start_paused) { - if (!(pmu->capabilities & PERF_PMU_CAP_AUX_PAUSE)) { - err = -EOPNOTSUPP; - goto err_pmu; - } - event->hw.aux_paused = 1; - } - if (cgroup_fd != -1) { err = perf_cgroup_connect(cgroup_fd, event, attr, group_leader); if (err) @@ -13165,7 +13098,7 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, * Grouping is not supported for kernel events, neither is 'AUX', * make sure the caller's intentions are adjusted. */ - if (attr->aux_output || attr->aux_action) + if (attr->aux_output) return ERR_PTR(-EINVAL); event = perf_event_alloc(attr, cpu, task, NULL, NULL, diff --git a/kernel/events/internal.h b/kernel/events/internal.h index 249288d82b8d..e072d995d670 100644 --- a/kernel/events/internal.h +++ b/kernel/events/internal.h @@ -52,7 +52,6 @@ struct perf_buffer { void (*free_aux)(void *); refcount_t aux_refcount; int aux_in_sampling; - int aux_in_pause_resume; void **aux_pages; void *aux_priv;