
On 03/07/2011 03:03 AM, Daniel P. Berrange wrote:
I think the real reason for the deadlock is that:
qemudDomainSaveFlag holds the domain lock while it calls qemuDomainEventQueue, which requests the event loop lock
the event loop thread holds the event loop lock, and can make several different callbacks that can result in requesting a domain lock
I don't think this can be the deadlock scenario. The event loop lock is completely isolated from other locks, because it is only ever held while code in event.c is executing. It is always released when invoking any external callbacks, so you can't have any lock ordering dependencies wrt the event loop lock.
But right now, the event loop lock _is_ held while calling the destroy callbacks; see virEventCleanupHandles. Would it be better to break the deadlock by dropping the event loop lock there? Oh, serves me right for reading email in order; I just noticed that this has been suggested already: https://www.redhat.com/archives/libvir-list/2011-March/msg00218.html https://www.redhat.com/archives/libvir-list/2011-March/msg00232.html -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org