summaryrefslogtreecommitdiffstats
path: root/src/kernel/syscall.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/syscall.C')
-rw-r--r--src/kernel/syscall.C15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C
index 71bd1a995..985d9c0ab 100644
--- a/src/kernel/syscall.C
+++ b/src/kernel/syscall.C
@@ -700,12 +700,13 @@ namespace Systemcalls
}
};
- /** Winkle all the threads so that the runtime SLW image can be loaded. */
+ /** Winkle all the threads. */
void CpuWinkle(task_t *t)
{
cpu_t* cpu = CpuManager::getCurrentCPU();
- if ((CpuManager::getCpuCount() > CpuManager::getThreadCount()) ||
+ if ((WINKLE_SCOPE_MASTER == TASK_GETARG0(t) &&
+ (CpuManager::getCpuCount() > CpuManager::getThreadCount())) ||
(!cpu->master))
{
TASK_SETRTN(t, -EDEADLK);
@@ -713,7 +714,15 @@ namespace Systemcalls
else
{
TASK_SETRTN(t, 0);
- KernelMisc::WinkleCore* deferred = new KernelMisc::WinkleCore(t);
+ DeferredWork* deferred = NULL;
+ if (WINKLE_SCOPE_MASTER == TASK_GETARG0(t))
+ {
+ deferred = new KernelMisc::WinkleCore(t);
+ }
+ else
+ {
+ deferred = new KernelMisc::WinkleAll(t);
+ }
t->state = TASK_STATE_BLOCK_USRSPACE;
t->state_info = deferred;
DeferredQueue::insert(deferred);
OpenPOWER on IntegriCloud