Add a parlib control variable for yielding
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 27 Apr 2016 18:04:13 +0000 (14:04 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 May 2016 21:11:15 +0000 (17:11 -0400)
This allows applications to control whether or not their 2LS yields.  You
might want to never yield for greedy performance or testing.

Note that the 2LS can ask for more vcores, if it wants/needs it.  It just
won't yield them.  This should be fine.  Apps can always ask for vcores
directly, which the 2LS won't yield.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/parlib.h
user/parlib/parlib.c
user/parlib/vcore.c

index 65509c0..4bca2db 100644 (file)
@@ -59,6 +59,7 @@ void          syscall_async(struct syscall *sysc, unsigned long num, ...);
 
 /* Control variables */
 extern bool parlib_wants_to_be_mcp;    /* instructs the 2LS to be an MCP */
+extern bool parlib_never_yield;                /* instructs the 2LS to not yield vcores */
 
 __END_DECLS
 
index 1c33153..cc55850 100644 (file)
@@ -6,3 +6,4 @@
 
 /* Control variables */
 bool parlib_wants_to_be_mcp = TRUE;
+bool parlib_never_yield = FALSE;
index 7e64e4b..fd22f86 100644 (file)
@@ -289,6 +289,9 @@ void vcore_yield(bool preempt_pending)
        unsigned long old_nr;
        uint32_t vcoreid = vcore_id();
        struct preempt_data *vcpd = vcpd_of(vcoreid);
+
+       if (!preempt_pending && parlib_never_yield)
+               return;
        __sync_fetch_and_and(&vcpd->flags, ~VC_CAN_RCV_MSG);
        /* no wrmb() necessary, handle_events() has an mb() if it is checking */
        /* Clears notif pending and tries to handle events.  This is an optimization