diff options
Diffstat (limited to 'drivers/oprofile/oprof.c')
-rw-r--r-- | drivers/oprofile/oprof.c | 100 |
1 files changed, 49 insertions, 51 deletions
diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index fa6cccd87cf8..a48294a8ebe8 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c | |||
@@ -29,13 +29,6 @@ unsigned long oprofile_backtrace_depth; | |||
29 | static unsigned long is_setup; | 29 | static unsigned long is_setup; |
30 | static DEFINE_MUTEX(start_mutex); | 30 | static DEFINE_MUTEX(start_mutex); |
31 | 31 | ||
32 | #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX | ||
33 | |||
34 | static void switch_worker(struct work_struct *work); | ||
35 | static DECLARE_DELAYED_WORK(switch_work, switch_worker); | ||
36 | |||
37 | #endif | ||
38 | |||
39 | /* timer | 32 | /* timer |
40 | 0 - use performance monitoring hardware if available | 33 | 0 - use performance monitoring hardware if available |
41 | 1 - use the timer int mechanism regardless | 34 | 1 - use the timer int mechanism regardless |
@@ -98,9 +91,18 @@ out: | |||
98 | 91 | ||
99 | #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX | 92 | #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX |
100 | 93 | ||
94 | static void switch_worker(struct work_struct *work); | ||
95 | static DECLARE_DELAYED_WORK(switch_work, switch_worker); | ||
96 | |||
101 | static void start_switch_worker(void) | 97 | static void start_switch_worker(void) |
102 | { | 98 | { |
103 | schedule_delayed_work(&switch_work, oprofile_time_slice); | 99 | if (oprofile_ops.switch_events) |
100 | schedule_delayed_work(&switch_work, oprofile_time_slice); | ||
101 | } | ||
102 | |||
103 | static void stop_switch_worker(void) | ||
104 | { | ||
105 | cancel_delayed_work_sync(&switch_work); | ||
104 | } | 106 | } |
105 | 107 | ||
106 | static void switch_worker(struct work_struct *work) | 108 | static void switch_worker(struct work_struct *work) |
@@ -109,6 +111,43 @@ static void switch_worker(struct work_struct *work) | |||
109 | start_switch_worker(); | 111 | start_switch_worker(); |
110 | } | 112 | } |
111 | 113 | ||
114 | /* User inputs in ms, converts to jiffies */ | ||
115 | int oprofile_set_timeout(unsigned long val_msec) | ||
116 | { | ||
117 | int err = 0; | ||
118 | unsigned long time_slice; | ||
119 | |||
120 | mutex_lock(&start_mutex); | ||
121 | |||
122 | if (oprofile_started) { | ||
123 | err = -EBUSY; | ||
124 | goto out; | ||
125 | } | ||
126 | |||
127 | if (!oprofile_ops.switch_events) { | ||
128 | err = -EINVAL; | ||
129 | goto out; | ||
130 | } | ||
131 | |||
132 | time_slice = msecs_to_jiffies(val_msec); | ||
133 | if (time_slice == MAX_JIFFY_OFFSET) { | ||
134 | err = -EINVAL; | ||
135 | goto out; | ||
136 | } | ||
137 | |||
138 | oprofile_time_slice = time_slice; | ||
139 | |||
140 | out: | ||
141 | mutex_unlock(&start_mutex); | ||
142 | return err; | ||
143 | |||
144 | } | ||
145 | |||
146 | #else | ||
147 | |||
148 | static inline void start_switch_worker(void) { } | ||
149 | static inline void stop_switch_worker(void) { } | ||
150 | |||
112 | #endif | 151 | #endif |
113 | 152 | ||
114 | /* Actually start profiling (echo 1>/dev/oprofile/enable) */ | 153 | /* Actually start profiling (echo 1>/dev/oprofile/enable) */ |
@@ -131,10 +170,7 @@ int oprofile_start(void) | |||
131 | if ((err = oprofile_ops.start())) | 170 | if ((err = oprofile_ops.start())) |
132 | goto out; | 171 | goto out; |
133 | 172 | ||
134 | #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX | 173 | start_switch_worker(); |
135 | if (oprofile_ops.switch_events) | ||
136 | start_switch_worker(); | ||
137 | #endif | ||
138 | 174 | ||
139 | oprofile_started = 1; | 175 | oprofile_started = 1; |
140 | out: | 176 | out: |
@@ -152,9 +188,7 @@ void oprofile_stop(void) | |||
152 | oprofile_ops.stop(); | 188 | oprofile_ops.stop(); |
153 | oprofile_started = 0; | 189 | oprofile_started = 0; |
154 | 190 | ||
155 | #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX | 191 | stop_switch_worker(); |
156 | cancel_delayed_work_sync(&switch_work); | ||
157 | #endif | ||
158 | 192 | ||
159 | /* wake up the daemon to read what remains */ | 193 | /* wake up the daemon to read what remains */ |
160 | wake_up_buffer_waiter(); | 194 | wake_up_buffer_waiter(); |
@@ -188,42 +222,6 @@ post_sync: | |||
188 | mutex_unlock(&start_mutex); | 222 | mutex_unlock(&start_mutex); |
189 | } | 223 | } |
190 | 224 | ||
191 | #ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX | ||
192 | |||
193 | /* User inputs in ms, converts to jiffies */ | ||
194 | int oprofile_set_timeout(unsigned long val_msec) | ||
195 | { | ||
196 | int err = 0; | ||
197 | unsigned long time_slice; | ||
198 | |||
199 | mutex_lock(&start_mutex); | ||
200 | |||
201 | if (oprofile_started) { | ||
202 | err = -EBUSY; | ||
203 | goto out; | ||
204 | } | ||
205 | |||
206 | if (!oprofile_ops.switch_events) { | ||
207 | err = -EINVAL; | ||
208 | goto out; | ||
209 | } | ||
210 | |||
211 | time_slice = msecs_to_jiffies(val_msec); | ||
212 | if (time_slice == MAX_JIFFY_OFFSET) { | ||
213 | err = -EINVAL; | ||
214 | goto out; | ||
215 | } | ||
216 | |||
217 | oprofile_time_slice = time_slice; | ||
218 | |||
219 | out: | ||
220 | mutex_unlock(&start_mutex); | ||
221 | return err; | ||
222 | |||
223 | } | ||
224 | |||
225 | #endif | ||
226 | |||
227 | int oprofile_set_backtrace(unsigned long val) | 225 | int oprofile_set_backtrace(unsigned long val) |
228 | { | 226 | { |
229 | int err = 0; | 227 | int err = 0; |