diff options
Diffstat (limited to 'drivers/oprofile')
-rw-r--r-- | drivers/oprofile/timer_int.c | 13 |
1 files changed, 13 insertions, 0 deletions
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, |