|
@@ -5745,7 +5745,8 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu,
|
|
struct task_struct *task,
|
|
struct task_struct *task,
|
|
struct perf_event *group_leader,
|
|
struct perf_event *group_leader,
|
|
struct perf_event *parent_event,
|
|
struct perf_event *parent_event,
|
|
- perf_overflow_handler_t overflow_handler)
|
|
|
|
|
|
+ perf_overflow_handler_t overflow_handler,
|
|
|
|
+ void *context)
|
|
{
|
|
{
|
|
struct pmu *pmu;
|
|
struct pmu *pmu;
|
|
struct perf_event *event;
|
|
struct perf_event *event;
|
|
@@ -5803,10 +5804,13 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu,
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
- if (!overflow_handler && parent_event)
|
|
|
|
|
|
+ if (!overflow_handler && parent_event) {
|
|
overflow_handler = parent_event->overflow_handler;
|
|
overflow_handler = parent_event->overflow_handler;
|
|
|
|
+ context = parent_event->overflow_handler_context;
|
|
|
|
+ }
|
|
|
|
|
|
event->overflow_handler = overflow_handler;
|
|
event->overflow_handler = overflow_handler;
|
|
|
|
+ event->overflow_handler_context = context;
|
|
|
|
|
|
if (attr->disabled)
|
|
if (attr->disabled)
|
|
event->state = PERF_EVENT_STATE_OFF;
|
|
event->state = PERF_EVENT_STATE_OFF;
|
|
@@ -6073,7 +6077,8 @@ SYSCALL_DEFINE5(perf_event_open,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- event = perf_event_alloc(&attr, cpu, task, group_leader, NULL, NULL);
|
|
|
|
|
|
+ event = perf_event_alloc(&attr, cpu, task, group_leader, NULL,
|
|
|
|
+ NULL, NULL);
|
|
if (IS_ERR(event)) {
|
|
if (IS_ERR(event)) {
|
|
err = PTR_ERR(event);
|
|
err = PTR_ERR(event);
|
|
goto err_task;
|
|
goto err_task;
|
|
@@ -6258,7 +6263,8 @@ err_fd:
|
|
struct perf_event *
|
|
struct perf_event *
|
|
perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu,
|
|
perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu,
|
|
struct task_struct *task,
|
|
struct task_struct *task,
|
|
- perf_overflow_handler_t overflow_handler)
|
|
|
|
|
|
+ perf_overflow_handler_t overflow_handler,
|
|
|
|
+ void *context)
|
|
{
|
|
{
|
|
struct perf_event_context *ctx;
|
|
struct perf_event_context *ctx;
|
|
struct perf_event *event;
|
|
struct perf_event *event;
|
|
@@ -6268,7 +6274,8 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu,
|
|
* Get the target context (task or percpu):
|
|
* Get the target context (task or percpu):
|
|
*/
|
|
*/
|
|
|
|
|
|
- event = perf_event_alloc(attr, cpu, task, NULL, NULL, overflow_handler);
|
|
|
|
|
|
+ event = perf_event_alloc(attr, cpu, task, NULL, NULL,
|
|
|
|
+ overflow_handler, context);
|
|
if (IS_ERR(event)) {
|
|
if (IS_ERR(event)) {
|
|
err = PTR_ERR(event);
|
|
err = PTR_ERR(event);
|
|
goto err;
|
|
goto err;
|
|
@@ -6552,7 +6559,7 @@ inherit_event(struct perf_event *parent_event,
|
|
parent_event->cpu,
|
|
parent_event->cpu,
|
|
child,
|
|
child,
|
|
group_leader, parent_event,
|
|
group_leader, parent_event,
|
|
- NULL);
|
|
|
|
|
|
+ NULL, NULL);
|
|
if (IS_ERR(child_event))
|
|
if (IS_ERR(child_event))
|
|
return child_event;
|
|
return child_event;
|
|
get_ctx(child_ctx);
|
|
get_ctx(child_ctx);
|
|
@@ -6579,6 +6586,8 @@ inherit_event(struct perf_event *parent_event,
|
|
|
|
|
|
child_event->ctx = child_ctx;
|
|
child_event->ctx = child_ctx;
|
|
child_event->overflow_handler = parent_event->overflow_handler;
|
|
child_event->overflow_handler = parent_event->overflow_handler;
|
|
|
|
+ child_event->overflow_handler_context
|
|
|
|
+ = parent_event->overflow_handler_context;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Precalculate sample_data sizes
|
|
* Precalculate sample_data sizes
|