[libvirt] [PATCH 22/34] Convert watchdog to -device

Daniel Veillard veillard at redhat.com
Fri Jan 15 16:51:16 UTC 2010


On Fri, Jan 08, 2010 at 05:23:18PM +0000, Daniel P. Berrange wrote:
> The current syntax for watchdogs is
> 
>     -watchdog i6300esb
> 
> The new syntax will now be
> 
>     -device i6300esb,id=watchdogNN,addr=<PCI-SLOT>
> ---
>  src/qemu/qemu_conf.c                               |   91 ++++++++++++++++++--
>  .../qemuxml2argv-watchdog-device.args              |    1 +
>  .../qemuxml2argv-watchdog-device.xml               |   23 +++++
>  tests/qemuxml2argvtest.c                           |    2 +
>  4 files changed, 109 insertions(+), 8 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.xml
> 
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index eded887..fa16f8c 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -1629,6 +1629,38 @@ qemuAssignDiskAliases(virDomainDefPtr def, int qemuCmdFlags)
>      return 0;
>  }
>  
> +static int
> +qemuBuildDeviceAddressStr(virBufferPtr buf,
> +                          virDomainDeviceInfoPtr info)
> +{
> +    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
> +        if (info->addr.pci.domain != 0) {
> +            qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                             _("Only PCI device addresses with domain=0 are supported"));
> +            return -1;
> +        }
> +        if (info->addr.pci.bus != 0) {
> +            qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                             _("Only PCI device addresses with bus=0 are supported"));
> +            return -1;
> +        }
> +        if (info->addr.pci.function != 0) {
> +            qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                             _("Only PCI device addresses with function=0 are supported"));
> +            return -1;
> +        }
> +
> +        /* XXX
> +         * When QEMU grows support for > 1 PCI bus, then pci.0 changes
> +         * to pci.1, pci.2, etc
> +         * When QEMU grows support for > 1 PCI domain, then pci.0 change
> +         * to pciNN.0  where NN is the domain number
> +         */
> +        virBufferVSprintf(buf, ",bus=pci.0,addr=0x%x", info->addr.pci.slot);
> +    }
> +    return 0;
> +}
> +
>  
>  static const char *
>  qemuNetTypeToHostNet(int type)
> @@ -1991,7 +2023,36 @@ qemuBuildHostNetStr(virConnectPtr conn,
>      return 0;
>  }
>  
> -/* This function outputs a -chardev command line option which describes only the
> +
> +static char *qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev)
> +{
> +    virBuffer buf = VIR_BUFFER_INITIALIZER;
> +
> +    const char *model = virDomainWatchdogModelTypeToString(dev->model);
> +    if (!model) {
> +        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> +                         "%s", _("missing watchdog model"));
> +        goto error;
> +    }
> +
> +    virBufferVSprintf(&buf, "%s", model);
> +    virBufferVSprintf(&buf, ",id=%s", dev->info.alias);
> +    if (qemuBuildDeviceAddressStr(&buf, &dev->info) < 0)
> +        goto error;
> +
> +    if (virBufferError(&buf)) {
> +        virReportOOMError(NULL);
> +        goto error;
> +    }
> +
> +    return virBufferContentAndReset(&buf);
> +
> +error:
> +    virBufferFreeAndReset(&buf);
> +    return NULL;
> +}
> +
> +/* this function outputs a -chardev command line option which describes only the
>   * host side of the character device */
>  static void qemudBuildCommandLineChrDevChardevStr(virDomainChrDefPtr dev,
>                                                    virBufferPtr buf)
> @@ -3086,14 +3147,28 @@ int qemudBuildCommandLine(virConnectPtr conn,
>      /* Add watchdog hardware */
>      if (def->watchdog) {
>          virDomainWatchdogDefPtr watchdog = def->watchdog;
> -        const char *model = virDomainWatchdogModelTypeToString(watchdog->model);
> -        if (!model) {
> -            qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> -                             "%s", _("invalid watchdog model"));
> -            goto error;
> +        char *optstr;
> +
> +        if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
> +            ADD_ARG_LIT("-device");
> +
> +            optstr = qemuBuildWatchdogDevStr(watchdog);
> +            if (!optstr)
> +                goto error;
> +        } else {
> +            ADD_ARG_LIT("-watchdog");
> +
> +            const char *model = virDomainWatchdogModelTypeToString(watchdog->model);
> +            if (!model) {
> +                qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> +                                 "%s", _("missing watchdog model"));
> +                goto error;
> +            }
> +
> +            if (!(optstr = strdup(model)))
> +                goto no_memory;
>          }
> -        ADD_ARG_LIT("-watchdog");
> -        ADD_ARG_LIT(model);
> +        ADD_ARG(optstr);
>  
>          const char *action = virDomainWatchdogActionTypeToString(watchdog->action);
>          if (!action) {
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.args b/tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.args
> new file mode 100644
> index 0000000..5f3a428
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.args
> @@ -0,0 +1 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -usb -device ib700,id=watchdog0 -watchdog-action poweroff
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.xml
> new file mode 100644
> index 0000000..9b2ffdf
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-watchdog-device.xml
> @@ -0,0 +1,23 @@
> +<domain type='qemu'>
> +  <name>QEMUGuest1</name>
> +  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> +  <memory>219200</memory>
> +  <currentMemory>219200</currentMemory>
> +  <vcpu>1</vcpu>
> +  <os>
> +    <type arch='i686' machine='pc'>hvm</type>
> +    <boot dev='hd'/>
> +  </os>
> +  <clock offset='utc'/>
> +  <on_poweroff>destroy</on_poweroff>
> +  <on_reboot>restart</on_reboot>
> +  <on_crash>destroy</on_crash>
> +  <devices>
> +    <emulator>/usr/bin/qemu</emulator>
> +    <disk type='block' device='disk'>
> +      <source dev='/dev/HostVG/QEMUGuest1'/>
> +      <target dev='hda' bus='ide'/>
> +    </disk>
> +    <watchdog model='ib700' action='poweroff'/>
> +  </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 42d1579..6bfc217 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -290,6 +290,8 @@ mymain(int argc, char **argv)
>  
>      DO_TEST("channel-guestfwd", QEMUD_CMD_FLAG_CHARDEV|QEMUD_CMD_FLAG_DEVICE);
>  
> +    DO_TEST("watchdog", 0);
> +    DO_TEST("watchdog-device", QEMUD_CMD_FLAG_DEVICE);
>      DO_TEST("sound", 0);
>  
>      DO_TEST("hostdev-usb-product", 0);

 ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list