diff options
Diffstat (limited to 'drivers/oprofile')
-rw-r--r-- | drivers/oprofile/oprof.c | 32 | ||||
-rw-r--r-- | drivers/oprofile/oprof.h | 2 | ||||
-rw-r--r-- | drivers/oprofile/timer_int.c | 15 |
3 files changed, 46 insertions, 3 deletions
diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index f9bda64fcd1b..43b01daa91e1 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c | |||
@@ -239,6 +239,38 @@ int oprofile_set_ulong(unsigned long *addr, unsigned long val) | |||
239 | return err; | 239 | return err; |
240 | } | 240 | } |
241 | 241 | ||
242 | #ifdef CONFIG_HAVE_HWSAMPLER | ||
243 | int oprofile_set_hwsampler(unsigned long val) | ||
244 | { | ||
245 | int err = 0; | ||
246 | |||
247 | mutex_lock(&start_mutex); | ||
248 | |||
249 | if (oprofile_started) { | ||
250 | err = -EBUSY; | ||
251 | goto out; | ||
252 | } | ||
253 | |||
254 | switch (val) { | ||
255 | case 1: | ||
256 | /* Switch to hardware sampling. */ | ||
257 | __oprofile_timer_exit(); | ||
258 | err = oprofile_arch_set_hwsampler(&oprofile_ops); | ||
259 | break; | ||
260 | case 0: | ||
261 | printk(KERN_INFO "oprofile: using timer interrupt.\n"); | ||
262 | err = __oprofile_timer_init(&oprofile_ops); | ||
263 | break; | ||
264 | default: | ||
265 | err = -EINVAL; | ||
266 | } | ||
267 | |||
268 | out: | ||
269 | mutex_unlock(&start_mutex); | ||
270 | return err; | ||
271 | } | ||
272 | #endif /* CONFIG_HAVE_HWSAMPLER */ | ||
273 | |||
242 | static int __init oprofile_init(void) | 274 | static int __init oprofile_init(void) |
243 | { | 275 | { |
244 | int err; | 276 | int err; |
diff --git a/drivers/oprofile/oprof.h b/drivers/oprofile/oprof.h index 177b73de5e5f..5a6ceb1954a2 100644 --- a/drivers/oprofile/oprof.h +++ b/drivers/oprofile/oprof.h | |||
@@ -35,7 +35,9 @@ struct dentry; | |||
35 | 35 | ||
36 | void oprofile_create_files(struct super_block *sb, struct dentry *root); | 36 | void oprofile_create_files(struct super_block *sb, struct dentry *root); |
37 | int oprofile_timer_init(struct oprofile_operations *ops); | 37 | int oprofile_timer_init(struct oprofile_operations *ops); |
38 | int __oprofile_timer_init(struct oprofile_operations *ops); | ||
38 | void oprofile_timer_exit(void); | 39 | void oprofile_timer_exit(void); |
40 | void __oprofile_timer_exit(void); | ||
39 | 41 | ||
40 | int oprofile_set_ulong(unsigned long *addr, unsigned long val); | 42 | int oprofile_set_ulong(unsigned long *addr, unsigned long val); |
41 | int oprofile_set_timeout(unsigned long time); | 43 | int oprofile_set_timeout(unsigned long time); |
diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c index 010725117dbb..0099a458fd37 100644 --- a/drivers/oprofile/timer_int.c +++ b/drivers/oprofile/timer_int.c | |||
@@ -97,14 +97,13 @@ static struct notifier_block __refdata oprofile_cpu_notifier = { | |||
97 | .notifier_call = oprofile_cpu_notify, | 97 | .notifier_call = oprofile_cpu_notify, |
98 | }; | 98 | }; |
99 | 99 | ||
100 | int __init oprofile_timer_init(struct oprofile_operations *ops) | 100 | int __oprofile_timer_init(struct oprofile_operations *ops) |
101 | { | 101 | { |
102 | int rc; | 102 | int rc; |
103 | 103 | ||
104 | rc = register_hotcpu_notifier(&oprofile_cpu_notifier); | 104 | rc = register_hotcpu_notifier(&oprofile_cpu_notifier); |
105 | if (rc) | 105 | if (rc) |
106 | return rc; | 106 | return rc; |
107 | ops->create_files = NULL; | ||
108 | ops->setup = NULL; | 107 | ops->setup = NULL; |
109 | ops->shutdown = NULL; | 108 | ops->shutdown = NULL; |
110 | ops->start = oprofile_hrtimer_start; | 109 | ops->start = oprofile_hrtimer_start; |
@@ -113,7 +112,17 @@ int __init oprofile_timer_init(struct oprofile_operations *ops) | |||
113 | return 0; | 112 | return 0; |
114 | } | 113 | } |
115 | 114 | ||
116 | void __exit oprofile_timer_exit(void) | 115 | int __init oprofile_timer_init(struct oprofile_operations *ops) |
116 | { | ||
117 | return __oprofile_timer_init(ops); | ||
118 | } | ||
119 | |||
120 | void __oprofile_timer_exit(void) | ||
117 | { | 121 | { |
118 | unregister_hotcpu_notifier(&oprofile_cpu_notifier); | 122 | unregister_hotcpu_notifier(&oprofile_cpu_notifier); |
119 | } | 123 | } |
124 | |||
125 | void __exit oprofile_timer_exit(void) | ||
126 | { | ||
127 | __oprofile_timer_exit(); | ||
128 | } | ||