[libvirt] [PATCH v2 1/3] Add support for reboot-timeout

Martin Kletzander mkletzan at redhat.com
Wed Sep 19 17:22:14 UTC 2012


Whenever the guest machine fails to boot, new parameter (reboot-timeout)
controls whether it should reboot and after how many ms it should do so.

Docs included.
---
 docs/formatdomain.html.in     | 11 ++++++++---
 docs/schemas/domaincommon.rng | 24 ++++++++++++++++++------
 src/conf/domain_conf.c        | 34 ++++++++++++++++++++++++++++------
 src/conf/domain_conf.h        |  3 +++
 4 files changed, 57 insertions(+), 15 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 51f897c..d021837 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -105,7 +105,7 @@
     <boot dev='cdrom'/>
     <bootmenu enable='yes'/>
     <smbios mode='sysinfo'/>
-    <bios useserial='yes'/>
+    <bios useserial='yes' reboot-timeout='0'/>
   </os>
   ...</pre>

@@ -175,8 +175,13 @@
         Serial Graphics Adapter which allows users to see BIOS messages
         on a serial port. Therefore, one needs to have
         <a href="#elementCharSerial">serial port</a> defined.
-        <span class="since">Since 0.9.4</span>
-      </dd>
+        <span class="since">Since 0.9.4</span>.
+        <span class="since">Since 0.10.2 (QEMU only)</span> there is
+        another attribute, <code>reboot-timeout</code> that controls
+        whether and after how long the guest should start booting
+        again in case the boot fails (according to BIOS). The value is
+        in milliseconds with maximum of <code>65535</code> and special
+        value <code>-1</code> disables the reboot.
     </dl>

     <h4><a name="elementsOSBootloader">Host bootloader</a></h4>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index aafb10c..ed25f58 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3190,12 +3190,19 @@

   <define name="bios">
     <element name="bios">
-      <attribute name="useserial">
-        <choice>
-          <value>yes</value>
-          <value>no</value>
-        </choice>
-      </attribute>
+      <optional>
+        <attribute name="useserial">
+          <choice>
+            <value>yes</value>
+            <value>no</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="reboot-timeout">
+          <ref name="RebootTimeout"/>
+        </attribute>
+      </optional>
     </element>
   </define>

@@ -3469,6 +3476,11 @@
       <param name='minInclusive'>-1</param>
     </data>
   </define>
+  <define name="RebootTimeout">
+    <data type="short">
+      <param name="minInclusive">-1</param>
+    </data>
+  </define>
   <define name="PortNumber">
     <data type="short">
       <param name="minInclusive">-1</param>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 35814fb..4714312 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8136,7 +8136,7 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
 {
     xmlNodePtr *nodes = NULL;
     int i, n;
-    char *bootstr;
+    char *bootstr, *tmp;
     char *useserial = NULL;
     int ret = -1;
     unsigned long deviceBoot, serialPorts;
@@ -8214,6 +8214,22 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
         }
     }

+    tmp = virXPathString("string(./os/bios[1]/@reboot-timeout)", ctxt);
+    if (tmp) {
+        /* that was really just for the check if it is there */
+        VIR_FREE(tmp);
+
+        if ((virXPathInt("string(./os/bios[1]/@reboot-timeout)",
+                         ctxt, &def->os.bios.rt_delay) < 0) ||
+            def->os.bios.rt_delay < -1 || def->os.bios.rt_delay > 65535) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("invalid value for reboot-timeout, "
+                             "must be in range [-1,65535]"));
+            goto cleanup;
+        }
+        def->os.bios.rt_set = true;
+    }
+
     *bootCount = deviceBoot;
     ret = 0;

@@ -13494,11 +13510,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
             virBufferAsprintf(buf, "    <bootmenu enable='%s'/>\n", enabled);
         }

-        if (def->os.bios.useserial) {
-            const char *useserial = (def->os.bios.useserial ==
-                                     VIR_DOMAIN_BIOS_USESERIAL_YES ? "yes"
-                                                                   : "no");
-            virBufferAsprintf(buf, "    <bios useserial='%s'/>\n", useserial);
+        if (def->os.bios.useserial || def->os.bios.rt_set) {
+            virBufferAddLit(buf, "    <bios");
+            if (def->os.bios.useserial)
+                virBufferAsprintf(buf, " useserial='%s'",
+                                  (def->os.bios.useserial ==
+                                   VIR_DOMAIN_BIOS_USESERIAL_YES ? "yes"
+                                                                   : "no"));
+            if (def->os.bios.rt_set)
+                virBufferAsprintf(buf, " reboot-timeout='%d'", def->os.bios.rt_delay);
+
+            virBufferAddLit(buf, "/>\n");
         }
     }

diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 510406a..d719d57 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1420,6 +1420,9 @@ typedef struct _virDomainBIOSDef virDomainBIOSDef;
 typedef virDomainBIOSDef *virDomainBIOSDefPtr;
 struct _virDomainBIOSDef {
     int useserial;
+    /* reboot-timeout parameters */
+    bool rt_set;
+    int rt_delay;
 };

 /* Operating system configuration data & machine / arch */
-- 
1.7.12




More information about the libvir-list mailing list