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
6b49809c59
commit
21618b3e55
6
cpus.c
6
cpus.c
@ -1025,6 +1025,9 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* process any pending work */
|
||||||
|
exit_request = 1;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
tcg_exec_all();
|
tcg_exec_all();
|
||||||
|
|
||||||
@ -1115,10 +1118,11 @@ bool qemu_in_vcpu_thread(void)
|
|||||||
|
|
||||||
void qemu_mutex_lock_iothread(void)
|
void qemu_mutex_lock_iothread(void)
|
||||||
{
|
{
|
||||||
|
atomic_inc(&iothread_requesting_mutex);
|
||||||
if (!tcg_enabled() || !first_cpu) {
|
if (!tcg_enabled() || !first_cpu) {
|
||||||
qemu_mutex_lock(&qemu_global_mutex);
|
qemu_mutex_lock(&qemu_global_mutex);
|
||||||
|
atomic_dec(&iothread_requesting_mutex);
|
||||||
} else {
|
} else {
|
||||||
atomic_inc(&iothread_requesting_mutex);
|
|
||||||
if (qemu_mutex_trylock(&qemu_global_mutex)) {
|
if (qemu_mutex_trylock(&qemu_global_mutex)) {
|
||||||
qemu_cpu_kick_thread(first_cpu);
|
qemu_cpu_kick_thread(first_cpu);
|
||||||
qemu_mutex_lock(&qemu_global_mutex);
|
qemu_mutex_lock(&qemu_global_mutex);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user