I have a problem with schedule() and sys_perf_event_open.
Minwoo Lee
ermaker at gmail.com
Mon Mar 14 13:03:48 EDT 2011
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);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110315/70fd0217/attachment.html
More information about the Kernelnewbies
mailing list