aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/oprofile/cpu_buffer.c13
-rw-r--r--include/linux/oprofile.h10
2 files changed, 20 insertions, 3 deletions
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c
index 330d3869b41e..fc4bc9b94c74 100644
--- a/drivers/oprofile/cpu_buffer.c
+++ b/drivers/oprofile/cpu_buffer.c
@@ -217,11 +217,10 @@ static void oprofile_end_trace(struct oprofile_cpu_buffer * cpu_buf)
217 cpu_buf->tracing = 0; 217 cpu_buf->tracing = 0;
218} 218}
219 219
220void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) 220void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
221 unsigned long event, int is_kernel)
221{ 222{
222 struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()]; 223 struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()];
223 unsigned long pc = profile_pc(regs);
224 int is_kernel = !user_mode(regs);
225 224
226 if (!backtrace_depth) { 225 if (!backtrace_depth) {
227 log_sample(cpu_buf, pc, is_kernel, event); 226 log_sample(cpu_buf, pc, is_kernel, event);
@@ -238,6 +237,14 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event)
238 oprofile_end_trace(cpu_buf); 237 oprofile_end_trace(cpu_buf);
239} 238}
240 239
240void oprofile_add_sample(struct pt_regs * const regs, unsigned long event)
241{
242 int is_kernel = !user_mode(regs);
243 unsigned long pc = profile_pc(regs);
244
245 oprofile_add_ext_sample(pc, regs, event, is_kernel);
246}
247
241void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event) 248void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event)
242{ 249{
243 struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()]; 250 struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()];
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h
index 559c4c38a9c7..b5b3197dfd4f 100644
--- a/include/linux/oprofile.h
+++ b/include/linux/oprofile.h
@@ -61,6 +61,16 @@ void oprofile_arch_exit(void);
61 */ 61 */
62void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); 62void oprofile_add_sample(struct pt_regs * const regs, unsigned long event);
63 63
64/**
65 * Add an extended sample. Use this when the PC is not from the regs, and
66 * we cannot determine if we're in kernel mode from the regs.
67 *
68 * This function does perform a backtrace.
69 *
70 */
71void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs,
72 unsigned long event, int is_kernel);
73
64/* Use this instead when the PC value is not from the regs. Doesn't 74/* Use this instead when the PC value is not from the regs. Doesn't
65 * backtrace. */ 75 * backtrace. */
66void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); 76void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event);