mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-10-03 23:16:55 +00:00
oprofile: make new cpu buffer functions part of the api
This patch creates the new functions oprofile_write_reserve() oprofile_add_data() oprofile_write_commit() and makes them part of the oprofile api. Signed-off-by: Robert Richter <robert.richter@amd.com>
This commit is contained in:
parent
ebf8d974e2
commit
14f0ca8eae
@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#include "op_x86_model.h"
|
#include "op_x86_model.h"
|
||||||
#include "op_counter.h"
|
#include "op_counter.h"
|
||||||
#include "../../../drivers/oprofile/cpu_buffer.h"
|
|
||||||
|
|
||||||
#define NUM_COUNTERS 4
|
#define NUM_COUNTERS 4
|
||||||
#define NUM_CONTROLS 4
|
#define NUM_CONTROLS 4
|
||||||
@ -61,14 +60,6 @@ static unsigned long reset_value[NUM_COUNTERS];
|
|||||||
#define IBS_OP_LOW_VALID_BIT (1ULL<<18) /* bit 18 */
|
#define IBS_OP_LOW_VALID_BIT (1ULL<<18) /* bit 18 */
|
||||||
#define IBS_OP_LOW_ENABLE (1ULL<<17) /* bit 17 */
|
#define IBS_OP_LOW_ENABLE (1ULL<<17) /* bit 17 */
|
||||||
|
|
||||||
/*
|
|
||||||
* The function interface needs to be fixed, something like add
|
|
||||||
* data. Should then be added to linux/oprofile.h.
|
|
||||||
*/
|
|
||||||
extern
|
|
||||||
void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs,
|
|
||||||
unsigned long pc, int code, int size);
|
|
||||||
|
|
||||||
#define IBS_FETCH_SIZE 6
|
#define IBS_FETCH_SIZE 6
|
||||||
#define IBS_OP_SIZE 12
|
#define IBS_OP_SIZE 12
|
||||||
|
|
||||||
@ -174,16 +165,16 @@ op_amd_handle_ibs(struct pt_regs * const regs,
|
|||||||
rdmsr(MSR_AMD64_IBSFETCHCTL, low, high);
|
rdmsr(MSR_AMD64_IBSFETCHCTL, low, high);
|
||||||
if (high & IBS_FETCH_HIGH_VALID_BIT) {
|
if (high & IBS_FETCH_HIGH_VALID_BIT) {
|
||||||
rdmsrl(MSR_AMD64_IBSFETCHLINAD, msr);
|
rdmsrl(MSR_AMD64_IBSFETCHLINAD, msr);
|
||||||
oprofile_add_data(&entry, regs, msr, IBS_FETCH_CODE,
|
oprofile_write_reserve(&entry, regs, msr,
|
||||||
IBS_FETCH_SIZE);
|
IBS_FETCH_CODE, IBS_FETCH_SIZE);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
op_cpu_buffer_add_data(&entry, low);
|
oprofile_add_data(&entry, low);
|
||||||
op_cpu_buffer_add_data(&entry, high);
|
oprofile_add_data(&entry, high);
|
||||||
rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, msr);
|
rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
op_cpu_buffer_write_commit(&entry);
|
oprofile_write_commit(&entry);
|
||||||
|
|
||||||
/* reenable the IRQ */
|
/* reenable the IRQ */
|
||||||
high &= ~IBS_FETCH_HIGH_VALID_BIT;
|
high &= ~IBS_FETCH_HIGH_VALID_BIT;
|
||||||
@ -197,26 +188,26 @@ op_amd_handle_ibs(struct pt_regs * const regs,
|
|||||||
rdmsr(MSR_AMD64_IBSOPCTL, low, high);
|
rdmsr(MSR_AMD64_IBSOPCTL, low, high);
|
||||||
if (low & IBS_OP_LOW_VALID_BIT) {
|
if (low & IBS_OP_LOW_VALID_BIT) {
|
||||||
rdmsrl(MSR_AMD64_IBSOPRIP, msr);
|
rdmsrl(MSR_AMD64_IBSOPRIP, msr);
|
||||||
oprofile_add_data(&entry, regs, msr, IBS_OP_CODE,
|
oprofile_write_reserve(&entry, regs, msr,
|
||||||
IBS_OP_SIZE);
|
IBS_OP_CODE, IBS_OP_SIZE);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
rdmsrl(MSR_AMD64_IBSOPDATA, msr);
|
rdmsrl(MSR_AMD64_IBSOPDATA, msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
rdmsrl(MSR_AMD64_IBSOPDATA2, msr);
|
rdmsrl(MSR_AMD64_IBSOPDATA2, msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
rdmsrl(MSR_AMD64_IBSOPDATA3, msr);
|
rdmsrl(MSR_AMD64_IBSOPDATA3, msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
rdmsrl(MSR_AMD64_IBSDCLINAD, msr);
|
rdmsrl(MSR_AMD64_IBSDCLINAD, msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
rdmsrl(MSR_AMD64_IBSDCPHYSAD, msr);
|
rdmsrl(MSR_AMD64_IBSDCPHYSAD, msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)msr);
|
oprofile_add_data(&entry, (u32)msr);
|
||||||
op_cpu_buffer_add_data(&entry, (u32)(msr >> 32));
|
oprofile_add_data(&entry, (u32)(msr >> 32));
|
||||||
op_cpu_buffer_write_commit(&entry);
|
oprofile_write_commit(&entry);
|
||||||
|
|
||||||
/* reenable the IRQ */
|
/* reenable the IRQ */
|
||||||
high = 0;
|
high = 0;
|
||||||
|
@ -364,10 +364,11 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event)
|
|||||||
/*
|
/*
|
||||||
* Add samples with data to the ring buffer.
|
* Add samples with data to the ring buffer.
|
||||||
*
|
*
|
||||||
* Use op_cpu_buffer_add_data(&entry, val) to add data and
|
* Use oprofile_add_data(&entry, val) to add data and
|
||||||
* op_cpu_buffer_write_commit(&entry) to commit the sample.
|
* oprofile_write_commit(&entry) to commit the sample.
|
||||||
*/
|
*/
|
||||||
void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs,
|
void
|
||||||
|
oprofile_write_reserve(struct op_entry *entry, struct pt_regs * const regs,
|
||||||
unsigned long pc, int code, int size)
|
unsigned long pc, int code, int size)
|
||||||
{
|
{
|
||||||
struct op_sample *sample;
|
struct op_sample *sample;
|
||||||
@ -395,6 +396,16 @@ void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs,
|
|||||||
cpu_buf->sample_lost_overflow++;
|
cpu_buf->sample_lost_overflow++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int oprofile_add_data(struct op_entry *entry, unsigned long val)
|
||||||
|
{
|
||||||
|
return op_cpu_buffer_add_data(entry, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int oprofile_write_commit(struct op_entry *entry)
|
||||||
|
{
|
||||||
|
return op_cpu_buffer_write_commit(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(cpu_buffer);
|
struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer);
|
||||||
|
@ -35,13 +35,7 @@ struct op_sample {
|
|||||||
unsigned long data[0];
|
unsigned long data[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct op_entry {
|
struct op_entry;
|
||||||
struct ring_buffer_event *event;
|
|
||||||
struct op_sample *sample;
|
|
||||||
unsigned long irq_flags;
|
|
||||||
unsigned long size;
|
|
||||||
unsigned long *data;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct oprofile_cpu_buffer {
|
struct oprofile_cpu_buffer {
|
||||||
unsigned long buffer_size;
|
unsigned long buffer_size;
|
||||||
|
@ -164,4 +164,22 @@ void oprofile_put_buff(unsigned long *buf, unsigned int start,
|
|||||||
unsigned long oprofile_get_cpu_buffer_size(void);
|
unsigned long oprofile_get_cpu_buffer_size(void);
|
||||||
void oprofile_cpu_buffer_inc_smpl_lost(void);
|
void oprofile_cpu_buffer_inc_smpl_lost(void);
|
||||||
|
|
||||||
|
/* cpu buffer functions */
|
||||||
|
|
||||||
|
struct op_sample;
|
||||||
|
|
||||||
|
struct op_entry {
|
||||||
|
struct ring_buffer_event *event;
|
||||||
|
struct op_sample *sample;
|
||||||
|
unsigned long irq_flags;
|
||||||
|
unsigned long size;
|
||||||
|
unsigned long *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
void oprofile_write_reserve(struct op_entry *entry,
|
||||||
|
struct pt_regs * const regs,
|
||||||
|
unsigned long pc, int code, int size);
|
||||||
|
int oprofile_add_data(struct op_entry *entry, unsigned long val);
|
||||||
|
int oprofile_write_commit(struct op_entry *entry);
|
||||||
|
|
||||||
#endif /* OPROFILE_H */
|
#endif /* OPROFILE_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user