Do not drop global mutex for polled main loop runs If we call select without a timeout, it's more efficient to keep the global mutex locked as we may otherwise just play ping pong with a vcpu thread contending for it. This is particularly important for TCG mode where we run in lock-step with the vcpu thread. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/vl.c b/vl.c index 5f1a177..c52937a 100644 --- a/vl.c +++ b/vl.c
@@ -1349,9 +1349,15 @@ qemu_iohandler_fill(&nfds, &rfds, &wfds, &xfds); slirp_select_fill(&nfds, &rfds, &wfds, &xfds); - qemu_mutex_unlock_iothread(); + if (timeout > 0) { + qemu_mutex_unlock_iothread(); + } + ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); - qemu_mutex_lock_iothread(); + + if (timeout > 0) { + qemu_mutex_lock_iothread(); + } qemu_iohandler_poll(&rfds, &wfds, &xfds, ret); slirp_select_poll(&rfds, &wfds, &xfds, (ret < 0));