diff options
| -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, |
