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