• M
    qemu: Fix deadlock across fork() in QEMU driver · e22de286
    Marc Hartmayer 提交于
    The functions in virCommand() after fork() must be careful with regard
    to accessing any mutexes that may have been locked by other threads in
    the parent process. It is possible that another thread in the parent
    process holds the lock for the virQEMUDriver while fork() is called.
    This leads to a deadlock in the child process when
    'virQEMUDriverGetConfig(driver)' is called and therefore the handshake
    never completes between the child and the parent process. Ultimately
    the virDomainObjectPtr will never be unlocked.
    
    It gets much worse if the other thread of the parent process, that
    holds the lock for the virQEMUDriver, tries to lock the already locked
    virDomainObject. This leads to a completely unresponsive libvirtd.
    
    It's possible to reproduce this case with calling 'virsh start XXX'
    and 'virsh managedsave XXX' in a tight loop for multiple domains.
    
    This commit fixes the deadlock in the same way as it is described in
    commit 61b52d2e.
    Signed-off-by: NMarc Hartmayer <mhartmay@linux.vnet.ibm.com>
    Reviewed-by: NBoris Fiuczynski <fiuczy@linux.vnet.ibm.com>
    e22de286
qemu_domain.c 248.1 KB