aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/oprofile/cpu_buffer.c24
-rw-r--r--include/linux/oprofile.h7
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 */
259static int 259static int
260log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, 260log_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
293static inline void 295static 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
319void 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
316void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, 326void 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
322void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) 332void 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)
403void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event) 413void 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
409void oprofile_add_trace(unsigned long pc) 419void 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);
106void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, 106void 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 */
112void 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. */
111void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); 118void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event);