proc_yield() no longer messes with amt_wanted
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 28 Feb 2012 23:24:07 +0000 (15:24 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 29 Feb 2012 22:53:02 +0000 (14:53 -0800)
The only time the kernel will mess with it (for now) is in
__proc_wakeup(), so that the ksched will give them something.

kern/src/process.c
user/parlib/vcore.c

index 4049a29..8f46307 100644 (file)
@@ -834,9 +834,6 @@ void __proc_yield_s(struct proc *p, struct trapframe *tf)
  * - If you have only one vcore, you switch to RUNNABLE_M.  When you run again,
  *   you'll have one guaranteed core, starting from the entry point.
  *
- * - RES_CORES amt_wanted will be the amount running after taking away the
- *   yielder, unless there are none left, in which case it will be 1.
- *
  * If the call is being nice, it means that it is in response to a preemption
  * (which needs to be checked).  If there is no preemption pending, just return.
  * No matter what, don't adjust the number of cores wanted.
@@ -937,15 +934,12 @@ void proc_yield(struct proc *SAFE p, bool being_nice)
        __unmap_vcore(p, vcoreid);
        /* Adjust implied resource desires */
        p->resources[RES_CORES].amt_granted = --(p->procinfo->num_vcores);
-       if (!being_nice)
-               p->resources[RES_CORES].amt_wanted = p->procinfo->num_vcores;
        __seq_end_write(&p->procinfo->coremap_seqctr);
        /* Hand the now-idle core to the ksched */
        put_idle_core(pcoreid);
-       // last vcore?  then we really want 1, and to yield the gang
+       /* No more vcores?  Then we wait on an event */
        if (p->procinfo->num_vcores == 0) {
-               p->resources[RES_CORES].amt_wanted = 1;
-               /* wait on an event (not supporting 'being nice' for now */
+               /* consider a ksched op to tell it about us WAITING */
                __proc_set_state(p, PROC_WAITING);
        }
        goto out_yield_core;
@@ -1000,9 +994,13 @@ void __proc_wakeup(struct proc *p)
        if (p->state != PROC_WAITING)
                return;
        if (__proc_is_mcp(p)) {
-               /* TODO: adjust amt_wanted here, instead of in yield */
+               /* Need to make sure they want at least 1 vcore, so the ksched gives
+                * them something.  Might do this via short handler later. */
+               if (!p->resources[RES_CORES].amt_wanted)
+                       p->resources[RES_CORES].amt_wanted = 1;
                __proc_set_state(p, PROC_RUNNABLE_M);
        } else {
+               printk("[kernel] FYI, waking up an _S proc\n");
                __proc_set_state(p, PROC_RUNNABLE_S);
                schedule_scp(p);
        }
index 71aa9af..a27269c 100644 (file)
@@ -246,7 +246,8 @@ handle_it:
        return 0;
 }
 
-/* This can return, if you failed to yield due to a concurrent event. */
+/* This can return, if you failed to yield due to a concurrent event.
+ * TODO: consider decreasing the amt_wanted, perhaps in the calling code. */
 void vcore_yield(bool preempt_pending)
 {
        uint32_t vcoreid = vcore_id();