提交 d549db5a 编写于 作者: G Glauber Costa 提交者: Anthony Liguori

unlock iothread mutex before running kvm ioctl

Without this, kvm will hold the mutex while it issues its run ioctl,
and never be able to step out of it, causing a deadlock.

Patchworks-ID: 35359
Signed-off-by: NGlauber Costa <glommer@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 ce88f890
......@@ -605,7 +605,9 @@ int kvm_cpu_exec(CPUState *env)
}
kvm_arch_pre_run(env, run);
qemu_mutex_unlock_iothread();
ret = kvm_vcpu_ioctl(env, KVM_RUN, 0);
qemu_mutex_lock_iothread();
kvm_arch_post_run(env, run);
if (ret == -EINTR || ret == -EAGAIN) {
......
......@@ -146,6 +146,9 @@ char *qemu_strndup(const char *str, size_t size);
void *get_mmap_addr(unsigned long size);
void qemu_mutex_lock_iothread(void);
void qemu_mutex_unlock_iothread(void);
/* Error handling. */
void QEMU_NORETURN hw_error(const char *fmt, ...)
......
......@@ -3560,8 +3560,8 @@ void qemu_notify_event(void)
}
}
#define qemu_mutex_lock_iothread() do { } while (0)
#define qemu_mutex_unlock_iothread() do { } while (0)
void qemu_mutex_lock_iothread(void) {}
void qemu_mutex_unlock_iothread(void) {}
void vm_stop(int reason)
{
......@@ -3760,7 +3760,7 @@ static void qemu_signal_lock(unsigned int msecs)
qemu_mutex_unlock(&qemu_fair_mutex);
}
static void qemu_mutex_lock_iothread(void)
void qemu_mutex_lock_iothread(void)
{
if (kvm_enabled()) {
qemu_mutex_lock(&qemu_fair_mutex);
......@@ -3770,7 +3770,7 @@ static void qemu_mutex_lock_iothread(void)
qemu_signal_lock(100);
}
static void qemu_mutex_unlock_iothread(void)
void qemu_mutex_unlock_iothread(void)
{
qemu_mutex_unlock(&qemu_global_mutex);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册