Message ID | 235905ff218bcf2711c2779de9119187c03566c7.1314027959.git.jan.kiszka@siemens.com |
---|---|
State | New |
Headers | show |
diff --git a/vl.c b/vl.c index 06a6f80..0e8b6a4 100644 --- a/vl.c +++ b/vl.c @@ -1349,9 +1349,15 @@ void main_loop_wait(int nonblocking) 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));
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> --- vl.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)