diff options
| author | Patrick Williams <iawillia@us.ibm.com> | 2011-08-08 16:27:17 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-08-09 13:54:57 -0500 |
| commit | be61bd382972ec946396dadc161231c65ea9d968 (patch) | |
| tree | 29acf3176ca910cd3f740d930b9d1fcee0c0e382 /src/kernel | |
| parent | af0bcd44f7c475eb00178d4f448a14343c0354c0 (diff) | |
| download | talos-hostboot-be61bd382972ec946396dadc161231c65ea9d968.tar.gz talos-hostboot-be61bd382972ec946396dadc161231c65ea9d968.zip | |
Clean up mutex issues.
- Final fix for mutex bug.
- Document weak-consistency decisions in mutex code.
- Prevent aggressive optimizations around lwsync/isync instrs.
- Fix minor bug in futex_wait system call.
- Optimize futex path with likely/unlikely hints.
Change-Id: I26b54dee7e45bcb42195f730474b350b44f53cfc
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/233
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/futexmgr.C | 2 | ||||
| -rw-r--r-- | src/kernel/syscall.C | 9 |
2 files changed, 9 insertions, 2 deletions
diff --git a/src/kernel/futexmgr.C b/src/kernel/futexmgr.C index 6271471aa..37ad54586 100644 --- a/src/kernel/futexmgr.C +++ b/src/kernel/futexmgr.C @@ -33,7 +33,7 @@ uint64_t FutexManager::_wait(task_t* i_task, uint64_t * i_addr, uint64_t i_val) iv_lock.lock(); - if(*i_addr != i_val) + if(unlikely(*i_addr != i_val)) { // some other thread has modified the futex // bail-out retry required. diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C index f96f8d372..1001ef361 100644 --- a/src/kernel/syscall.C +++ b/src/kernel/syscall.C @@ -356,11 +356,18 @@ namespace Systemcalls uint64_t * uaddr = (uint64_t *) TASK_GETARG0(t); uint64_t val = (uint64_t) TASK_GETARG1(t); + // Set RC to success initially. + TASK_SETRTN(t,0); + //TODO translate uaddr from user space to kernel space // Right now they are the same. uint64_t rc = FutexManager::wait(t,uaddr,val); - TASK_SETRTN(t,rc); + if (rc != 0) // Can only set rc if we still have control of the task, + // which is only (for certain) on error rc's. + { + TASK_SETRTN(t,rc); + } } /** |

