mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
coroutine-lock: add limited spinning to CoMutex
Running a very small critical section on pthread_mutex_t and CoMutex shows that pthread_mutex_t is much faster because it doesn't actually go to sleep. What happens is that the critical section is shorter than the latency of entering the kernel and thus FUTEX_WAIT always fails. With CoMutex there is no such latency but you still want to avoid wait and wakeup. So introduce it artificially. This only works with one waiters; because CoMutex is fair, it will always have more waits and wakeups than a pthread_mutex_t. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Message-id: 20170213181244.16297-3-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
committed by
Stefan Hajnoczi
parent
fed20a70e3
commit
480cff6322
@@ -167,6 +167,11 @@ typedef struct CoMutex {
|
||||
*/
|
||||
unsigned locked;
|
||||
|
||||
/* Context that is holding the lock. Useful to avoid spinning
|
||||
* when two coroutines on the same AioContext try to get the lock. :)
|
||||
*/
|
||||
AioContext *ctx;
|
||||
|
||||
/* A queue of waiters. Elements are added atomically in front of
|
||||
* from_push. to_pop is only populated, and popped from, by whoever
|
||||
* is in charge of the next wakeup. This can be an unlocker or,
|
||||
|
||||
Reference in New Issue
Block a user