VMM: immediately swap btw guests and ctlrs
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 9 Nov 2016 18:35:08 +0000 (13:35 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 7 Dec 2016 22:46:48 +0000 (14:46 -0800)
We know we want to run the buddy thread, so we can just immediately run it.
This bypasses the scheduler loop, which is OK since we weren't really using
it for anything here - the ctlr and guest_thread are accounted as one
entity.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/sched.c

index 30bedd1..eb31ddc 100644 (file)
@@ -319,9 +319,11 @@ static void __swap_to_gth(struct uthread *uth, void *dummy)
 {
        struct ctlr_thread *cth = (struct ctlr_thread*)uth;
 
-       /* We don't re-account for block/unblock.  The ctlr and the guest are
-        * accounted together ("pass the token" back and forth). */
-       enqueue_vmm_thread((struct vmm_thread*)cth->buddy);
+       /* We just immediately run our buddy.  The ctlr and the guest are accounted
+        * together ("pass the token" back and forth). */
+       current_uthread = NULL;
+       run_uthread((struct uthread*)cth->buddy);
+       assert(0);
 }
 
 /* All ctrl threads start here, each time their guest has a fault.  They can
@@ -361,9 +363,11 @@ static void vmm_thread_refl_vm_fault(struct uthread *uth)
        cth->uthread.flags |= UTHREAD_SAVED;
        init_user_ctx(&cth->uthread.u_ctx, (uintptr_t)&__ctlr_entry,
                      (uintptr_t)(cth->stacktop));
-       /* We don't re-account for block/unblock.  The ctlr and the guest are
-        * accounted together ("pass the token" back and forth). */
-       enqueue_vmm_thread((struct vmm_thread*)cth);
+       /* We just immediately run our buddy.  The ctlr and the guest are accounted
+        * together ("pass the token" back and forth). */
+       current_uthread = NULL;
+       run_uthread((struct uthread*)cth);
+       assert(0);
 }
 
 static void vmm_thread_refl_fault(struct uthread *uth,