mirror of https://github.com/xemu-project/xemu.git
cpus: be more paranoid in avoiding deadlocks
For good measure, ensure that the following sequence: thread 1 calls qemu_mutex_lock_iothread thread 2 calls qemu_mutex_lock_iothread VCPU thread are created VCPU thread enters execution loop results in the VCPU threads letting the other two threads run and obeying iothread_requesting_mutex even if the VCPUs are not halted. To do this, check iothread_requesting_mutex before execution starts. Tested-by: Leon Alrae <leon.alrae@imgtec.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
620f0af8d5
commit
c5d92c871f
6
cpus.c
6
cpus.c
|
@ -950,6 +950,9 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
|
|||
}
|
||||
}
|
||||
|
||||
/* process any pending work */
|
||||
exit_request = 1;
|
||||
|
||||
while (1) {
|
||||
tcg_exec_all();
|
||||
|
||||
|
@ -1040,10 +1043,11 @@ static bool qemu_in_vcpu_thread(void)
|
|||
|
||||
void qemu_mutex_lock_iothread(void)
|
||||
{
|
||||
atomic_inc(&iothread_requesting_mutex);
|
||||
if (!tcg_enabled() || !first_cpu) {
|
||||
qemu_mutex_lock(&qemu_global_mutex);
|
||||
atomic_dec(&iothread_requesting_mutex);
|
||||
} else {
|
||||
atomic_inc(&iothread_requesting_mutex);
|
||||
if (qemu_mutex_trylock(&qemu_global_mutex)) {
|
||||
qemu_cpu_kick_thread(first_cpu);
|
||||
qemu_mutex_lock(&qemu_global_mutex);
|
||||
|
|
Loading…
Reference in New Issue