</optional>
</element>
</define>
+ <define name="memballoon">
+ <element name="memballoon">
+ <attribute name="model">
+ <choice>
+ <value>virtio</value>
+ <value>xen</value>
+ </choice>
+ </attribute>
+ <optional>
+ <ref name="address"/>
+ </optional>
+ </element>
+ </define>
<define name="parallel">
<element name="parallel">
<ref name="qemucdev"/>
<optional>
<ref name="watchdog"/>
</optional>
+ <optional>
+ <ref name="memballoon"/>
+ </optional>
</interleave>
</element>
</define>
"pcspk",
"ac97")
+VIR_ENUM_IMPL(virDomainMemballoonModel, VIR_DOMAIN_MEMBALLOON_MODEL_LAST,
+ "virtio",
+ "xen");
+
VIR_ENUM_IMPL(virDomainWatchdogModel, VIR_DOMAIN_WATCHDOG_MODEL_LAST,
"i6300esb",
"ib700")
VIR_FREE(def);
}
+void virDomainMemballoonDefFree(virDomainMemballoonDefPtr def)
+{
+ if (!def)
+ return;
+
+ virDomainDeviceInfoClear(&def->info);
+
+ VIR_FREE(def);
+}
+
void virDomainWatchdogDefFree(virDomainWatchdogDefPtr def)
{
if (!def)
if (def->watchdog)
if (cb(def, &def->watchdog->info, opaque) < 0)
return -1;
+ if (def->memballoon)
+ if (cb(def, &def->memballoon->info, opaque) < 0)
+ return -1;
if (def->console)
if (cb(def, &def->console->info, opaque) < 0)
return -1;
}
+static virDomainMemballoonDefPtr
+virDomainMemballoonDefParseXML(const xmlNodePtr node,
+ int flags)
+{
+ char *model;
+ virDomainMemballoonDefPtr def;
+
+ if (VIR_ALLOC(def) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ model = virXMLPropString(node, "model");
+ if ((def->model = virDomainMemballoonModelTypeFromString(model)) < 0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown memory balloon model '%s'"), model);
+ goto error;
+ }
+
+ if (virDomainDeviceInfoParseXML(node, &def->info, flags) < 0)
+ goto error;
+
+cleanup:
+ VIR_FREE(model);
+
+ return def;
+
+error:
+ virDomainMemballoonDefFree(def);
+ def = NULL;
+ goto cleanup;
+}
+
+
int
virDomainVideoDefaultRAM(virDomainDefPtr def,
int type)
VIR_FREE(nodes);
}
+ /* analysis of the memballoon devices */
+ def->memballoon = NULL;
+ if ((n = virXPathNodeSet("./devices/memballoon", ctxt, &nodes)) < 0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("cannot extract memory balloon devices"));
+ goto error;
+ }
+ if (n > 1) {
+ virDomainReportError (VIR_ERR_INTERNAL_ERROR,
+ "%s", _("only a single memory balloon device is supported"));
+ goto error;
+ }
+ if (n > 0) {
+ virDomainMemballoonDefPtr memballoon =
+ virDomainMemballoonDefParseXML(nodes[0], flags);
+ if (!memballoon)
+ goto error;
+
+ def->memballoon = memballoon;
+ VIR_FREE(nodes);
+ } else {
+ if (def->virtType == VIR_DOMAIN_VIRT_XEN ||
+ def->virtType == VIR_DOMAIN_VIRT_QEMU ||
+ def->virtType == VIR_DOMAIN_VIRT_KQEMU ||
+ def->virtType == VIR_DOMAIN_VIRT_KVM) {
+ virDomainMemballoonDefPtr memballoon;
+ if (VIR_ALLOC(memballoon) < 0)
+ goto no_memory;
+ memballoon->model = def->virtType == VIR_DOMAIN_VIRT_XEN ?
+ VIR_DOMAIN_MEMBALLOON_MODEL_XEN :
+ VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO;
+ def->memballoon = memballoon;
+ }
+ }
+
/* analysis of security label */
if (virSecurityLabelDefParseXML(def, ctxt, flags) == -1)
goto error;
}
+static int
+virDomainMemballoonDefFormat(virBufferPtr buf,
+ virDomainMemballoonDefPtr def,
+ int flags)
+{
+ const char *model = virDomainMemballoonModelTypeToString(def->model);
+
+ if (!model) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unexpected memballoon model %d"), def->model);
+ return -1;
+ }
+
+ virBufferVSprintf(buf, " <memballoon model='%s'",
+ model);
+
+ if (virDomainDeviceInfoIsSet(&def->info)) {
+ virBufferAddLit(buf, ">\n");
+ if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ return -1;
+ virBufferAddLit(buf, " </memballoon>\n");
+ } else {
+ virBufferAddLit(buf, "/>\n");
+ }
+
+ return 0;
+}
+
+
static int
virDomainWatchdogDefFormat(virBufferPtr buf,
virDomainWatchdogDefPtr def,
if (def->watchdog)
virDomainWatchdogDefFormat (&buf, def->watchdog, flags);
+ if (def->memballoon)
+ virDomainMemballoonDefFormat (&buf, def->memballoon, flags);
+
virBufferAddLit(&buf, " </devices>\n");
if (def->seclabel.model) {
virDomainDeviceInfo info; /* Guest address */
};
+
+enum {
+ VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO,
+ VIR_DOMAIN_MEMBALLOON_MODEL_XEN,
+
+ VIR_DOMAIN_MEMBALLOON_MODEL_LAST
+};
+
+typedef struct _virDomainMemballoonDef virDomainMemballoonDef;
+typedef virDomainMemballoonDef *virDomainMemballoonDefPtr;
+struct _virDomainMemballoonDef {
+ int model;
+ virDomainDeviceInfo info;
+};
+
+
/* Flags for the 'type' field in next struct */
enum virDomainDeviceType {
VIR_DOMAIN_DEVICE_DISK,
virDomainChrDefPtr console;
virSecurityLabelDef seclabel;
virDomainWatchdogDefPtr watchdog;
+ virDomainMemballoonDefPtr memballoon;
virCPUDefPtr cpu;
};
void virDomainNetDefFree(virDomainNetDefPtr def);
void virDomainChrDefFree(virDomainChrDefPtr def);
void virDomainSoundDefFree(virDomainSoundDefPtr def);
+void virDomainMemballoonDefFree(virDomainMemballoonDefPtr def);
void virDomainWatchdogDefFree(virDomainWatchdogDefPtr def);
void virDomainVideoDefFree(virDomainVideoDefPtr def);
void virDomainHostdevDefFree(virDomainHostdevDefPtr def);
VIR_ENUM_DECL(virDomainChrTarget)
VIR_ENUM_DECL(virDomainChr)
VIR_ENUM_DECL(virDomainSoundModel)
+VIR_ENUM_DECL(virDomainMemballoonModel)
VIR_ENUM_DECL(virDomainWatchdogModel)
VIR_ENUM_DECL(virDomainWatchdogAction)
VIR_ENUM_DECL(virDomainVideo)
virDomainSoundDefFree;
virDomainSoundModelTypeFromString;
virDomainSoundModelTypeToString;
+virDomainMemballoonModelTypeFromString;
+virDomainMemballoonModelTypeToString;
virDomainWatchdogModelTypeFromString;
virDomainWatchdogModelTypeToString;
virDomainWatchdogActionTypeFromString;
if (virAsprintf(&def->watchdog->info.alias, "watchdog%d", 0) < 0)
goto no_memory;
}
+ if (def->memballoon) {
+ if (virAsprintf(&def->memballoon->info.alias, "balloon%d", 0) < 0)
+ goto no_memory;
+ }
return 0;
}
/* VirtIO balloon always at slot 3 by default */
- if (qemuDomainPCIAddressReserveSlot(addrs, 3) < 0)
- goto error;
+ if (def->memballoon &&
+ def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO &&
+ def->memballoon->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
+ def->memballoon->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
+ def->memballoon->info.addr.pci.domain = 0;
+ def->memballoon->info.addr.pci.bus = 0;
+ def->memballoon->info.addr.pci.slot = 3;
+ def->memballoon->info.addr.pci.function = 0;
+ if (qemuDomainPCIAddressReserveSlot(addrs, 3) < 0)
+ goto error;
+ }
for (i = 0; i < def->ndisks ; i++) {
if (def->disks[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
}
+char *
+qemuBuildMemballoonDevStr(virDomainMemballoonDefPtr dev)
+{
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ virBufferAddLit(&buf, "virtio-balloon-pci");
+ virBufferVSprintf(&buf, ",id=%s", dev->info.alias);
+ if (qemuBuildDeviceAddressStr(&buf, &dev->info) < 0)
+ goto error;
+
+ if (virBufferError(&buf)) {
+ virReportOOMError();
+ goto error;
+ }
+
+ return virBufferContentAndReset(&buf);
+
+error:
+ virBufferFreeAndReset(&buf);
+ return NULL;
+}
+
+
char *
qemuBuildUSBInputDevStr(virDomainInputDefPtr dev)
{
* NB: Earlier we declared that VirtIO balloon will always be in
* slot 0x3 on bus 0x0
*/
- if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
- ADD_ARG_LIT("-device");
- ADD_ARG_LIT("virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3");
- } else if (qemuCmdFlags & QEMUD_CMD_FLAG_BALLOON) {
- ADD_ARG_LIT("-balloon");
- ADD_ARG_LIT("virtio");
+ if (def->memballoon) {
+ if (def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO) {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Memory balloon device type '%s' is not supported by this version of qemu"),
+ virDomainMemballoonModelTypeToString(def->memballoon->model));
+ goto error;
+ }
+ if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
+ char *optstr;
+ ADD_ARG_LIT("-device");
+
+ optstr = qemuBuildMemballoonDevStr(def->memballoon);
+ if (!optstr)
+ goto error;
+ ADD_ARG(optstr);
+ } else if (qemuCmdFlags & QEMUD_CMD_FLAG_BALLOON) {
+ ADD_ARG_LIT("-balloon");
+ ADD_ARG_LIT("virtio");
+ }
}
if (current_snapshot && current_snapshot->def->active) {
def->videos[def->nvideos++] = vid;
}
+ if (!def->memballoon) {
+ virDomainMemballoonDefPtr memballoon;
+ if (VIR_ALLOC(memballoon) < 0)
+ goto no_memory;
+ memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO;
+
+ def->memballoon = memballoon;
+ }
+
VIR_FREE(nics);
if (!def->name) {
char * qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev);
+char * qemuBuildMemballoonDevStr(virDomainMemballoonDefPtr dev);
+
char * qemuBuildUSBInputDevStr(virDomainInputDefPtr dev);
char * qemuBuildSoundDevStr(virDomainSoundDefPtr sound);
#define QEMU_PCI_PRODUCT_DISK_VIRTIO 0x1001
+#define QEMU_PCI_PRODUCT_BALLOON_VIRTIO 0x1002
+
#define QEMU_PCI_PRODUCT_NIC_NE2K 0x8029
#define QEMU_PCI_PRODUCT_NIC_PCNET 0x2000
#define QEMU_PCI_PRODUCT_NIC_RTL8139 0x8139
}
+static int
+qemuGetPCIMemballoonVendorProduct(virDomainMemballoonDefPtr def,
+ unsigned *vendor,
+ unsigned *product)
+{
+ switch (def->model) {
+ case VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO:
+ *vendor = QEMU_PCI_VENDOR_REDHAT;
+ *product = QEMU_PCI_PRODUCT_BALLOON_VIRTIO;
+ break;
+
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+
/*
* This entire method assumes that PCI devices in 'info pci'
* match ordering of devices specified on the command line
continue;
if (qemuAssignNextPCIAddress(&(vm->def->sounds[i]->info),
- vendor, product,
+ vendor, product,
addrs, naddrs) < 0) {
qemuReportError(VIR_ERR_INTERNAL_ERROR,
_("cannot find PCI address for sound adapter %s"),
}
}
+ if (vm->def->memballoon &&
+ qemuGetPCIMemballoonVendorProduct(vm->def->memballoon, &vendor, &product) == 0) {
+ if (qemuAssignNextPCIAddress(&(vm->def->memballoon->info),
+ vendor, product,
+ addrs, naddrs) < 0) {
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ _("cannot find PCI address for balloon %s"),
+ virDomainMemballoonModelTypeToString(vm->def->memballoon->model));
+ return -1;
+ }
+ }
+
/* XXX console (virtio) */
/* XXX USB controller ? */
- /* XXXX virtio balloon ? */
-
/* XXX what about other PCI devices (ie bridges) */
return 0;
</console>
<sound model='pcspk'/>
<sound model='es1370'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
EOF
--- /dev/null
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x12
--- /dev/null
+<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>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0' bus='0' slot='18' function='0'/>
+ </memballoon>
+ </devices>
+</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
</disk>
<controller type='fdc' index='0'/>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source path='/tmp/guestfwd'/>
<target type='guestfwd' address='10.0.2.1' port='4600'/>
</channel>
+ <memballoon model='virtio'/>
</devices>
</domain>
<target type='virtio' name='org.linux-kvm.port.lla'/>
<address type='virtio-serial' controller='2' bus='0'/>
</channel>
+ <memballoon model='virtio'/>
</devices>
</domain>
<target type='virtio' name='org.linux-kvm.port.foo'/>
<address type='virtio-serial' controller='1' bus='0' port='3'/>
</channel>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='pty'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='pty'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
</disk>
<controller type='fdc' index='0'/>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='1' unit='1'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source file='/tmp/usbdisk.img'/>
<target dev='sda' bus='usb'/>
</disk>
+ <memballoon model='virtio'/>
</devices>
</domain>
<target dev='sda' bus='usb'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<target dev='vdb' bus='virtio'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<target dev='xvdg' bus='xen'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
</encryption>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
+ <memballoon model='virtio'/>
</devices>
</domain>
</disk>
<controller type='ide' index='0'/>
<controller type='fdc' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
+ <memballoon model='virtio'/>
</devices>
</domain>
<video>
<model type='vga' vram='9216' heads='1'/>
</video>
+ <memballoon model='virtio'/>
</devices>
</domain>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
+ <memballoon model='virtio'/>
</devices>
</domain>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
+ <memballoon model='virtio'/>
</devices>
</domain>
<video>
<model type='cirrus' vram='9216' heads='1'/>
</video>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
</source>
</hostdev>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
</source>
</hostdev>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address bus='14' device='6'/>
</source>
</hostdev>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address bus='14' device='6'/>
</source>
</hostdev>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
</disk>
<controller type='ide' index='0'/>
<input type='mouse' bus='usb'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
</disk>
<controller type='ide' index='0'/>
<input type='tablet' bus='usb'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<video>
<model type='xen' vram='4096' heads='1'/>
</video>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<script path='/etc/qemu-ifup'/>
<target dev='nic02'/>
</interface>
+ <memballoon model='virtio'/>
</devices>
</domain>
<script path='/etc/qemu-ifup'/>
<model type='e1000'/>
</interface>
+ <memballoon model='virtio'/>
</devices>
</domain>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
</interface>
+ <memballoon model='virtio'/>
</devices>
</domain>
<interface type='user'>
<mac address='00:11:22:33:44:55'/>
</interface>
+ <memballoon model='virtio'/>
</devices>
</domain>
<mac address='00:11:22:33:44:55'/>
<model type='virtio'/>
</interface>
+ <memballoon model='virtio'/>
</devices>
</domain>
<mac address='00:11:22:33:44:55'/>
<model type='virtio'/>
</interface>
+ <memballoon model='virtio'/>
</devices>
</domain>
<mac address='00:11:22:33:44:55'/>
<model type='virtio'/>
</interface>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<protocol type='raw'/>
<target port='0'/>
</parallel>
+ <memballoon model='virtio'/>
</devices>
</domain>
<protocol type='raw'/>
<target port='0'/>
</parallel>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source path='/dev/ttyS2'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source path='/dev/ttyS2'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source path='/tmp/serial.log'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source path='/tmp/serial.log'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='pty'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='pty'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='pty'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='pty'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<protocol type='raw'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<protocol type='telnet'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<protocol type='telnet'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<protocol type='raw'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source mode='connect' host='127.0.0.1' service='9998'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source mode='connect' host='127.0.0.1' service='9998'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source mode='connect' path='/tmp/serial.sock'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<source mode='connect' path='/tmp/serial.sock'/>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='vc'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<console type='vc'>
<target port='0'/>
</console>
+ <memballoon model='virtio'/>
</devices>
</domain>
<sound model='es1370'/>
<sound model='sb16'/>
<sound model='ac97'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<sound model='es1370'/>
<sound model='sb16'/>
<sound model='ac97'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
<target dev='hda' bus='ide'/>
</disk>
<watchdog model='ib700' action='poweroff'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
</disk>
<controller type='ide' index='0'/>
<watchdog model='ib700' action='poweroff'/>
+ <memballoon model='virtio'/>
</devices>
</domain>
DO_TEST("watchdog", 0);
DO_TEST("watchdog-device", QEMUD_CMD_FLAG_DEVICE |
QEMUD_CMD_FLAG_NODEFCONFIG);
+ DO_TEST("balloon-device", QEMUD_CMD_FLAG_DEVICE |
+ QEMUD_CMD_FLAG_NODEFCONFIG);
DO_TEST("sound", 0);
DO_TEST("sound-device", QEMUD_CMD_FLAG_DEVICE |
QEMUD_CMD_FLAG_NODEFCONFIG);