diff options
Diffstat (limited to 'drivers/oprofile/cpu_buffer.c')
-rw-r--r-- | drivers/oprofile/cpu_buffer.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index f179ac2ea801..b8ef8ddcc292 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
@@ -111,14 +111,18 @@ void start_cpu_work(void) | |||
111 | 111 | ||
112 | void end_cpu_work(void) | 112 | void end_cpu_work(void) |
113 | { | 113 | { |
114 | int i; | ||
115 | |||
116 | work_enabled = 0; | 114 | work_enabled = 0; |
115 | } | ||
116 | |||
117 | void flush_cpu_work(void) | ||
118 | { | ||
119 | int i; | ||
117 | 120 | ||
118 | for_each_online_cpu(i) { | 121 | for_each_online_cpu(i) { |
119 | struct oprofile_cpu_buffer *b = &per_cpu(op_cpu_buffer, i); | 122 | struct oprofile_cpu_buffer *b = &per_cpu(op_cpu_buffer, i); |
120 | 123 | ||
121 | cancel_delayed_work(&b->work); | 124 | /* these works are per-cpu, no need for flush_sync */ |
125 | flush_delayed_work(&b->work); | ||
122 | } | 126 | } |
123 | } | 127 | } |
124 | 128 | ||
@@ -254,8 +258,10 @@ op_add_sample(struct oprofile_cpu_buffer *cpu_buf, | |||
254 | */ | 258 | */ |
255 | static int | 259 | static int |
256 | log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, | 260 | log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, |
257 | unsigned long backtrace, int is_kernel, unsigned long event) | 261 | unsigned long backtrace, int is_kernel, unsigned long event, |
262 | struct task_struct *task) | ||
258 | { | 263 | { |
264 | struct task_struct *tsk = task ? task : current; | ||
259 | cpu_buf->sample_received++; | 265 | cpu_buf->sample_received++; |
260 | 266 | ||
261 | if (pc == ESCAPE_CODE) { | 267 | if (pc == ESCAPE_CODE) { |
@@ -263,7 +269,7 @@ log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, | |||
263 | return 0; | 269 | return 0; |
264 | } | 270 | } |
265 | 271 | ||
266 | if (op_add_code(cpu_buf, backtrace, is_kernel, current)) | 272 | if (op_add_code(cpu_buf, backtrace, is_kernel, tsk)) |
267 | goto fail; | 273 | goto fail; |
268 | 274 | ||
269 | if (op_add_sample(cpu_buf, pc, event)) | 275 | if (op_add_sample(cpu_buf, pc, event)) |
@@ -288,7 +294,8 @@ static inline void oprofile_end_trace(struct oprofile_cpu_buffer *cpu_buf) | |||
288 | 294 | ||
289 | static inline void | 295 | static inline void |
290 | __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | 296 | __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, |
291 | unsigned long event, int is_kernel) | 297 | unsigned long event, int is_kernel, |
298 | struct task_struct *task) | ||
292 | { | 299 | { |
293 | struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer); | 300 | struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer); |
294 | unsigned long backtrace = oprofile_backtrace_depth; | 301 | unsigned long backtrace = oprofile_backtrace_depth; |
@@ -297,7 +304,7 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | |||
297 | * if log_sample() fail we can't backtrace since we lost the | 304 | * if log_sample() fail we can't backtrace since we lost the |
298 | * source of this event | 305 | * source of this event |
299 | */ | 306 | */ |
300 | if (!log_sample(cpu_buf, pc, backtrace, is_kernel, event)) | 307 | if (!log_sample(cpu_buf, pc, backtrace, is_kernel, event, task)) |
301 | /* failed */ | 308 | /* failed */ |
302 | return; | 309 | return; |
303 | 310 | ||
@@ -309,10 +316,17 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | |||
309 | oprofile_end_trace(cpu_buf); | 316 | oprofile_end_trace(cpu_buf); |
310 | } | 317 | } |
311 | 318 | ||
319 | void oprofile_add_ext_hw_sample(unsigned long pc, struct pt_regs * const regs, | ||
320 | unsigned long event, int is_kernel, | ||
321 | struct task_struct *task) | ||
322 | { | ||
323 | __oprofile_add_ext_sample(pc, regs, event, is_kernel, task); | ||
324 | } | ||
325 | |||
312 | void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | 326 | void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, |
313 | unsigned long event, int is_kernel) | 327 | unsigned long event, int is_kernel) |
314 | { | 328 | { |
315 | __oprofile_add_ext_sample(pc, regs, event, is_kernel); | 329 | __oprofile_add_ext_sample(pc, regs, event, is_kernel, NULL); |
316 | } | 330 | } |
317 | 331 | ||
318 | void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) | 332 | void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) |
@@ -328,7 +342,7 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) | |||
328 | pc = ESCAPE_CODE; /* as this causes an early return. */ | 342 | pc = ESCAPE_CODE; /* as this causes an early return. */ |
329 | } | 343 | } |
330 | 344 | ||
331 | __oprofile_add_ext_sample(pc, regs, event, is_kernel); | 345 | __oprofile_add_ext_sample(pc, regs, event, is_kernel, NULL); |
332 | } | 346 | } |
333 | 347 | ||
334 | /* | 348 | /* |
@@ -399,7 +413,7 @@ int oprofile_write_commit(struct op_entry *entry) | |||
399 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event) | 413 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event) |
400 | { | 414 | { |
401 | struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer); | 415 | struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer); |
402 | log_sample(cpu_buf, pc, 0, is_kernel, event); | 416 | log_sample(cpu_buf, pc, 0, is_kernel, event, NULL); |
403 | } | 417 | } |
404 | 418 | ||
405 | void oprofile_add_trace(unsigned long pc) | 419 | void oprofile_add_trace(unsigned long pc) |