Loading arch/x86/oprofile/op_model_amd.c +3 −2 Original line number Diff line number Diff line Loading @@ -67,8 +67,9 @@ static unsigned long reset_value[NUM_COUNTERS]; /* The function interface needs to be fixed, something like add data. Should then be added to linux/oprofile.h. */ extern void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, u8 code); extern void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, int ibs_code); struct ibs_fetch_sample { /* MSRC001_1031 IBS Fetch Linear Address Register */ Loading drivers/oprofile/cpu_buffer.c +15 −33 Original line number Diff line number Diff line Loading @@ -258,20 +258,22 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) #ifdef CONFIG_OPROFILE_IBS #define MAX_IBS_SAMPLE_SIZE 14 static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, int is_kernel, unsigned int *ibs, int ibs_code) void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, int ibs_code) { int is_kernel = !user_mode(regs); struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); struct task_struct *task; cpu_buf->sample_received++; if (nr_available_slots(cpu_buf) < MAX_IBS_SAMPLE_SIZE) { /* we can't backtrace since we lost the source of this event */ cpu_buf->sample_lost_overflow++; return 0; return; } is_kernel = !!is_kernel; /* notice a switch from user->kernel or vice versa */ if (cpu_buf->last_is_kernel != is_kernel) { cpu_buf->last_is_kernel = is_kernel; Loading @@ -281,7 +283,6 @@ static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, /* notice a task switch */ if (!is_kernel) { task = current; if (cpu_buf->last_task != task) { cpu_buf->last_task = task; add_code(cpu_buf, (unsigned long)task); Loading @@ -289,36 +290,17 @@ static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, } add_code(cpu_buf, ibs_code); add_sample(cpu_buf, ibs[0], ibs[1]); add_sample(cpu_buf, ibs[2], ibs[3]); add_sample(cpu_buf, ibs[4], ibs[5]); add_sample(cpu_buf, ibs_sample[0], ibs_sample[1]); add_sample(cpu_buf, ibs_sample[2], ibs_sample[3]); add_sample(cpu_buf, ibs_sample[4], ibs_sample[5]); if (ibs_code == IBS_OP_BEGIN) { add_sample(cpu_buf, ibs[6], ibs[7]); add_sample(cpu_buf, ibs[8], ibs[9]); add_sample(cpu_buf, ibs[10], ibs[11]); } return 1; add_sample(cpu_buf, ibs_sample[6], ibs_sample[7]); add_sample(cpu_buf, ibs_sample[8], ibs_sample[9]); add_sample(cpu_buf, ibs_sample[10], ibs_sample[11]); } void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, u8 code) { int is_kernel = !user_mode(regs); unsigned long pc = profile_pc(regs); struct oprofile_cpu_buffer *cpu_buf = &per_cpu(cpu_buffer, smp_processor_id()); if (!backtrace_depth) { log_ibs_sample(cpu_buf, pc, is_kernel, ibs_sample, code); return; } /* if log_sample() fails we can't backtrace since we lost the source * of this event */ if (log_ibs_sample(cpu_buf, pc, is_kernel, ibs_sample, code)) if (backtrace_depth) oprofile_ops.backtrace(regs, backtrace_depth); } Loading Loading
arch/x86/oprofile/op_model_amd.c +3 −2 Original line number Diff line number Diff line Loading @@ -67,8 +67,9 @@ static unsigned long reset_value[NUM_COUNTERS]; /* The function interface needs to be fixed, something like add data. Should then be added to linux/oprofile.h. */ extern void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, u8 code); extern void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, int ibs_code); struct ibs_fetch_sample { /* MSRC001_1031 IBS Fetch Linear Address Register */ Loading
drivers/oprofile/cpu_buffer.c +15 −33 Original line number Diff line number Diff line Loading @@ -258,20 +258,22 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) #ifdef CONFIG_OPROFILE_IBS #define MAX_IBS_SAMPLE_SIZE 14 static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, int is_kernel, unsigned int *ibs, int ibs_code) void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, int ibs_code) { int is_kernel = !user_mode(regs); struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); struct task_struct *task; cpu_buf->sample_received++; if (nr_available_slots(cpu_buf) < MAX_IBS_SAMPLE_SIZE) { /* we can't backtrace since we lost the source of this event */ cpu_buf->sample_lost_overflow++; return 0; return; } is_kernel = !!is_kernel; /* notice a switch from user->kernel or vice versa */ if (cpu_buf->last_is_kernel != is_kernel) { cpu_buf->last_is_kernel = is_kernel; Loading @@ -281,7 +283,6 @@ static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, /* notice a task switch */ if (!is_kernel) { task = current; if (cpu_buf->last_task != task) { cpu_buf->last_task = task; add_code(cpu_buf, (unsigned long)task); Loading @@ -289,36 +290,17 @@ static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, } add_code(cpu_buf, ibs_code); add_sample(cpu_buf, ibs[0], ibs[1]); add_sample(cpu_buf, ibs[2], ibs[3]); add_sample(cpu_buf, ibs[4], ibs[5]); add_sample(cpu_buf, ibs_sample[0], ibs_sample[1]); add_sample(cpu_buf, ibs_sample[2], ibs_sample[3]); add_sample(cpu_buf, ibs_sample[4], ibs_sample[5]); if (ibs_code == IBS_OP_BEGIN) { add_sample(cpu_buf, ibs[6], ibs[7]); add_sample(cpu_buf, ibs[8], ibs[9]); add_sample(cpu_buf, ibs[10], ibs[11]); } return 1; add_sample(cpu_buf, ibs_sample[6], ibs_sample[7]); add_sample(cpu_buf, ibs_sample[8], ibs_sample[9]); add_sample(cpu_buf, ibs_sample[10], ibs_sample[11]); } void oprofile_add_ibs_sample(struct pt_regs *const regs, unsigned int * const ibs_sample, u8 code) { int is_kernel = !user_mode(regs); unsigned long pc = profile_pc(regs); struct oprofile_cpu_buffer *cpu_buf = &per_cpu(cpu_buffer, smp_processor_id()); if (!backtrace_depth) { log_ibs_sample(cpu_buf, pc, is_kernel, ibs_sample, code); return; } /* if log_sample() fails we can't backtrace since we lost the source * of this event */ if (log_ibs_sample(cpu_buf, pc, is_kernel, ibs_sample, code)) if (backtrace_depth) oprofile_ops.backtrace(regs, backtrace_depth); } Loading