]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Limit rtc-reset-reinjection requirement to x86 only.
authorAndrea Bolognani <abologna@redhat.com>
Tue, 26 May 2015 16:13:40 +0000 (18:13 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Wed, 27 May 2015 14:59:25 +0000 (16:59 +0200)
The QMP command, like the interrupt reinjection logic it's connected
to, is only implemented in QEMU when TARGET_I386 is defined, so
checking for its availability on any other architecture is pointless.

On the other hand, when we're on x86, we shouldn still make sure that
rtc-reset-reinjection is available and refuse to set the time
otherwise.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1211938

src/qemu/qemu_driver.c

index 1233d8fa32eaf0e189177cf3ff709612c9ed9a03..d1b00a2014ba4d672408e4ff564e767630e89e95 100644 (file)
@@ -18946,7 +18946,12 @@ qemuDomainSetTime(virDomainPtr dom,
         goto endjob;
     }
 
-    if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_RTC_RESET_REINJECTION)) {
+    /* On x86, the rtc-reset-reinjection QMP command must be called after
+     * setting the time to avoid trouble down the line. If the command is
+     * not available, don't set the time at all and report an error */
+    if (ARCH_IS_X86(vm->def->os.arch) &&
+        !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_RTC_RESET_REINJECTION))
+    {
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                        _("cannot set time: qemu doesn't support "
                          "rtc-reset-reinjection command"));
@@ -18969,13 +18974,16 @@ qemuDomainSetTime(virDomainPtr dom,
         goto endjob;
     }
 
-    qemuDomainObjEnterMonitor(driver, vm);
-    rv = qemuMonitorRTCResetReinjection(priv->mon);
-    if (qemuDomainObjExitMonitor(driver, vm) < 0)
-        goto endjob;
+    /* Don't try to call rtc-reset-reinjection if it's not available */
+    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_RTC_RESET_REINJECTION)) {
+        qemuDomainObjEnterMonitor(driver, vm);
+        rv = qemuMonitorRTCResetReinjection(priv->mon);
+        if (qemuDomainObjExitMonitor(driver, vm) < 0)
+            goto endjob;
 
-    if (rv < 0)
-        goto endjob;
+        if (rv < 0)
+            goto endjob;
+    }
 
     ret = 0;