Revert "perf/core: Add aux_pause, aux_resume, aux_start_paused"
This reverts commit c61feda373 which is
commit 18d92bb57c39504d9da11c6ef604f58eb1d5a117 upstream.
It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.
Bug: 161946584
Change-Id: I29205f8d540692f5415a1cd3e7fcf74076b2b3b8
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -170,12 +170,6 @@ struct hw_perf_event {
|
|||||||
};
|
};
|
||||||
struct { /* aux / Intel-PT */
|
struct { /* aux / Intel-PT */
|
||||||
u64 aux_config;
|
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 { /* software */
|
||||||
struct hrtimer hrtimer;
|
struct hrtimer hrtimer;
|
||||||
@@ -300,7 +294,6 @@ struct perf_event_pmu_context;
|
|||||||
#define PERF_PMU_CAP_NO_EXCLUDE 0x0040
|
#define PERF_PMU_CAP_NO_EXCLUDE 0x0040
|
||||||
#define PERF_PMU_CAP_AUX_OUTPUT 0x0080
|
#define PERF_PMU_CAP_AUX_OUTPUT 0x0080
|
||||||
#define PERF_PMU_CAP_EXTENDED_HW_TYPE 0x0100
|
#define PERF_PMU_CAP_EXTENDED_HW_TYPE 0x0100
|
||||||
#define PERF_PMU_CAP_AUX_PAUSE 0x0200
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pmu::scope
|
* pmu::scope
|
||||||
@@ -391,8 +384,6 @@ struct pmu {
|
|||||||
#define PERF_EF_START 0x01 /* start the counter when adding */
|
#define PERF_EF_START 0x01 /* start the counter when adding */
|
||||||
#define PERF_EF_RELOAD 0x02 /* reload the counter when starting */
|
#define PERF_EF_RELOAD 0x02 /* reload the counter when starting */
|
||||||
#define PERF_EF_UPDATE 0x04 /* update the counter when stopping */
|
#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
|
* 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
|
* ->start() with PERF_EF_RELOAD will reprogram the counter
|
||||||
* value, must be preceded by a ->stop() with PERF_EF_UPDATE.
|
* 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 (*start) (struct perf_event *event, int flags);
|
||||||
void (*stop) (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;
|
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)
|
static inline bool is_write_backward(struct perf_event *event)
|
||||||
{
|
{
|
||||||
return !!event->attr.write_backward;
|
return !!event->attr.write_backward;
|
||||||
|
|||||||
@@ -511,16 +511,7 @@ struct perf_event_attr {
|
|||||||
__u16 sample_max_stack;
|
__u16 sample_max_stack;
|
||||||
__u16 __reserved_2;
|
__u16 __reserved_2;
|
||||||
__u32 aux_sample_size;
|
__u32 aux_sample_size;
|
||||||
|
__u32 __reserved_3;
|
||||||
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;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* User provided data if sigtrap=1, passed back to user via
|
* User provided data if sigtrap=1, passed back to user via
|
||||||
|
|||||||
+4
-71
@@ -2146,7 +2146,7 @@ static void perf_put_aux_event(struct perf_event *event)
|
|||||||
|
|
||||||
static bool perf_need_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,
|
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))
|
!perf_aux_output_match(event, group_leader))
|
||||||
return 0;
|
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)
|
if (event->attr.aux_sample_size && !group_leader->pmu->snapshot_aux)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -8019,49 +8015,6 @@ void perf_prepare_header(struct perf_event_header *header,
|
|||||||
WARN_ON_ONCE(header->size & 7);
|
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
|
static __always_inline int
|
||||||
__perf_event_output(struct perf_event *event,
|
__perf_event_output(struct perf_event *event,
|
||||||
struct perf_sample_data *data,
|
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);
|
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 &&
|
if (event->prog && event->prog->type == BPF_PROG_TYPE_PERF_EVENT &&
|
||||||
!bpf_overflow_handler(event, data, regs))
|
!bpf_overflow_handler(event, data, regs))
|
||||||
goto out;
|
return ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX event_limit might not quite work as expected on inherited
|
* 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;
|
event->pending_wakeup = 1;
|
||||||
irq_work_queue(&event->pending_irq);
|
irq_work_queue(&event->pending_irq);
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
if (event->attr.aux_resume)
|
|
||||||
perf_event_aux_pause(event->aux_event, false);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -12351,25 +12298,11 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (event->attr.aux_output &&
|
if (event->attr.aux_output &&
|
||||||
(!(pmu->capabilities & PERF_PMU_CAP_AUX_OUTPUT) ||
|
!(pmu->capabilities & PERF_PMU_CAP_AUX_OUTPUT)) {
|
||||||
event->attr.aux_pause || event->attr.aux_resume)) {
|
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
goto err_pmu;
|
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) {
|
if (cgroup_fd != -1) {
|
||||||
err = perf_cgroup_connect(cgroup_fd, event, attr, group_leader);
|
err = perf_cgroup_connect(cgroup_fd, event, attr, group_leader);
|
||||||
if (err)
|
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',
|
* Grouping is not supported for kernel events, neither is 'AUX',
|
||||||
* make sure the caller's intentions are adjusted.
|
* make sure the caller's intentions are adjusted.
|
||||||
*/
|
*/
|
||||||
if (attr->aux_output || attr->aux_action)
|
if (attr->aux_output)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
event = perf_event_alloc(attr, cpu, task, NULL, NULL,
|
event = perf_event_alloc(attr, cpu, task, NULL, NULL,
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ struct perf_buffer {
|
|||||||
void (*free_aux)(void *);
|
void (*free_aux)(void *);
|
||||||
refcount_t aux_refcount;
|
refcount_t aux_refcount;
|
||||||
int aux_in_sampling;
|
int aux_in_sampling;
|
||||||
int aux_in_pause_resume;
|
|
||||||
void **aux_pages;
|
void **aux_pages;
|
||||||
void *aux_priv;
|
void *aux_priv;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user