For tuning the network, alternative devices
for creating tap and vhost devices can be specified via:
<backend tap='/dev/net/tun' vhost='/dev/net-vhost'/>
---
docs/formatdomain.html.in | 20 +++++++++
docs/schemas/domaincommon.rng | 10 +++++
src/conf/domain_conf.c | 11 +++++
src/conf/domain_conf.h | 4 ++
tests/qemuxml2argvdata/qemuxml2argv-tap-vhost.xml | 52 +++++++++++++++++++++++
tests/qemuxml2xmltest.c | 2 +
6 files changed, 99 insertions(+)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-tap-vhost.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index a2ea758..bb50cb4 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3951,6 +3951,26 @@ qemu-kvm -net nic,model=? /dev/null
</dd>
</dl>
+ <h5><a name="elementsBackendOptions">Setting network
backend-specific options</a></h5>
+
+<pre>
+ ...
+ <devices>
+ <interface type='network'>
+ <source network='default'/>
+ <target dev='vnet1'/>
+ <model type='virtio'/>
+ <b><backend tap='/dev/net/tun'
vhost='/dev/net-vhost'/></b>
+ <driver name='vhost' txmode='iothread'
ioeventfd='on' event_idx='off' queues='5'/>
+ </interface>
+ </devices>
+ ...</pre>
+
+ <p>
+ For tuning the backend of the network, the <code>backend</code>
element
+ can be used. Supported attributes are <code>tap</code> and
<code>vhost</code>,
+ allowing to override the default devices for creating tap and vhost devices.
+ </p>
<h5><a name="elementsNICSTargetOverride">Overriding the target
element</a></h5>
<pre>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 6ae940a..a9be522 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2335,6 +2335,16 @@
</element>
</optional>
<optional>
+ <element name="backend">
+ <attribute name='tap'>
+ <ref name='absFilePath'/>
+ </attribute>
+ <attribute name='vhost'>
+ <ref name='absFilePath'/>
+ </attribute>
+ </element>
+ </optional>
+ <optional>
<element name="driver">
<choice>
<group>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a2a7d92..4b8303e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1415,6 +1415,8 @@ void virDomainNetDefFree(virDomainNetDefPtr def)
break;
}
+ VIR_FREE(def->backend.tap);
+ VIR_FREE(def->backend.vhost);
VIR_FREE(def->virtPortProfile);
VIR_FREE(def->script);
VIR_FREE(def->ifname);
@@ -7046,6 +7048,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
} else if (xmlStrEqual(cur->name, BAD_CAST "vlan")) {
if (virNetDevVlanParse(cur, ctxt, &def->vlan) < 0)
goto error;
+ } else if (xmlStrEqual(cur->name, BAD_CAST "backend")) {
+ def->backend.tap = virXMLPropString(cur, "tap");
+ def->backend.vhost = virXMLPropString(cur, "vhost");
}
}
cur = cur->next;
@@ -16602,6 +16607,12 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "/>\n");
}
}
+ if (def->backend.tap || def->backend.vhost) {
+ virBufferAddLit(buf, "<backend");
+ virBufferEscapeString(buf, " tap='%s'", def->backend.tap);
+ virBufferEscapeString(buf, " vhost='%s'",
def->backend.vhost);
+ virBufferAddLit(buf, "/>\n");
+ }
if (def->filter) {
if (virNWFilterFormatParamAttributes(buf, def->filterparams,
def->filter) < 0)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index efae2f5..f055188 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -897,6 +897,10 @@ struct _virDomainNetDef {
unsigned int queues; /* Multiqueue virtio-net */
} virtio;
} driver;
+ struct {
+ char *tap;
+ char *vhost;
+ } backend;
union {
struct {
char *dev;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-tap-vhost.xml
b/tests/qemuxml2argvdata/qemuxml2argv-tap-vhost.xml
new file mode 100644
index 0000000..3237c6a
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-tap-vhost.xml
@@ -0,0 +1,52 @@
+<domain type='qemu'>
+ <name>test</name>
+ <uuid>bba65c0e-c049-934f-b6aa-4e2c0582acdf</uuid>
+ <memory unit='KiB'>1048576</memory>
+ <currentMemory unit='KiB'>1048576</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc-0.13'>hvm</type>
+ <boot dev='cdrom'/>
+ <boot dev='hd'/>
+ <bootmenu enable='yes'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>restart</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='qcow2' event_idx='on'/>
+ <source file='/var/lib/libvirt/images/f14.img'/>
+ <target dev='vda' bus='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0'/>
+ </disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
+ <target dev='hdc' bus='ide'/>
+ <readonly/>
+ <address type='drive' controller='0' bus='1'
target='0' unit='0'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='virtio-serial' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x06' function='0x0'/>
+ </controller>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <interface type='user'>
+ <mac address='52:54:00:e5:48:58'/>
+ <model type='virtio'/>
+ <driver name='vhost' queues='5'/>
+ <backend tap='/dev/null' vhost='/dev/zero'/>
+ </interface>
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' port='0'/>
+ </console>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 34cdb97..5a996c4 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -398,6 +398,8 @@ mymain(void)
DO_TEST("bios-nvram");
+ DO_TEST("tap-vhost");
+
virObjectUnref(driver.caps);
virObjectUnref(driver.xmlopt);
--
1.8.5.5