Allow SCPs to run a pthread 2LS
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 15 Jul 2015 19:47:58 +0000 (15:47 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jul 2015 20:07:52 +0000 (16:07 -0400)
The application must set parlib_wants_to_be_mcp to FALSE before calling
into the pthread library.

I used can_adjust_vcores to turn off vcore_request, but we still want to
yield.  Being an MCP isn't the same as adjusting your vcores.  I used
can_adjust to limit the impact of the SCP capabilities on the normal 2LS
operation - now it only involves a slight check when we are yielding and
have no work to do.

SCP code should be able to call vcore_yield() as well as sys_yield().
vcore_yield() has protections to keep from missing messages.  SCPs don't
need that, since the kernel just blasts the message.  sys_yield
(proc_yield() in the kernel) won't let the SCP sleep when there is a
notif pending, so we shouldn't need to go through all of those extra
steps.

user/pthread/pthread.c

index 7292f7f..e488ec3 100644 (file)
@@ -243,6 +243,8 @@ void __attribute__((noreturn)) pth_sched_entry(void)
                 * bit before yielding (or not at all if you want to be greedy). */
                if (can_adjust_vcores)
                        vcore_yield(FALSE);
+               if (!parlib_wants_to_be_mcp)
+                       sys_yield(FALSE);
        } while (1);
        assert(new_thread->state == PTH_RUNNABLE);
        /* Prep the pthread to run any pending posix signal handlers registered
@@ -679,6 +681,13 @@ void pthread_mcp_init()
        /* Prevent this from happening more than once. */
        init_once_racy(return);
 
+       if (!parlib_wants_to_be_mcp) {
+               /* sign to whether or not we ask for more vcores.  actually, if we're
+                * an SCP, the current kernel will ignore our requests, but best to not
+                * rely on that. */
+               can_adjust_vcores = FALSE;
+               return;
+       }
        uthread_mcp_init();
        /* From here forward we are an MCP running on vcore 0. Could consider doing
         * other pthread specific initialization based on knowing we are an mcp