[libvirt] [PATCH] libxl: find virDomainObj in libxlDomainShutdownThread

Jim Fehlig jfehlig at suse.com
Tue Sep 27 15:16:23 UTC 2016


Martin Kletzander wrote:
> On Wed, Sep 21, 2016 at 03:29:49PM -0600, Jim Fehlig wrote:
>> libxl events are delivered to libvirt via the libxlDomainEventHandler
>> callback registered with libxl. Documenation in
>> $xensrc/tools/libxl/libxl_event.h states that the callback "may occur
>> on any thread in which the application calls libxl". This can result
>> in deadlock since many of the libvirt callees of libxl hold a lock on
>> the virDomainObj they are working on. When the callback is invoked, it
>> attempts to find a virDomainObj corresponding to the domain ID provided
>> by libxl. Searching the domain obj list results in locking each obj
>> before checking if it is active, and its ID equals the requested ID.
>> Deadlock is possible when attempting to lock an obj that is already
>> locked further up the call stack. Indeed, Max Ustermann reported an
>> instance of this deadlock
>>
>> https://www.redhat.com/archives/libvir-list/2015-November/msg00130.html
>>
>> Guido Rossmueller also recently stumbled across it
>>
>> https://www.redhat.com/archives/libvir-list/2016-September/msg00287.html
>>
>> Fix the deadlock by moving the lookup of virDomainObj to the
>> libxlDomainShutdownThread. After this patch, libxl events are
>> enqueued on the libvirt side and processed by dedicated thread,
>> avoiding the described deadlock.
>>
> 
> Makes sense, passing locked object to another thread is not good, the
> references match, so even though I cannot test this out, I'm fairly sure
> when giving it an ACK.

Thanks Martin! I finally got around to pushing this before the freeze.

Regards,
Jim






More information about the libvir-list mailing list