diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 489cec8928..d8206564aa 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3969,6 +3969,26 @@ qemu-kvm -net nic,model=? /dev/null +
+ ... + <devices> + <interface type='network'> + <source network='default'/> + <target dev='vnet1'/> + <model type='virtio'/> + <backend tap='/dev/net/tun' vhost='/dev/net-vhost'/> + <driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off' queues='5'/> + </interface> + </devices> + ...+ +
+ For tuning the backend of the network, the backend
element
+ can be used. Supported attributes are tap
and vhost
,
+ allowing to override the default devices for creating tap and vhost devices.
+
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index dd55a99d17..c600f2253e 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -2346,6 +2346,16 @@+ + + ++ + ++ + +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 75811e5805..3ccec1c7f0 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); @@ -7049,6 +7051,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; @@ -16700,6 +16705,12 @@ virDomainNetDefFormat(virBufferPtr buf, VIR_FREE(str); } } + if (def->backend.tap || def->backend.vhost) { + virBufferAddLit(buf, " 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 0862bd7e9b..640a4c5301 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 0000000000..3237c6a398 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-tap-vhost.xml @@ -0,0 +1,52 @@ + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 195929145a..ead5d082e3 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -399,6 +399,8 @@ mymain(void) DO_TEST("bios-nvram"); + DO_TEST("tap-vhost"); + virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt);test +bba65c0e-c049-934f-b6aa-4e2c0582acdf +1048576 +1048576 +1 ++ +hvm ++ + + + destroy +restart +restart ++ +/usr/bin/qemu ++ ++ + + + + ++ + + + + + + + ++ + + ++ + + + + ++ + ++ +