]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_agent: Ignore expected EOFs
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 21 Jan 2013 10:52:44 +0000 (11:52 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 23 Jan 2013 14:35:44 +0000 (15:35 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=892079

One of my previous patches (f2a4e5f176c408) tried to fix crashing
libvirtd on domain detroy. However, we need to copy pattern from
qemuProcessHandleMonitorEOF() instead of decrementing reference
counter. The rationale for this is, if qemu process is dying due
to domain being destroyed, we obtain EOF on both the monitor and
agent sockets. However, if the exit is expected, qemuProcessStop
is called, which cleans both agent and monitor sockets up. We
want qemuAgentClose() to be called iff the EOF is not expected,
so we don't leak an FD and memory. Moreover, there could be race
with qemuProcessHandleMonitorEOF() which could have already
closed the agent socket, in which case we don't want to do
anything.

src/qemu/qemu_process.c

index 2f0821518337d8ef349973fe1c59721900cb79da..55d00e33dc5801e69d8ba18c113223ebd69b35e3 100644 (file)
@@ -133,14 +133,29 @@ qemuProcessHandleAgentEOF(qemuAgentPtr agent,
     virObjectLock(vm);
 
     priv = vm->privateData;
-    if (priv->agent == agent &&
-        !virObjectUnref(priv->agent))
-        priv->agent = NULL;
+
+    if (!priv->agent) {
+        VIR_DEBUG("Agent freed already");
+        goto unlock;
+    }
+
+    if (priv->beingDestroyed) {
+        VIR_DEBUG("Domain is being destroyed, agent EOF is expected");
+        goto unlock;
+    }
+
+    priv->agent = NULL;
 
     virObjectUnlock(vm);
     qemuDriverUnlock(driver);
 
     qemuAgentClose(agent);
+    return;
+
+unlock:
+    virObjectUnlock(vm);
+    qemuDriverUnlock(driver);
+    return;
 }