diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-01 02:55:20 -0500 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-01 02:55:20 -0500 | 
| commit | 35858adbfca13678af99fb31618ef4428d6dedb0 (patch) | |
| tree | 3336feaa61324486945816cb52c347733e7c0821 /kernel/hw_breakpoint.c | |
| parent | 197d4db752e67160d79fed09968c2140376a80a3 (diff) | |
| parent | 4b70858ba8d4537daf782defebe5f2ff80ccef2b (diff) | |
Merge branch 'next' into for-linus
Diffstat (limited to 'kernel/hw_breakpoint.c')
| -rw-r--r-- | kernel/hw_breakpoint.c | 14 | 
1 files changed, 9 insertions, 5 deletions
| diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c index 366eedf949c0..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> | 
| @@ -96,7 +97,7 @@ static int task_bp_pinned(struct task_struct *tsk) | |||
| 96 | 97 | ||
| 97 | list = &ctx->event_list; | 98 | list = &ctx->event_list; | 
| 98 | 99 | ||
| 99 | spin_lock_irqsave(&ctx->lock, flags); | 100 | raw_spin_lock_irqsave(&ctx->lock, flags); | 
| 100 | 101 | ||
| 101 | /* | 102 | /* | 
| 102 | * The current breakpoint counter is not included in the list | 103 | * The current breakpoint counter is not included in the list | 
| @@ -107,7 +108,7 @@ static int task_bp_pinned(struct task_struct *tsk) | |||
| 107 | count++; | 108 | count++; | 
| 108 | } | 109 | } | 
| 109 | 110 | ||
| 110 | spin_unlock_irqrestore(&ctx->lock, flags); | 111 | raw_spin_unlock_irqrestore(&ctx->lock, flags); | 
| 111 | 112 | ||
| 112 | return count; | 113 | return count; | 
| 113 | } | 114 | } | 
| @@ -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); | 
