mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-06 03:05:02 +00:00
linux-user: Fix mmap_lock ordering
mmap_lock() can be called while tb_lock() is being held. To avoid deadlock when one thread is holding mmap_lock and another tb_lock, _always_ lock first tb_lock(). Signed-off-by: Riku Voipio <riku.voipio@nokia.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
f76cfe56d9
commit
d032d1b4b4
@ -99,13 +99,14 @@ static int pending_cpus;
|
|||||||
/* Make sure everything is in a consistent state for calling fork(). */
|
/* Make sure everything is in a consistent state for calling fork(). */
|
||||||
void fork_start(void)
|
void fork_start(void)
|
||||||
{
|
{
|
||||||
mmap_fork_start();
|
|
||||||
pthread_mutex_lock(&tb_lock);
|
pthread_mutex_lock(&tb_lock);
|
||||||
pthread_mutex_lock(&exclusive_lock);
|
pthread_mutex_lock(&exclusive_lock);
|
||||||
|
mmap_fork_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void fork_end(int child)
|
void fork_end(int child)
|
||||||
{
|
{
|
||||||
|
mmap_fork_end(child);
|
||||||
if (child) {
|
if (child) {
|
||||||
/* Child processes created by fork() only have a single thread.
|
/* Child processes created by fork() only have a single thread.
|
||||||
Discard information about the parent threads. */
|
Discard information about the parent threads. */
|
||||||
@ -122,7 +123,6 @@ void fork_end(int child)
|
|||||||
pthread_mutex_unlock(&exclusive_lock);
|
pthread_mutex_unlock(&exclusive_lock);
|
||||||
pthread_mutex_unlock(&tb_lock);
|
pthread_mutex_unlock(&tb_lock);
|
||||||
}
|
}
|
||||||
mmap_fork_end(child);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for pending exclusive operations to complete. The exclusive lock
|
/* Wait for pending exclusive operations to complete. The exclusive lock
|
||||||
|
Loading…
Reference in New Issue
Block a user