Marek Marczykowski-Górecki wrote: > From: Marek Marczykowski <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > > At least Xen supports backend drivers in another domain (aka "driver > domain"). This patch introduces XML config option for such setting as > 'domain' attribute of 'source' element. Verification its content is left > for the driver. > > In the future same option will be needed for USB devices (hostdev > objects), but for now libxl doesn't have support for PVUSB. > > Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > --- > Changes in v2: > - describe in docs/formatdomain.html.in > - enforce empty domain tag (only 'name' attribute allowed) > > Changes in v3: > - change <domain name='xx'/> element to domain='' attribute of source > element - this is more logical place > - grammar of docs > > Changes in v4: > - revert back to separate element, named <backenddomain name='xx'/> > > docs/formatdomain.html.in | 29 +++++++++++++++++++++++++++++ > docs/schemas/domaincommon.rng | 16 ++++++++++++++++ > src/conf/domain_conf.c | 21 +++++++++++++++++++++ > src/conf/domain_conf.h | 2 ++ > 4 files changed, 68 insertions(+) > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index c5ad6f4..16d8b5c 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -2357,6 +2357,13 @@ > </li> > </ul> > </dd> > + <dt><code>backenddomain</code></dt> > + <dd>The optional <code>backenddomain</code> element allows specifying a backend > + domain (aka driver domain) for the device. If the real device/file resides > + in some other domain on the same host, use the <code>name</code> > + attribute to specify its name. > I shortened the long lines and changed the text a bit. > + <span class="since">Since 1.2.13 (Xen only)</span> > + </dd> > <dt><code>boot</code></dt> > <dd>Specifies that the disk is bootable. The <code>order</code> > attribute determines the order in which devices will be tried during > @@ -4235,6 +4242,28 @@ qemu-kvm -net nic,model=? /dev/null > network device. > <span class="since">Since 0.9.10 (QEMU and KVM only)</span>. > </p> > + <h5><a name="elementDomain">Setting up a network backend in a driver domain</a></h5> > +<pre> > + ... > + <devices> > + ... > + <interface type='bridge'> > + <source bridge='br0'/> > + <b><backenddomain name='netvm'/></b> > + </interface> > + ... > + </devices> > + ...</pre> > + > + <p> > + The optional <code>backenddomain</code> element allows specifying a backend > + domain (aka driver domain) for the device. Use the <code>name</code> attribute > + to specify its name. You can use it to create a direct network link between > + domains (so data will not go through host system). Use with type 'ethernet' > + to create plain network link, or with 'bridge' to connect to some bridge > + inside the driver domain. > Same here. > + <span class="since">Since 1.2.13 (Xen only)</span> > + </p> > > <h5><a name="elementQoS">Quality of service</a></h5> > > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index d467dce..6721431 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -1127,6 +1127,14 @@ > </optional> > <ref name="target"/> > <optional> > + <element name="backenddomain"> > + <attribute name="name"> > + <ref name="domainName"/> > + </attribute> > + <empty/> > + </element> > + </optional> > + <optional> > I moved this below "devcieBoot", since it seemed to fit there better :-). > <ref name="deviceBoot"/> > </optional> > <optional> > @@ -2328,6 +2336,14 @@ > </element> > </optional> > <optional> > + <element name="backenddomain"> > + <attribute name="name"> > + <ref name="domainName"/> > + </attribute> > + <empty/> > + </element> > + </optional> > + <optional> > <element name="model"> > <attribute name="type"> > <data type="string"> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 4251b13..657b71f 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -1260,6 +1260,7 @@ virDomainDiskDefFree(virDomainDiskDefPtr def) > VIR_FREE(def->wwn); > VIR_FREE(def->vendor); > VIR_FREE(def->product); > + VIR_FREE(def->domain_name); > virDomainDeviceInfoClear(&def->info); > > VIR_FREE(def); > @@ -1442,6 +1443,7 @@ void virDomainNetDefFree(virDomainNetDefPtr def) > VIR_FREE(def->backend.vhost); > VIR_FREE(def->virtPortProfile); > VIR_FREE(def->script); > + VIR_FREE(def->domain_name); > VIR_FREE(def->ifname); > VIR_FREE(def->ifname_guest); > VIR_FREE(def->ifname_guest_actual); > @@ -5725,6 +5727,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, > char *discard = NULL; > char *mirrorFormat = NULL; > char *mirrorType = NULL; > + char *domain_name = NULL; > int expected_secret_usage = -1; > int auth_secret_usage = -1; > int ret = 0; > @@ -5790,6 +5793,9 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, > if (target && > STRPREFIX(target, "ioemu:")) > memmove(target, target+6, strlen(target)-5); > + } else if (!domain_name && > + xmlStrEqual(cur->name, BAD_CAST "backenddomain")) { > + domain_name = virXMLPropString(cur, "name"); > } else if (xmlStrEqual(cur->name, BAD_CAST "geometry")) { > if (virXPathUInt("string(./geometry/@cyls)", > ctxt, &def->geometry.cylinders) < 0) { > @@ -6514,6 +6520,8 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, > driverName = NULL; > def->src->encryption = encryption; > encryption = NULL; > + def->domain_name = domain_name; > + domain_name = NULL; > def->serial = serial; > serial = NULL; > def->wwn = wwn; > @@ -6576,6 +6584,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, > VIR_FREE(product); > VIR_FREE(mirrorType); > VIR_FREE(mirrorFormat); > + VIR_FREE(domain_name); > > ctxt->node = save_ctxt; > return def; > @@ -7365,6 +7374,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, > char *mode = NULL; > char *linkstate = NULL; > char *addrtype = NULL; > + char *domain_name = NULL; > char *vhostuser_mode = NULL; > char *vhostuser_path = NULL; > char *vhostuser_type = NULL; > @@ -7503,6 +7513,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, > } else if (!script && > xmlStrEqual(cur->name, BAD_CAST "script")) { > script = virXMLPropString(cur, "path"); > + } else if (!domain_name && > + xmlStrEqual(cur->name, BAD_CAST "backenddomain")) { > + domain_name = virXMLPropString(cur, "name"); > } else if (xmlStrEqual(cur->name, BAD_CAST "model")) { > model = virXMLPropString(cur, "type"); > } else if (xmlStrEqual(cur->name, BAD_CAST "driver")) { > @@ -7802,6 +7815,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, > def->script = script; > script = NULL; > } > + if (domain_name != NULL) { > + def->domain_name = domain_name; > + domain_name = NULL; > + } > if (ifname != NULL) { > def->ifname = ifname; > ifname = NULL; > @@ -8059,6 +8076,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, > VIR_FREE(mode); > VIR_FREE(linkstate); > VIR_FREE(addrtype); > + VIR_FREE(domain_name); > VIR_FREE(trustGuestRxFilters); > VIR_FREE(ips); > virNWFilterHashTableFree(filterparams); > @@ -16820,6 +16838,8 @@ virDomainDiskDefFormat(virBufferPtr buf, > def->src->backingStoreRaw, 1) < 0) > return -1; > > + virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name); > + > virDomainDiskGeometryDefFormat(buf, def); > virDomainDiskBlockIoDefFormat(buf, def); > > @@ -17786,6 +17806,7 @@ virDomainNetDefFormat(virBufferPtr buf, > > virBufferEscapeString(buf, "<script path='%s'/>\n", > def->script); > + virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name); > if (def->ifname && > !((flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) && > (STRPREFIX(def->ifname, VIR_NET_GENERATED_PREFIX)))) { > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 93f2314..b2ef8db 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -700,6 +700,7 @@ struct _virDomainDiskDef { > int sgio; /* enum virDomainDeviceSGIO */ > int discard; /* enum virDomainDiskDiscard */ > unsigned int iothread; /* unused = 0, > 0 specific thread # */ > + char *domain_name; /* backend domain name */ > }; > > > @@ -995,6 +996,7 @@ struct _virDomainNetDef { > unsigned long sndbuf; > } tune; > char *script; > + char *domain_name; /* backend domain name */ > char *ifname; > char *ifname_guest; > char *ifname_guest_actual; > ACK. I'll squash in the below diff before pushing. Regards, Jim diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index eb6a412..fb0a0d1 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -2373,11 +2373,10 @@ </ul> </dd> <dt><code>backenddomain</code></dt> - <dd>The optional <code>backenddomain</code> element allows specifying a backend - domain (aka driver domain) for the device. If the real device/file resides - in some other domain on the same host, use the <code>name</code> - attribute to specify its name. - <span class="since">Since 1.2.13 (Xen only)</span> + <dd>The optional <code>backenddomain</code> element allows specifying a + backend domain (aka driver domain) hosting the disk. Use the + <code>name</code> attribute to specify the backend domain name. + <span class="since">Since 1.2.13 (Xen only)</span> </dd> <dt><code>boot</code></dt> <dd>Specifies that the disk is bootable. The <code>order</code> @@ -4277,12 +4276,13 @@ qemu-kvm -net nic,model=? /dev/null ...</pre> <p> - The optional <code>backenddomain</code> element allows specifying a backend - domain (aka driver domain) for the device. Use the <code>name</code> attribute - to specify its name. You can use it to create a direct network link between - domains (so data will not go through host system). Use with type 'ethernet' - to create plain network link, or with 'bridge' to connect to some bridge - inside the driver domain. + The optional <code>backenddomain</code> element allows specifying a + backend domain (aka driver domain) for the interface. Use the + <code>name</code> attribute to specify the backend domain name. You + can use it to create a direct network link between domains (so data + will not go through host system). Use with type 'ethernet' to create + plain network link, or with type 'bridge' to connect to a bridge inside + the backend domain. <span class="since">Since 1.2.13 (Xen only)</span> </p> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 5476f5d..f41ca43 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1171,6 +1171,9 @@ </optional> <ref name="target"/> <optional> + <ref name="deviceBoot"/> + </optional> + <optional> <element name="backenddomain"> <attribute name="name"> <ref name="domainName"/> @@ -1179,9 +1182,6 @@ </element> </optional> <optional> - <ref name="deviceBoot"/> - </optional> - <optional> <element name="readonly"> <empty/> </element> -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list