diff options
Diffstat (limited to 'drivers/oprofile')
-rw-r--r-- | drivers/oprofile/buffer_sync.c | 2 | ||||
-rw-r--r-- | drivers/oprofile/cpu_buffer.c | 10 | ||||
-rw-r--r-- | drivers/oprofile/cpu_buffer.h | 1 | ||||
-rw-r--r-- | drivers/oprofile/timer_int.c | 13 |
4 files changed, 22 insertions, 4 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index b7e755f4178a..a3984f4ef192 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
@@ -190,7 +190,7 @@ void sync_stop(void) | |||
190 | profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb); | 190 | profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb); |
191 | task_handoff_unregister(&task_free_nb); | 191 | task_handoff_unregister(&task_free_nb); |
192 | mutex_unlock(&buffer_mutex); | 192 | mutex_unlock(&buffer_mutex); |
193 | flush_scheduled_work(); | 193 | flush_cpu_work(); |
194 | 194 | ||
195 | /* make sure we don't leak task structs */ | 195 | /* make sure we don't leak task structs */ |
196 | process_task_mortuary(); | 196 | process_task_mortuary(); |
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index f179ac2ea801..59f55441e075 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
@@ -111,14 +111,18 @@ void start_cpu_work(void) | |||
111 | 111 | ||
112 | void end_cpu_work(void) | 112 | void end_cpu_work(void) |
113 | { | 113 | { |
114 | int i; | ||
115 | |||
116 | work_enabled = 0; | 114 | work_enabled = 0; |
115 | } | ||
116 | |||
117 | void flush_cpu_work(void) | ||
118 | { | ||
119 | int i; | ||
117 | 120 | ||
118 | for_each_online_cpu(i) { | 121 | for_each_online_cpu(i) { |
119 | struct oprofile_cpu_buffer *b = &per_cpu(op_cpu_buffer, i); | 122 | struct oprofile_cpu_buffer *b = &per_cpu(op_cpu_buffer, i); |
120 | 123 | ||
121 | cancel_delayed_work(&b->work); | 124 | /* these works are per-cpu, no need for flush_sync */ |
125 | flush_delayed_work(&b->work); | ||
122 | } | 126 | } |
123 | } | 127 | } |
124 | 128 | ||
diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index 68ea16ab645f..e1d097e250ae 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h | |||
@@ -25,6 +25,7 @@ void free_cpu_buffers(void); | |||
25 | 25 | ||
26 | void start_cpu_work(void); | 26 | void start_cpu_work(void); |
27 | void end_cpu_work(void); | 27 | void end_cpu_work(void); |
28 | void flush_cpu_work(void); | ||
28 | 29 | ||
29 | /* CPU buffer is composed of such entries (which are | 30 | /* CPU buffer is composed of such entries (which are |
30 | * also used for context switch notes) | 31 | * also used for context switch notes) |
diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c index dc0ae4d14dff..010725117dbb 100644 --- a/drivers/oprofile/timer_int.c +++ b/drivers/oprofile/timer_int.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include "oprof.h" | 21 | #include "oprof.h" |
22 | 22 | ||
23 | static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer); | 23 | static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer); |
24 | static int ctr_running; | ||
24 | 25 | ||
25 | static enum hrtimer_restart oprofile_hrtimer_notify(struct hrtimer *hrtimer) | 26 | static enum hrtimer_restart oprofile_hrtimer_notify(struct hrtimer *hrtimer) |
26 | { | 27 | { |
@@ -33,6 +34,9 @@ static void __oprofile_hrtimer_start(void *unused) | |||
33 | { | 34 | { |
34 | struct hrtimer *hrtimer = &__get_cpu_var(oprofile_hrtimer); | 35 | struct hrtimer *hrtimer = &__get_cpu_var(oprofile_hrtimer); |
35 | 36 | ||
37 | if (!ctr_running) | ||
38 | return; | ||
39 | |||
36 | hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 40 | hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
37 | hrtimer->function = oprofile_hrtimer_notify; | 41 | hrtimer->function = oprofile_hrtimer_notify; |
38 | 42 | ||
@@ -42,7 +46,10 @@ static void __oprofile_hrtimer_start(void *unused) | |||
42 | 46 | ||
43 | static int oprofile_hrtimer_start(void) | 47 | static int oprofile_hrtimer_start(void) |
44 | { | 48 | { |
49 | get_online_cpus(); | ||
50 | ctr_running = 1; | ||
45 | on_each_cpu(__oprofile_hrtimer_start, NULL, 1); | 51 | on_each_cpu(__oprofile_hrtimer_start, NULL, 1); |
52 | put_online_cpus(); | ||
46 | return 0; | 53 | return 0; |
47 | } | 54 | } |
48 | 55 | ||
@@ -50,6 +57,9 @@ static void __oprofile_hrtimer_stop(int cpu) | |||
50 | { | 57 | { |
51 | struct hrtimer *hrtimer = &per_cpu(oprofile_hrtimer, cpu); | 58 | struct hrtimer *hrtimer = &per_cpu(oprofile_hrtimer, cpu); |
52 | 59 | ||
60 | if (!ctr_running) | ||
61 | return; | ||
62 | |||
53 | hrtimer_cancel(hrtimer); | 63 | hrtimer_cancel(hrtimer); |
54 | } | 64 | } |
55 | 65 | ||
@@ -57,8 +67,11 @@ static void oprofile_hrtimer_stop(void) | |||
57 | { | 67 | { |
58 | int cpu; | 68 | int cpu; |
59 | 69 | ||
70 | get_online_cpus(); | ||
60 | for_each_online_cpu(cpu) | 71 | for_each_online_cpu(cpu) |
61 | __oprofile_hrtimer_stop(cpu); | 72 | __oprofile_hrtimer_stop(cpu); |
73 | ctr_running = 0; | ||
74 | put_online_cpus(); | ||
62 | } | 75 | } |
63 | 76 | ||
64 | static int __cpuinit oprofile_cpu_notify(struct notifier_block *self, | 77 | static int __cpuinit oprofile_cpu_notify(struct notifier_block *self, |