On 09/20/2012 11:54 AM, Peter Krempa wrote: > On 09/19/12 19:22, Martin Kletzander wrote: >> 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"> > > As DanPB pointed out, this should be changed to camel case. > >> + <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)", > > Ew. Doing the XPath query twice seems like a waste to me. What about > using virStrToLong_i on the string instead of querying again? > >> + 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 */ >> > > ACK if you don't do the xpath query twice and (carefully) rename the > element. > > Peter I didn't realize the function does the same. It simplified the code a lot, I double checked that and pushed. Thanks. Martin -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list