Hello. I am hacking the kernel source for studying. I just modified schedule() in kernel/sched.c for profiling processes. I want to count the number of cache miss, so added the code using sys_perf_event_open. However, it seems to returns always error fd. I hope to know what should I do for getting the number of cache miss. Here is the diff code based at kernel version 2.6.37 Thanks for reading this e-mail. diff --git a/kernel/sched.c b/kernel/sched.c index 297d1a0..afe68bc 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -72,6 +72,7 @@ #include <linux/ctype.h> #include <linux/ftrace.h> #include <linux/slab.h> +#include <linux/syscalls.h> #include <asm/tlb.h> #include <asm/irq_regs.h> @@ -4061,6 +4062,30 @@ pick_next_task(struct rq *rq) BUG(); /* the idle class will always have a runnable task */ } +static void profile(struct task_struct *task) +{ + int fd; + size_t res; + u64 count; + struct perf_event_attr attr = + { + .type = PERF_TYPE_HARDWARE, + .config = PERF_COUNT_HW_CACHE_MISSES, + .size = sizeof(struct perf_event_attr) + }; + int res_close; + + BUG_ON(task == 0); + + fd = sys_perf_event_open(&attr, 0, -1, -1, 0); + BUG_ON(fd < 0); + res = sys_read(fd, (char *)&count, sizeof(u64)); + BUG_ON(res != sizeof(u64)); + res_close = sys_close(fd); + BUG_ON(res_close == -1); + pr_info("PERF: %d %u %llu %d", fd, res, count, res_close); +} + /* * schedule() is the main scheduler function. */ @@ -4080,6 +4105,7 @@ need_resched: release_kernel_lock(prev); need_resched_nonpreemptible: + profile(prev); schedule_debug(prev);