diff options
| author | Ingo Molnar <mingo@elte.hu> | 2010-09-01 16:31:07 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-09-01 16:31:07 -0400 |
| commit | b4c69d45c4c0d7480e9df183ebda62148984af25 (patch) | |
| tree | b93b7a249779fdde22bc6639ad878335afaaf4c0 | |
| parent | 68d3f1d810500e8b975bdf0b20dd83d060076b4b (diff) | |
| parent | 269f45c25028c75fe10e6d9be86e7202ab461fbc (diff) | |
Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile into perf/urgent
| -rw-r--r-- | arch/x86/oprofile/nmi_int.c | 22 | ||||
| -rw-r--r-- | drivers/oprofile/buffer_sync.c | 27 | ||||
| -rw-r--r-- | drivers/oprofile/cpu_buffer.c | 2 |
3 files changed, 31 insertions, 20 deletions
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index f6b48f6c5951..cfe4faabb0f6 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
| @@ -568,8 +568,13 @@ static int __init init_sysfs(void) | |||
| 568 | int error; | 568 | int error; |
| 569 | 569 | ||
| 570 | error = sysdev_class_register(&oprofile_sysclass); | 570 | error = sysdev_class_register(&oprofile_sysclass); |
| 571 | if (!error) | 571 | if (error) |
| 572 | error = sysdev_register(&device_oprofile); | 572 | return error; |
| 573 | |||
| 574 | error = sysdev_register(&device_oprofile); | ||
| 575 | if (error) | ||
| 576 | sysdev_class_unregister(&oprofile_sysclass); | ||
| 577 | |||
| 573 | return error; | 578 | return error; |
| 574 | } | 579 | } |
| 575 | 580 | ||
| @@ -580,8 +585,10 @@ static void exit_sysfs(void) | |||
| 580 | } | 585 | } |
| 581 | 586 | ||
| 582 | #else | 587 | #else |
| 583 | #define init_sysfs() do { } while (0) | 588 | |
| 584 | #define exit_sysfs() do { } while (0) | 589 | static inline int init_sysfs(void) { return 0; } |
| 590 | static inline void exit_sysfs(void) { } | ||
| 591 | |||
| 585 | #endif /* CONFIG_PM */ | 592 | #endif /* CONFIG_PM */ |
| 586 | 593 | ||
| 587 | static int __init p4_init(char **cpu_type) | 594 | static int __init p4_init(char **cpu_type) |
| @@ -695,6 +702,8 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
| 695 | char *cpu_type = NULL; | 702 | char *cpu_type = NULL; |
| 696 | int ret = 0; | 703 | int ret = 0; |
| 697 | 704 | ||
| 705 | using_nmi = 0; | ||
| 706 | |||
| 698 | if (!cpu_has_apic) | 707 | if (!cpu_has_apic) |
| 699 | return -ENODEV; | 708 | return -ENODEV; |
| 700 | 709 | ||
| @@ -774,7 +783,10 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
| 774 | 783 | ||
| 775 | mux_init(ops); | 784 | mux_init(ops); |
| 776 | 785 | ||
| 777 | init_sysfs(); | 786 | ret = init_sysfs(); |
| 787 | if (ret) | ||
| 788 | return ret; | ||
| 789 | |||
| 778 | using_nmi = 1; | 790 | using_nmi = 1; |
| 779 | printk(KERN_INFO "oprofile: using NMI interrupt.\n"); | 791 | printk(KERN_INFO "oprofile: using NMI interrupt.\n"); |
| 780 | return 0; | 792 | return 0; |
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index a9352b2c7ac4..b7e755f4178a 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
| @@ -141,16 +141,6 @@ static struct notifier_block module_load_nb = { | |||
| 141 | .notifier_call = module_load_notify, | 141 | .notifier_call = module_load_notify, |
| 142 | }; | 142 | }; |
| 143 | 143 | ||
| 144 | |||
| 145 | static void end_sync(void) | ||
| 146 | { | ||
| 147 | end_cpu_work(); | ||
| 148 | /* make sure we don't leak task structs */ | ||
| 149 | process_task_mortuary(); | ||
| 150 | process_task_mortuary(); | ||
| 151 | } | ||
| 152 | |||
| 153 | |||
| 154 | int sync_start(void) | 144 | int sync_start(void) |
| 155 | { | 145 | { |
| 156 | int err; | 146 | int err; |
| @@ -158,7 +148,7 @@ int sync_start(void) | |||
| 158 | if (!zalloc_cpumask_var(&marked_cpus, GFP_KERNEL)) | 148 | if (!zalloc_cpumask_var(&marked_cpus, GFP_KERNEL)) |
| 159 | return -ENOMEM; | 149 | return -ENOMEM; |
| 160 | 150 | ||
| 161 | start_cpu_work(); | 151 | mutex_lock(&buffer_mutex); |
| 162 | 152 | ||
| 163 | err = task_handoff_register(&task_free_nb); | 153 | err = task_handoff_register(&task_free_nb); |
| 164 | if (err) | 154 | if (err) |
| @@ -173,7 +163,10 @@ int sync_start(void) | |||
| 173 | if (err) | 163 | if (err) |
| 174 | goto out4; | 164 | goto out4; |
| 175 | 165 | ||
| 166 | start_cpu_work(); | ||
| 167 | |||
| 176 | out: | 168 | out: |
| 169 | mutex_unlock(&buffer_mutex); | ||
| 177 | return err; | 170 | return err; |
| 178 | out4: | 171 | out4: |
| 179 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); | 172 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); |
| @@ -182,7 +175,6 @@ out3: | |||
| 182 | out2: | 175 | out2: |
| 183 | task_handoff_unregister(&task_free_nb); | 176 | task_handoff_unregister(&task_free_nb); |
| 184 | out1: | 177 | out1: |
| 185 | end_sync(); | ||
| 186 | free_cpumask_var(marked_cpus); | 178 | free_cpumask_var(marked_cpus); |
| 187 | goto out; | 179 | goto out; |
| 188 | } | 180 | } |
| @@ -190,11 +182,20 @@ out1: | |||
| 190 | 182 | ||
| 191 | void sync_stop(void) | 183 | void sync_stop(void) |
| 192 | { | 184 | { |
| 185 | /* flush buffers */ | ||
| 186 | mutex_lock(&buffer_mutex); | ||
| 187 | end_cpu_work(); | ||
| 193 | unregister_module_notifier(&module_load_nb); | 188 | unregister_module_notifier(&module_load_nb); |
| 194 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); | 189 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); |
| 195 | profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb); | 190 | profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb); |
| 196 | task_handoff_unregister(&task_free_nb); | 191 | task_handoff_unregister(&task_free_nb); |
| 197 | end_sync(); | 192 | mutex_unlock(&buffer_mutex); |
| 193 | flush_scheduled_work(); | ||
| 194 | |||
| 195 | /* make sure we don't leak task structs */ | ||
| 196 | process_task_mortuary(); | ||
| 197 | process_task_mortuary(); | ||
| 198 | |||
| 198 | free_cpumask_var(marked_cpus); | 199 | free_cpumask_var(marked_cpus); |
| 199 | } | 200 | } |
| 200 | 201 | ||
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index 219f79e2210a..f179ac2ea801 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
| @@ -120,8 +120,6 @@ void end_cpu_work(void) | |||
| 120 | 120 | ||
| 121 | cancel_delayed_work(&b->work); | 121 | cancel_delayed_work(&b->work); |
| 122 | } | 122 | } |
| 123 | |||
| 124 | flush_scheduled_work(); | ||
| 125 | } | 123 | } |
| 126 | 124 | ||
| 127 | /* | 125 | /* |
