oprofile: Introduce new oprofile sample add function (oprofile_add_ext_hw_sample)
This patch introduces a new oprofile sample add function (oprofile_add_ext_hw_sample) that can also take task_struct as an argument, which is used by the hwsampler kernel module when copying hardware samples to OProfile buffers. Applied with following changes: * removed #include <linux/module.h> * whitespace changes * removed conditional compilation (CONFIG_HAVE_HWSAMPLER) * modified order of functions * fix missing function definition in header file Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> Signed-off-by: Maran Pakkirisamy <maranp@linux.vnet.ibm.com> Signed-off-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Robert Richter <robert.richter@amd.com>
This commit is contained in:
parent
d14dd7e20d
commit
54ebbe7ba5
2 changed files with 24 additions and 7 deletions
|
@ -258,8 +258,10 @@ op_add_sample(struct oprofile_cpu_buffer *cpu_buf,
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc,
|
log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc,
|
||||||
unsigned long backtrace, int is_kernel, unsigned long event)
|
unsigned long backtrace, int is_kernel, unsigned long event,
|
||||||
|
struct task_struct *task)
|
||||||
{
|
{
|
||||||
|
struct task_struct *tsk = task ? task : current;
|
||||||
cpu_buf->sample_received++;
|
cpu_buf->sample_received++;
|
||||||
|
|
||||||
if (pc == ESCAPE_CODE) {
|
if (pc == ESCAPE_CODE) {
|
||||||
|
@ -267,7 +269,7 @@ log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op_add_code(cpu_buf, backtrace, is_kernel, current))
|
if (op_add_code(cpu_buf, backtrace, is_kernel, tsk))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (op_add_sample(cpu_buf, pc, event))
|
if (op_add_sample(cpu_buf, pc, event))
|
||||||
|
@ -292,7 +294,8 @@ static inline void oprofile_end_trace(struct oprofile_cpu_buffer *cpu_buf)
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
__oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
__oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
||||||
unsigned long event, int is_kernel)
|
unsigned long event, int is_kernel,
|
||||||
|
struct task_struct *task)
|
||||||
{
|
{
|
||||||
struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer);
|
struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer);
|
||||||
unsigned long backtrace = oprofile_backtrace_depth;
|
unsigned long backtrace = oprofile_backtrace_depth;
|
||||||
|
@ -301,7 +304,7 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
||||||
* if log_sample() fail we can't backtrace since we lost the
|
* if log_sample() fail we can't backtrace since we lost the
|
||||||
* source of this event
|
* source of this event
|
||||||
*/
|
*/
|
||||||
if (!log_sample(cpu_buf, pc, backtrace, is_kernel, event))
|
if (!log_sample(cpu_buf, pc, backtrace, is_kernel, event, task))
|
||||||
/* failed */
|
/* failed */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -313,10 +316,17 @@ __oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
||||||
oprofile_end_trace(cpu_buf);
|
oprofile_end_trace(cpu_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void oprofile_add_ext_hw_sample(unsigned long pc, struct pt_regs * const regs,
|
||||||
|
unsigned long event, int is_kernel,
|
||||||
|
struct task_struct *task)
|
||||||
|
{
|
||||||
|
__oprofile_add_ext_sample(pc, regs, event, is_kernel, task);
|
||||||
|
}
|
||||||
|
|
||||||
void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
||||||
unsigned long event, int is_kernel)
|
unsigned long event, int is_kernel)
|
||||||
{
|
{
|
||||||
__oprofile_add_ext_sample(pc, regs, event, is_kernel);
|
__oprofile_add_ext_sample(pc, regs, event, is_kernel, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void oprofile_add_sample(struct pt_regs * const regs, unsigned long event)
|
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)
|
||||||
pc = ESCAPE_CODE; /* as this causes an early return. */
|
pc = ESCAPE_CODE; /* as this causes an early return. */
|
||||||
}
|
}
|
||||||
|
|
||||||
__oprofile_add_ext_sample(pc, regs, event, is_kernel);
|
__oprofile_add_ext_sample(pc, regs, event, is_kernel, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -403,7 +413,7 @@ int oprofile_write_commit(struct op_entry *entry)
|
||||||
void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event)
|
void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event)
|
||||||
{
|
{
|
||||||
struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer);
|
struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(op_cpu_buffer);
|
||||||
log_sample(cpu_buf, pc, 0, is_kernel, event);
|
log_sample(cpu_buf, pc, 0, is_kernel, event, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void oprofile_add_trace(unsigned long pc)
|
void oprofile_add_trace(unsigned long pc)
|
||||||
|
|
|
@ -106,6 +106,13 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event);
|
||||||
void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
|
||||||
unsigned long event, int is_kernel);
|
unsigned long event, int is_kernel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an hardware sample.
|
||||||
|
*/
|
||||||
|
void oprofile_add_ext_hw_sample(unsigned long pc, struct pt_regs * const regs,
|
||||||
|
unsigned long event, int is_kernel,
|
||||||
|
struct task_struct *task);
|
||||||
|
|
||||||
/* Use this instead when the PC value is not from the regs. Doesn't
|
/* Use this instead when the PC value is not from the regs. Doesn't
|
||||||
* backtrace. */
|
* backtrace. */
|
||||||
void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event);
|
void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event);
|
||||||
|
|
Loading…
Add table
Reference in a new issue