diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2015-02-27 20:01:03 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-03-02 10:57:07 +0100 |
commit | 21618b3e55ad2c6fede0bffcaea466091811ce59 (patch) | |
tree | 58dbdbeafd87102b9613b630682bc66c05c7451e /cpus.c | |
parent | 6b49809c597331803ea941eadda813e5bb4e8fe2 (diff) | |
download | qemu-21618b3e55ad2c6fede0bffcaea466091811ce59.tar.gz qemu-21618b3e55ad2c6fede0bffcaea466091811ce59.tar.bz2 qemu-21618b3e55ad2c6fede0bffcaea466091811ce59.zip |
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>
Diffstat (limited to 'cpus.c')
-rw-r--r-- | cpus.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -1025,6 +1025,9 @@ static void *qemu_tcg_cpu_thread_fn(void *arg) } } + /* process any pending work */ + exit_request = 1; + while (1) { tcg_exec_all(); @@ -1115,10 +1118,11 @@ 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); |