diff options
-rw-r--r-- | arch/arm/oprofile/common.c | 2 | ||||
-rw-r--r-- | include/linux/perf_event.h | 2 | ||||
-rw-r--r-- | kernel/hw_breakpoint.c | 5 | ||||
-rw-r--r-- | kernel/perf_event.c | 21 | ||||
-rw-r--r-- | kernel/watchdog.c | 2 |
5 files changed, 15 insertions, 17 deletions
diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index 0691176899ff..aad63e611b36 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c | |||
@@ -96,7 +96,7 @@ static int op_create_counter(int cpu, int event) | |||
96 | return ret; | 96 | return ret; |
97 | 97 | ||
98 | pevent = perf_event_create_kernel_counter(&counter_config[event].attr, | 98 | pevent = perf_event_create_kernel_counter(&counter_config[event].attr, |
99 | cpu, -1, | 99 | cpu, NULL, |
100 | op_overflow_handler); | 100 | op_overflow_handler); |
101 | 101 | ||
102 | if (IS_ERR(pevent)) { | 102 | if (IS_ERR(pevent)) { |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 93bf53aa50e5..39d8860b2684 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -902,7 +902,7 @@ extern int perf_event_release_kernel(struct perf_event *event); | |||
902 | extern struct perf_event * | 902 | extern struct perf_event * |
903 | perf_event_create_kernel_counter(struct perf_event_attr *attr, | 903 | perf_event_create_kernel_counter(struct perf_event_attr *attr, |
904 | int cpu, | 904 | int cpu, |
905 | pid_t pid, | 905 | struct task_struct *task, |
906 | perf_overflow_handler_t callback); | 906 | perf_overflow_handler_t callback); |
907 | extern u64 perf_event_read_value(struct perf_event *event, | 907 | extern u64 perf_event_read_value(struct perf_event *event, |
908 | u64 *enabled, u64 *running); | 908 | u64 *enabled, u64 *running); |
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c index 6122f02cfedf..3b714e839c10 100644 --- a/kernel/hw_breakpoint.c +++ b/kernel/hw_breakpoint.c | |||
@@ -433,8 +433,7 @@ register_user_hw_breakpoint(struct perf_event_attr *attr, | |||
433 | perf_overflow_handler_t triggered, | 433 | perf_overflow_handler_t triggered, |
434 | struct task_struct *tsk) | 434 | struct task_struct *tsk) |
435 | { | 435 | { |
436 | return perf_event_create_kernel_counter(attr, -1, task_pid_vnr(tsk), | 436 | return perf_event_create_kernel_counter(attr, -1, tsk, triggered); |
437 | triggered); | ||
438 | } | 437 | } |
439 | EXPORT_SYMBOL_GPL(register_user_hw_breakpoint); | 438 | EXPORT_SYMBOL_GPL(register_user_hw_breakpoint); |
440 | 439 | ||
@@ -516,7 +515,7 @@ register_wide_hw_breakpoint(struct perf_event_attr *attr, | |||
516 | get_online_cpus(); | 515 | get_online_cpus(); |
517 | for_each_online_cpu(cpu) { | 516 | for_each_online_cpu(cpu) { |
518 | pevent = per_cpu_ptr(cpu_events, cpu); | 517 | pevent = per_cpu_ptr(cpu_events, cpu); |
519 | bp = perf_event_create_kernel_counter(attr, cpu, -1, triggered); | 518 | bp = perf_event_create_kernel_counter(attr, cpu, NULL, triggered); |
520 | 519 | ||
521 | *pevent = bp; | 520 | *pevent = bp; |
522 | 521 | ||
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 3f5309db72f1..86f394e15d53 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -2053,15 +2053,14 @@ errout: | |||
2053 | } | 2053 | } |
2054 | 2054 | ||
2055 | static struct perf_event_context * | 2055 | static struct perf_event_context * |
2056 | find_get_context(struct pmu *pmu, pid_t pid, int cpu) | 2056 | find_get_context(struct pmu *pmu, struct task_struct *task, int cpu) |
2057 | { | 2057 | { |
2058 | struct perf_event_context *ctx; | 2058 | struct perf_event_context *ctx; |
2059 | struct perf_cpu_context *cpuctx; | 2059 | struct perf_cpu_context *cpuctx; |
2060 | struct task_struct *task; | ||
2061 | unsigned long flags; | 2060 | unsigned long flags; |
2062 | int ctxn, err; | 2061 | int ctxn, err; |
2063 | 2062 | ||
2064 | if (pid == -1 && cpu != -1) { | 2063 | if (!task && cpu != -1) { |
2065 | /* Must be root to operate on a CPU event: */ | 2064 | /* Must be root to operate on a CPU event: */ |
2066 | if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) | 2065 | if (perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) |
2067 | return ERR_PTR(-EACCES); | 2066 | return ERR_PTR(-EACCES); |
@@ -2084,10 +2083,6 @@ find_get_context(struct pmu *pmu, pid_t pid, int cpu) | |||
2084 | return ctx; | 2083 | return ctx; |
2085 | } | 2084 | } |
2086 | 2085 | ||
2087 | task = find_lively_task_by_vpid(pid); | ||
2088 | if (IS_ERR(task)) | ||
2089 | return (void*)task; | ||
2090 | |||
2091 | err = -EINVAL; | 2086 | err = -EINVAL; |
2092 | ctxn = pmu->task_ctx_nr; | 2087 | ctxn = pmu->task_ctx_nr; |
2093 | if (ctxn < 0) | 2088 | if (ctxn < 0) |
@@ -5527,6 +5522,7 @@ SYSCALL_DEFINE5(perf_event_open, | |||
5527 | struct perf_event_context *ctx; | 5522 | struct perf_event_context *ctx; |
5528 | struct file *event_file = NULL; | 5523 | struct file *event_file = NULL; |
5529 | struct file *group_file = NULL; | 5524 | struct file *group_file = NULL; |
5525 | struct task_struct *task = NULL; | ||
5530 | struct pmu *pmu; | 5526 | struct pmu *pmu; |
5531 | int event_fd; | 5527 | int event_fd; |
5532 | int fput_needed = 0; | 5528 | int fput_needed = 0; |
@@ -5581,10 +5577,13 @@ SYSCALL_DEFINE5(perf_event_open, | |||
5581 | if ((pmu->task_ctx_nr == perf_sw_context) && group_leader) | 5577 | if ((pmu->task_ctx_nr == perf_sw_context) && group_leader) |
5582 | pmu = group_leader->pmu; | 5578 | pmu = group_leader->pmu; |
5583 | 5579 | ||
5580 | if (pid != -1) | ||
5581 | task = find_lively_task_by_vpid(pid); | ||
5582 | |||
5584 | /* | 5583 | /* |
5585 | * Get the target context (task or percpu): | 5584 | * Get the target context (task or percpu): |
5586 | */ | 5585 | */ |
5587 | ctx = find_get_context(pmu, pid, cpu); | 5586 | ctx = find_get_context(pmu, task, cpu); |
5588 | if (IS_ERR(ctx)) { | 5587 | if (IS_ERR(ctx)) { |
5589 | err = PTR_ERR(ctx); | 5588 | err = PTR_ERR(ctx); |
5590 | goto err_group_fd; | 5589 | goto err_group_fd; |
@@ -5666,11 +5665,11 @@ err_fd: | |||
5666 | * | 5665 | * |
5667 | * @attr: attributes of the counter to create | 5666 | * @attr: attributes of the counter to create |
5668 | * @cpu: cpu in which the counter is bound | 5667 | * @cpu: cpu in which the counter is bound |
5669 | * @pid: task to profile | 5668 | * @task: task to profile (NULL for percpu) |
5670 | */ | 5669 | */ |
5671 | struct perf_event * | 5670 | struct perf_event * |
5672 | perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, | 5671 | perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, |
5673 | pid_t pid, | 5672 | struct task_struct *task, |
5674 | perf_overflow_handler_t overflow_handler) | 5673 | perf_overflow_handler_t overflow_handler) |
5675 | { | 5674 | { |
5676 | struct perf_event_context *ctx; | 5675 | struct perf_event_context *ctx; |
@@ -5687,7 +5686,7 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, | |||
5687 | goto err; | 5686 | goto err; |
5688 | } | 5687 | } |
5689 | 5688 | ||
5690 | ctx = find_get_context(event->pmu, pid, cpu); | 5689 | ctx = find_get_context(event->pmu, task, cpu); |
5691 | if (IS_ERR(ctx)) { | 5690 | if (IS_ERR(ctx)) { |
5692 | err = PTR_ERR(ctx); | 5691 | err = PTR_ERR(ctx); |
5693 | goto err_free; | 5692 | goto err_free; |
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 89eadbb9cefe..dc8e16824b51 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c | |||
@@ -358,7 +358,7 @@ static int watchdog_nmi_enable(int cpu) | |||
358 | /* Try to register using hardware perf events */ | 358 | /* Try to register using hardware perf events */ |
359 | wd_attr = &wd_hw_attr; | 359 | wd_attr = &wd_hw_attr; |
360 | wd_attr->sample_period = hw_nmi_get_sample_period(); | 360 | wd_attr->sample_period = hw_nmi_get_sample_period(); |
361 | event = perf_event_create_kernel_counter(wd_attr, cpu, -1, watchdog_overflow_callback); | 361 | event = perf_event_create_kernel_counter(wd_attr, cpu, NULL, watchdog_overflow_callback); |
362 | if (!IS_ERR(event)) { | 362 | if (!IS_ERR(event)) { |
363 | printk(KERN_INFO "NMI watchdog enabled, takes one hw-pmu counter.\n"); | 363 | printk(KERN_INFO "NMI watchdog enabled, takes one hw-pmu counter.\n"); |
364 | goto out_save; | 364 | goto out_save; |