diff options
Diffstat (limited to 'kernel/hw_breakpoint.c')
| -rw-r--r-- | kernel/hw_breakpoint.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c index dbcbf6a33a08..50dbd5999588 100644 --- a/kernel/hw_breakpoint.c +++ b/kernel/hw_breakpoint.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <linux/percpu.h> | 40 | #include <linux/percpu.h> |
| 41 | #include <linux/sched.h> | 41 | #include <linux/sched.h> |
| 42 | #include <linux/init.h> | 42 | #include <linux/init.h> |
| 43 | #include <linux/cpu.h> | ||
| 43 | #include <linux/smp.h> | 44 | #include <linux/smp.h> |
| 44 | 45 | ||
| 45 | #include <linux/hw_breakpoint.h> | 46 | #include <linux/hw_breakpoint.h> |
| @@ -388,7 +389,8 @@ register_wide_hw_breakpoint(struct perf_event_attr *attr, | |||
| 388 | if (!cpu_events) | 389 | if (!cpu_events) |
| 389 | return ERR_PTR(-ENOMEM); | 390 | return ERR_PTR(-ENOMEM); |
| 390 | 391 | ||
| 391 | for_each_possible_cpu(cpu) { | 392 | get_online_cpus(); |
| 393 | for_each_online_cpu(cpu) { | ||
| 392 | pevent = per_cpu_ptr(cpu_events, cpu); | 394 | pevent = per_cpu_ptr(cpu_events, cpu); |
| 393 | bp = perf_event_create_kernel_counter(attr, cpu, -1, triggered); | 395 | bp = perf_event_create_kernel_counter(attr, cpu, -1, triggered); |
| 394 | 396 | ||
| @@ -399,18 +401,20 @@ register_wide_hw_breakpoint(struct perf_event_attr *attr, | |||
| 399 | goto fail; | 401 | goto fail; |
| 400 | } | 402 | } |
| 401 | } | 403 | } |
| 404 | put_online_cpus(); | ||
| 402 | 405 | ||
| 403 | return cpu_events; | 406 | return cpu_events; |
| 404 | 407 | ||
| 405 | fail: | 408 | fail: |
| 406 | for_each_possible_cpu(cpu) { | 409 | for_each_online_cpu(cpu) { |
| 407 | pevent = per_cpu_ptr(cpu_events, cpu); | 410 | pevent = per_cpu_ptr(cpu_events, cpu); |
| 408 | if (IS_ERR(*pevent)) | 411 | if (IS_ERR(*pevent)) |
| 409 | break; | 412 | break; |
| 410 | unregister_hw_breakpoint(*pevent); | 413 | unregister_hw_breakpoint(*pevent); |
| 411 | } | 414 | } |
| 415 | put_online_cpus(); | ||
| 416 | |||
| 412 | free_percpu(cpu_events); | 417 | free_percpu(cpu_events); |
| 413 | /* return the error if any */ | ||
| 414 | return ERR_PTR(err); | 418 | return ERR_PTR(err); |
| 415 | } | 419 | } |
| 416 | EXPORT_SYMBOL_GPL(register_wide_hw_breakpoint); | 420 | EXPORT_SYMBOL_GPL(register_wide_hw_breakpoint); |
