diff options
Diffstat (limited to 'drivers/oprofile')
| -rw-r--r-- | drivers/oprofile/buffer_sync.c | 22 | ||||
| -rw-r--r-- | drivers/oprofile/buffer_sync.h | 4 | ||||
| -rw-r--r-- | drivers/oprofile/oprof.c | 9 |
3 files changed, 30 insertions, 5 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 9da5a4b81133..c3ea5fa7d05a 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
| @@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | static LIST_HEAD(dying_tasks); | 39 | static LIST_HEAD(dying_tasks); |
| 40 | static LIST_HEAD(dead_tasks); | 40 | static LIST_HEAD(dead_tasks); |
| 41 | static cpumask_t marked_cpus = CPU_MASK_NONE; | 41 | static cpumask_var_t marked_cpus; |
| 42 | static DEFINE_SPINLOCK(task_mortuary); | 42 | static DEFINE_SPINLOCK(task_mortuary); |
| 43 | static void process_task_mortuary(void); | 43 | static void process_task_mortuary(void); |
| 44 | 44 | ||
| @@ -456,10 +456,10 @@ static void mark_done(int cpu) | |||
| 456 | { | 456 | { |
| 457 | int i; | 457 | int i; |
| 458 | 458 | ||
| 459 | cpu_set(cpu, marked_cpus); | 459 | cpumask_set_cpu(cpu, marked_cpus); |
| 460 | 460 | ||
| 461 | for_each_online_cpu(i) { | 461 | for_each_online_cpu(i) { |
| 462 | if (!cpu_isset(i, marked_cpus)) | 462 | if (!cpumask_test_cpu(i, marked_cpus)) |
| 463 | return; | 463 | return; |
| 464 | } | 464 | } |
| 465 | 465 | ||
| @@ -468,7 +468,7 @@ static void mark_done(int cpu) | |||
| 468 | */ | 468 | */ |
| 469 | process_task_mortuary(); | 469 | process_task_mortuary(); |
| 470 | 470 | ||
| 471 | cpus_clear(marked_cpus); | 471 | cpumask_clear(marked_cpus); |
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | 474 | ||
| @@ -565,6 +565,20 @@ void sync_buffer(int cpu) | |||
| 565 | mutex_unlock(&buffer_mutex); | 565 | mutex_unlock(&buffer_mutex); |
| 566 | } | 566 | } |
| 567 | 567 | ||
| 568 | int __init buffer_sync_init(void) | ||
| 569 | { | ||
| 570 | if (!alloc_cpumask_var(&marked_cpus, GFP_KERNEL)) | ||
| 571 | return -ENOMEM; | ||
| 572 | |||
| 573 | cpumask_clear(marked_cpus); | ||
| 574 | return 0; | ||
| 575 | } | ||
| 576 | |||
| 577 | void __exit buffer_sync_cleanup(void) | ||
| 578 | { | ||
| 579 | free_cpumask_var(marked_cpus); | ||
| 580 | } | ||
| 581 | |||
| 568 | /* The function can be used to add a buffer worth of data directly to | 582 | /* The function can be used to add a buffer worth of data directly to |
| 569 | * the kernel buffer. The buffer is assumed to be a circular buffer. | 583 | * the kernel buffer. The buffer is assumed to be a circular buffer. |
| 570 | * Take the entries from index start and end at index end, wrapping | 584 | * Take the entries from index start and end at index end, wrapping |
diff --git a/drivers/oprofile/buffer_sync.h b/drivers/oprofile/buffer_sync.h index 3110732c1835..0ebf5db62679 100644 --- a/drivers/oprofile/buffer_sync.h +++ b/drivers/oprofile/buffer_sync.h | |||
| @@ -19,4 +19,8 @@ void sync_stop(void); | |||
| 19 | /* sync the given CPU's buffer */ | 19 | /* sync the given CPU's buffer */ |
| 20 | void sync_buffer(int cpu); | 20 | void sync_buffer(int cpu); |
| 21 | 21 | ||
| 22 | /* initialize/destroy the buffer system. */ | ||
| 23 | int buffer_sync_init(void); | ||
| 24 | void buffer_sync_cleanup(void); | ||
| 25 | |||
| 22 | #endif /* OPROFILE_BUFFER_SYNC_H */ | 26 | #endif /* OPROFILE_BUFFER_SYNC_H */ |
diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index 3cffce90f82a..ced39f602292 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c | |||
| @@ -183,6 +183,10 @@ static int __init oprofile_init(void) | |||
| 183 | { | 183 | { |
| 184 | int err; | 184 | int err; |
| 185 | 185 | ||
| 186 | err = buffer_sync_init(); | ||
| 187 | if (err) | ||
| 188 | return err; | ||
| 189 | |||
| 186 | err = oprofile_arch_init(&oprofile_ops); | 190 | err = oprofile_arch_init(&oprofile_ops); |
| 187 | 191 | ||
| 188 | if (err < 0 || timer) { | 192 | if (err < 0 || timer) { |
| @@ -191,8 +195,10 @@ static int __init oprofile_init(void) | |||
| 191 | } | 195 | } |
| 192 | 196 | ||
| 193 | err = oprofilefs_register(); | 197 | err = oprofilefs_register(); |
| 194 | if (err) | 198 | if (err) { |
| 195 | oprofile_arch_exit(); | 199 | oprofile_arch_exit(); |
| 200 | buffer_sync_cleanup(); | ||
| 201 | } | ||
| 196 | 202 | ||
| 197 | return err; | 203 | return err; |
| 198 | } | 204 | } |
| @@ -202,6 +208,7 @@ static void __exit oprofile_exit(void) | |||
| 202 | { | 208 | { |
| 203 | oprofilefs_unregister(); | 209 | oprofilefs_unregister(); |
| 204 | oprofile_arch_exit(); | 210 | oprofile_arch_exit(); |
| 211 | buffer_sync_cleanup(); | ||
| 205 | } | 212 | } |
| 206 | 213 | ||
| 207 | 214 | ||
