libvirtd deadlock on shutdown

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm looking into a libvirtd deadlock on daemon shutdown.  The deadlock
occurs when shutting down virNetServer.  If the handling of a job is in
flight in virNetServerHandleJob(), the virNetServer lock is acquired
when freeing job->prog (src/rpc/virnetserver.c:167).  But the lock is
already held in virNetServerFree(), which is blocked in
virThreadPoolFree() waiting for all the workers to finish.  No progress
can be made.

The attached hack fixes the problem, but I'm not convinced this is an
appropriate fix.  Is it necessary to hold the virNetServer lock when
calling virNetServerProgramFree(job->prog)?  I notice the lock is not
held in the error path of virNetServerHandleJob().

Thanks,
Jim

diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
index ae19e84..edd3196 100644
--- a/src/rpc/virnetserver.c
+++ b/src/rpc/virnetserver.c
@@ -774,7 +774,9 @@ void virNetServerFree(virNetServerPtr srv)
     for (i = 0 ; i < srv->nservices ; i++)
         virNetServerServiceToggle(srv->services[i], false);
 
+    virNetServerUnlock(srv);
     virThreadPoolFree(srv->workers);
+    virNetServerLock(srv);
 
     for (i = 0 ; i < srv->nsignals ; i++) {
         sigaction(srv->signals[i]->signum, &srv->signals[i]->oldaction, NULL);
--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]