diff options
author | Dan Crowell <dcrowell@us.ibm.com> | 2019-01-22 15:32:10 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2019-01-25 10:07:27 -0600 |
commit | ff5e4695cc58653dda06b0e861349a9d520d87cc (patch) | |
tree | 9375d1e401a9720fc8cf422c74b4ea754284090f /src/kernel/syscall.C | |
parent | c2f2f5037920dc8441c6b27ff7a488a90f0433b1 (diff) | |
download | talos-hostboot-ff5e4695cc58653dda06b0e861349a9d520d87cc.tar.gz talos-hostboot-ff5e4695cc58653dda06b0e861349a9d520d87cc.zip |
Add retry to slave core wakeup path
We are still seeing some very intermittent errors in the slave
core wakeup path. It still seems like we may have a timing issue.
Until we figure out exactly what is going on, I am adding a retry
mechanism that should get the core to report in correctly. The
retry is done by issuing an additional doorbell message to the
core that didn't report in.
Change-Id: Ib87e5d58e079674d1eebb44c10d0252a35ea0519
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/70761
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com>
Reviewed-by: Dean Sanner <dsanner@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/kernel/syscall.C')
-rw-r--r-- | src/kernel/syscall.C | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C index c293d5067..1df43b78e 100644 --- a/src/kernel/syscall.C +++ b/src/kernel/syscall.C @@ -52,6 +52,8 @@ extern "C" void kernel_execute_hyp_doorbell() { + printkd("hyp_doorbell on %lx\n", getPIR()); + // Per POWER ISA Section 5.9.2, to avoid any weak consistency // issues we must use a msgsync instruction before consuming // any data set by a different thread following a doorbell @@ -144,6 +146,7 @@ namespace Systemcalls void CpuSprSet(task_t *t); void CpuNap(task_t *t); void CpuWinkle(task_t *t); + void CpuWakeupCore(task_t *t); void MmAllocBlock(task_t *t); void MmRemovePages(task_t *t); void MmSetPermission(task_t *t); @@ -189,6 +192,7 @@ namespace Systemcalls &CpuSprSet, // MISC_CPUSPRSET &CpuNap, // MISC_CPUNAP &CpuWinkle, // MISC_CPUWINKLE + &CpuWakeupCore, // MISC_CPUWAKEUPCORE &MmAllocBlock, // MM_ALLOC_BLOCK &MmRemovePages, // MM_REMOVE_PAGES @@ -858,6 +862,13 @@ namespace Systemcalls } } + /** Force thread wakeup via doorbell. */ + void CpuWakeupCore(task_t *t) + { + CpuManager::wakeupCore(static_cast<uint64_t>(TASK_GETARG0(t)), + static_cast<uint64_t>(TASK_GETARG1(t))); + }; + /** * Allocate a block of virtual memory within the base segment * @param[in] t: The task used to allocate a block in the base segment |