Profiling: counters for the vcore.
authorRonald G. Minnich <rminnich@google.com>
Wed, 14 May 2014 17:34:52 +0000 (10:34 -0700)
committerRonald G. Minnich <rminnich@google.com>
Wed, 14 May 2014 17:35:55 +0000 (10:35 -0700)
Set a timer (resume) to the ns when a vcore resumes user mode.
This is almost certainly being done at the wrong place.

When a vcore exits user mode, update the total ns timer for that
vcore.

These two counters should let a user figure out profiling info.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/src/process.c

index 3f75346..6591bde 100644 (file)
@@ -1991,6 +1991,9 @@ int proc_change_to_vcore(struct proc *p, uint32_t new_vcoreid,
         * waiting on a message, roughly) */
        send_kernel_message(pcoreid, __set_curctx, (long)p, (long)new_vcoreid,
                            (long)new_vc->nr_preempts_sent, KMSG_ROUTINE);
+
+       /* almost certainly the wrong place to do this. */
+       p->procinfo->vcoremap[new_vcoreid].resume = nsec();
        retval = 0;
        /* Fall through to exit */
 out_locked:
@@ -2088,6 +2091,7 @@ void __preempt(uint32_t srcid, long a0, long a1, long a2)
        struct per_cpu_info *pcpui = &per_cpu_info[coreid];
        struct preempt_data *vcpd;
        struct proc *p = (struct proc*)a0;
+       unsigned long ns;
 
        assert(p);
        if (p != pcpui->owning_proc) {
@@ -2124,6 +2128,11 @@ void __preempt(uint32_t srcid, long a0, long a1, long a2)
        atomic_and(&vcpd->flags, ~VC_K_LOCK);
        /* either __preempt or proc_yield() ends the preempt phase. */
        p->procinfo->vcoremap[vcoreid].preempt_pending = 0;
+
+       /* accounting */
+       ns = nsec();
+       p->procinfo->vcoremap[vcoreid].total += ns - p->procinfo->vcoremap[vcoreid].resume;
+
        wmb();  /* make sure everything else hits before we finish the preempt */
        /* up the nr_done, which signals the next __startcore for this vc */
        p->procinfo->vcoremap[vcoreid].nr_preempts_done++;