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; |
