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@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list