Fixes handle_indirs issue
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 10 Oct 2014 19:07:17 +0000 (12:07 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 13 Oct 2014 19:47:54 +0000 (12:47 -0700)
handle_indirs() can only proceed if the target vcore is guaranteed to
not be online.  VC_PREEMPTED is the commonly used flag for that, with
the added benefit of that flag turning off the first time a VC comes
back online - meaning we can skip handling their messages if its a moot
point.

This change sets PREEMPTED for all cases of change_to_vcore, since the
"I don't plan to return" case needs to have its messages checked
remotely.

kern/src/process.c

index d58e353..31f1afe 100644 (file)
@@ -1999,9 +1999,13 @@ int proc_change_to_vcore(struct proc *p, uint32_t new_vcoreid,
                 * __startcore, to make the caller look like it was preempted. */
                caller_vcpd->vcore_ctx = *current_ctx;
                save_vc_fp_state(caller_vcpd);
                 * __startcore, to make the caller look like it was preempted. */
                caller_vcpd->vcore_ctx = *current_ctx;
                save_vc_fp_state(caller_vcpd);
-               /* Mark our core as preempted (for userspace recovery). */
-               atomic_or(&caller_vcpd->flags, VC_PREEMPTED);
        }
        }
+       /* Mark our core as preempted (for userspace recovery).  Userspace checks
+        * this in handle_indirs, and it needs to check the mbox regardless of
+        * enable_my_notif.  This does mean cores that change-to with no intent to
+        * return will be tracked as PREEMPTED until they start back up (maybe
+        * forever). */
+       atomic_or(&caller_vcpd->flags, VC_PREEMPTED);
        /* Either way, unmap and offline our current vcore */
        /* Move the caller from online to inactive */
        TAILQ_REMOVE(&p->online_vcs, caller_vc, list);
        /* Either way, unmap and offline our current vcore */
        /* Move the caller from online to inactive */
        TAILQ_REMOVE(&p->online_vcs, caller_vc, list);