aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/oprofile/timer_int.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/oprofile/timer_int.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/oprofile/timer_int.c')
-rw-r--r--drivers/oprofile/timer_int.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c
index dc0ae4d14dff..3ef44624f510 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
23static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer); 23static DEFINE_PER_CPU(struct hrtimer, oprofile_hrtimer);
24static int ctr_running;
24 25
25static enum hrtimer_restart oprofile_hrtimer_notify(struct hrtimer *hrtimer) 26static 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
43static int oprofile_hrtimer_start(void) 47static 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
64static int __cpuinit oprofile_cpu_notify(struct notifier_block *self, 77static int __cpuinit oprofile_cpu_notify(struct notifier_block *self,
@@ -84,7 +97,7 @@ static struct notifier_block __refdata oprofile_cpu_notifier = {
84 .notifier_call = oprofile_cpu_notify, 97 .notifier_call = oprofile_cpu_notify,
85}; 98};
86 99
87int __init oprofile_timer_init(struct oprofile_operations *ops) 100int oprofile_timer_init(struct oprofile_operations *ops)
88{ 101{
89 int rc; 102 int rc;
90 103
@@ -100,7 +113,7 @@ int __init oprofile_timer_init(struct oprofile_operations *ops)
100 return 0; 113 return 0;
101} 114}
102 115
103void __exit oprofile_timer_exit(void) 116void oprofile_timer_exit(void)
104{ 117{
105 unregister_hotcpu_notifier(&oprofile_cpu_notifier); 118 unregister_hotcpu_notifier(&oprofile_cpu_notifier);
106} 119}