diff options
-rw-r--r-- | drivers/oprofile/cpu_buffer.c | 24 | ||||
-rw-r--r-- | include/linux/oprofile.h | 7 |
2 files changed, 24 insertions, 7 deletions
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index 59f55441e075..b8ef8ddcc292 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
@@ -258,8 +258,10 @@ op_add_sample(struct oprofile_cpu_buffer *cpu_buf, | |||
258 | */ | 258 | */ |
259 | static int | 259 | static int |
260 | log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, | 260 | log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, |
261 | unsigned long backtrace, int is_kernel, unsigned long event) | 261 | unsigned long backtrace, int is_kernel, unsigned long event, |
262 | struct task_struct *task) | ||
262 | { | 263 | { |
264 | struct task_struct *tsk = task ? task : current; | ||
263 | cpu_buf->sample_received++; | 265 | cpu_buf->sample_received++; |
264 | 266 | ||
265 | if (pc == ESCAPE_CODE) { | 267 | if (pc == ESCAPE_CODE) { |
@@ -267,7 +269,7 @@ log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, | |||
267 | return 0; | 269 | return 0; |
268 | } | 270 | } |
269 | 271 | ||
270 | if (op_add_code(cpu_buf, backtrace, is_kernel, current)) | 272 | if (op_add_code(cpu_buf, backtrace, is_kernel, tsk)) |
271 | goto fail; | 273 | goto fail; |
272 | 274 | ||
273 | if (op_add_sample(cpu_buf, pc, event)) | 275 | if (op_add_sample(cpu_buf, pc, event)) |
@@ -292,7 +294,8 @@ static inline void oprofile_end_trace(struct oprofile_cpu_buffer *cpu_buf) | |||
292 | 294 | ||
293 | static inline void | 295 | static inline void |
294 | __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, |
295 | unsigned long event, int is_kernel) | 297 | unsigned long event, int is_kernel, |
298 | struct task_struct *task) | ||
296 | { | 299 | { |
297 | 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); |
298 | unsigned long backtrace = oprofile_backtrace_depth; | 301 | unsigned long backtrace = oprofile_backtrace_depth; |
@@ -301,7 +304,7 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | |||
301 | * 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 |
302 | * source of this event | 305 | * source of this event |
303 | */ | 306 | */ |
304 | if (!log_sample(cpu_buf, pc, backtrace, is_kernel, event)) | 307 | if (!log_sample(cpu_buf, pc, backtrace, is_kernel, event, task)) |
305 | /* failed */ | 308 | /* failed */ |
306 | return; | 309 | return; |
307 | 310 | ||
@@ -313,10 +316,17 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | |||
313 | oprofile_end_trace(cpu_buf); | 316 | oprofile_end_trace(cpu_buf); |
314 | } | 317 | } |
315 | 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 | |||
316 | 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, |
317 | unsigned long event, int is_kernel) | 327 | unsigned long event, int is_kernel) |
318 | { | 328 | { |
319 | __oprofile_add_ext_sample(pc, regs, event, is_kernel); | 329 | __oprofile_add_ext_sample(pc, regs, event, is_kernel, NULL); |
320 | } | 330 | } |
321 | 331 | ||
322 | 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) |
@@ -332,7 +342,7 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) | |||
332 | pc = ESCAPE_CODE; /* as this causes an early return. */ | 342 | pc = ESCAPE_CODE; /* as this causes an early return. */ |
333 | } | 343 | } |
334 | 344 | ||
335 | __oprofile_add_ext_sample(pc, regs, event, is_kernel); | 345 | __oprofile_add_ext_sample(pc, regs, event, is_kernel, NULL); |
336 | } | 346 | } |
337 | 347 | ||
338 | /* | 348 | /* |
@@ -403,7 +413,7 @@ int oprofile_write_commit(struct op_entry *entry) | |||
403 | 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) |
404 | { | 414 | { |
405 | 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); |
406 | log_sample(cpu_buf, pc, 0, is_kernel, event); | 416 | log_sample(cpu_buf, pc, 0, is_kernel, event, NULL); |
407 | } | 417 | } |
408 | 418 | ||
409 | void oprofile_add_trace(unsigned long pc) | 419 | void oprofile_add_trace(unsigned long pc) |
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h index 1ca64113efe8..7f5cfd3b37dd 100644 --- a/include/linux/oprofile.h +++ b/include/linux/oprofile.h | |||
@@ -106,6 +106,13 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); | |||
106 | void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | 106 | void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, |
107 | unsigned long event, int is_kernel); | 107 | unsigned long event, int is_kernel); |
108 | 108 | ||
109 | /** | ||
110 | * Add an hardware sample. | ||
111 | */ | ||
112 | void oprofile_add_ext_hw_sample(unsigned long pc, struct pt_regs * const regs, | ||
113 | unsigned long event, int is_kernel, | ||
114 | struct task_struct *task); | ||
115 | |||
109 | /* Use this instead when the PC value is not from the regs. Doesn't | 116 | /* Use this instead when the PC value is not from the regs. Doesn't |
110 | * backtrace. */ | 117 | * backtrace. */ |
111 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); | 118 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); |