ucli perf software irq
This commit is contained in:
@@ -3,13 +3,15 @@
|
||||
static struct perf_event *pe;
|
||||
|
||||
void vm_perf_overflow_callback(struct perf_event *event,
|
||||
struct perf_sample_data *data,
|
||||
struct pt_regs *regs) {
|
||||
struct perf_sample_data *data,
|
||||
struct pt_regs *regs) {
|
||||
// handle perf event data
|
||||
// struct perf_callchain_entry *callchain;
|
||||
// int nr, i;
|
||||
|
||||
pr_info("perf event callback\n");
|
||||
|
||||
// perf_event_disable(event);
|
||||
|
||||
// 如果 perf_sample_data 有调用堆栈信息
|
||||
// if (data->callchain) {
|
||||
@@ -42,10 +44,10 @@ void vm_perf_overflow_callback(struct perf_event *event,
|
||||
struct perf_event_attr pea = {
|
||||
.type = PERF_TYPE_SOFTWARE,
|
||||
.size = sizeof(struct perf_event_attr),
|
||||
.config = PERF_COUNT_SW_CPU_CLOCK,
|
||||
.config = PERF_COUNT_SW_DUMMY,
|
||||
.sample_period = 1,
|
||||
.sample_type = PERF_SAMPLE_CALLCHAIN,
|
||||
// .disabled = 1,
|
||||
.disabled = 1,
|
||||
};
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
@@ -61,32 +63,38 @@ void setup_perf_event_for_task(struct task_struct *tsk) {
|
||||
pr_info("Perf event already created\n");
|
||||
return;
|
||||
}
|
||||
int cpu;
|
||||
struct perf_event **events;
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct perf_event **event = per_cpu_ptr(events, cpu);
|
||||
if (cpu_is_offline(cpu)) {
|
||||
*event = NULL;
|
||||
continue;
|
||||
}
|
||||
*event = perf_event_create_kernel_counter(&pea, cpu, tsk,
|
||||
vm_perf_overflow_callback, NULL);
|
||||
if (IS_ERR(*event)) {
|
||||
printk(KERN_INFO "create perf event failure\n");
|
||||
// return -1;
|
||||
}
|
||||
}
|
||||
// int cpu;
|
||||
// struct perf_event **events;
|
||||
// for_each_possible_cpu(cpu) {
|
||||
// struct perf_event **event = per_cpu_ptr(events, cpu);
|
||||
// if (cpu_is_offline(cpu)) {
|
||||
// pr_info("cpu %d is offline\n", cpu);
|
||||
// *event = NULL;
|
||||
// continue;
|
||||
// }
|
||||
// *event = perf_event_create_kernel_counter(&pea, cpu, tsk,
|
||||
// vm_perf_overflow_callback, NULL);
|
||||
|
||||
// // perf_event_create_kernel_counter(&pea, cpu, tsk,
|
||||
// // vm_perf_overflow_callback,
|
||||
// // NULL);
|
||||
// if (IS_ERR(*event)) {
|
||||
// printk(KERN_INFO "create perf event failure\n");
|
||||
// // return -1;
|
||||
// }
|
||||
// // perf_event_enable(*event);
|
||||
// }
|
||||
|
||||
// pe = perf_event_create_kernel_counter(&pea, tsk->on_cpu, tsk,
|
||||
// vm_perf_callback, NULL);
|
||||
pe = perf_event_create_kernel_counter(&pea, tsk->on_cpu, tsk,
|
||||
pe = perf_event_create_kernel_counter(&pea, -1, tsk,
|
||||
vm_perf_overflow_callback, NULL);
|
||||
if (IS_ERR(pe)) {
|
||||
pr_info("Error in perf_event_create_kernel_counter\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// perf_event_enable(pe); // enable perf event
|
||||
perf_event_enable(pe); // enable perf event
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user