[libvirt] [PATCH 02/10] conf: support backend domain name in disk and network devices

Jim Fehlig jfehlig at suse.com
Thu Feb 5 21:45:30 UTC 2015


Marek Marczykowski-Górecki wrote:
> 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 at invisiblethingslab.com>
> ---
> 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
>
>  docs/formatdomain.html.in     | 29 +++++++++++++++++++++++++++--
>  docs/schemas/domaincommon.rng | 20 ++++++++++++++++++++
>  src/conf/domain_conf.c        | 33 +++++++++++++++++++++++++++++----
>  src/conf/domain_conf.h        |  1 +
>  src/util/virstoragefile.c     |  4 +++-
>  src/util/virstoragefile.h     |  1 +
>  6 files changed, 81 insertions(+), 7 deletions(-)
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index c5ad6f4..38c42d5 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -1907,13 +1907,17 @@
>              <span class="since">since 0.0.3</span></dt>
>                <dd>
>                The <code>file</code> attribute specifies the fully-qualified
> -              path to the file holding the disk.
> +              path to the file holding the disk. The optional
> +              <code>domain</code> attribute allows specifying a backend domain
>   

Interesting approach.  It almost feels like this is a different type of
disk, e.g. <disk type='brokered'> :).  There's a fair bit of experience
on the list wrt extending the XML.  Let's see if other have suggestions.

Regards,
Jim

> +              (aka driver domain) where the file is stored.
>                </dd>
>              <dt><code>type='block'</code>
>              <span class="since">since 0.0.3</span></dt>
>                <dd>
>                The <code>dev</code> attribute specifies the path to the
> -              host device to serve as the disk.
> +              host device to serve as the disk. The optional
> +              <code>domain</code> attribute allows specifying a backend domain
> +              (aka driver domain) for the device.
>                </dd>
>              <dt><code>type='dir'</code>
>              <span class="since">since 0.7.5</span></dt>
> @@ -4336,6 +4340,27 @@ qemu-kvm -net nic,model=? /dev/null
>        element is unspecified is to have the link state <code>up</code>.
>        <span class="since">Since 0.9.5</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>domain='netvm'</b>/>
> +    </interface>
> +    ...
> +  </devices>
> +  ...</pre>
> +
> +    <p>
> +      The optional <code>domain</code> attribute 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.
> +      <span class="since">Since 1.0.7 (Xen only)</span>
> +    </p>
>  
>      <h5><a name="ipconfig">IP configuration</a></h5>
>  <pre>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index d467dce..a4321f1 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -1340,6 +1340,11 @@
>              <attribute name="file">
>                <ref name="absFilePath"/>
>              </attribute>
> +            <optional>
> +              <attribute name="domain">
> +                <ref name="domainName"/>
> +              </attribute>
> +            </optional>
>            </optional>
>            <optional>
>              <ref name="storageStartupPolicy"/>
> @@ -1365,6 +1370,11 @@
>              </attribute>
>            </optional>
>            <optional>
> +            <attribute name="domain">
> +              <ref name="domainName"/>
> +            </attribute>
> +          </optional>
> +          <optional>
>              <ref name="storageStartupPolicy"/>
>            </optional>
>            <optional>
> @@ -2040,6 +2050,11 @@
>                  <attribute name="bridge">
>                    <ref name="deviceName"/>
>                  </attribute>
> +                <optional>
> +                  <attribute name="domain">
> +                    <ref name="domainName"/>
> +                  </attribute>
> +                </optional>
>                  <empty/>
>                </element>
>              </optional>
> @@ -2059,6 +2074,11 @@
>                  <attribute name="dev">
>                    <ref name="deviceName"/>
>                  </attribute>
> +                <optional>
> +                  <attribute name="domain">
> +                    <ref name="domainName"/>
> +                  </attribute>
> +                </optional>
>                  <empty/>
>                </element>
>              </optional>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 4251b13..17b699a 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1442,6 +1442,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);
> @@ -5520,9 +5521,11 @@ virDomainDiskSourceParse(xmlNodePtr node,
>      switch ((virStorageType)src->type) {
>      case VIR_STORAGE_TYPE_FILE:
>          src->path = virXMLPropString(node, "file");
> +        src->domain_name = virXMLPropString(node, "domain");
>          break;
>      case VIR_STORAGE_TYPE_BLOCK:
>          src->path = virXMLPropString(node, "dev");
> +        src->domain_name = virXMLPropString(node, "domain");
>          break;
>      case VIR_STORAGE_TYPE_DIR:
>          src->path = virXMLPropString(node, "dir");
> @@ -7369,6 +7372,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>      char *vhostuser_path = NULL;
>      char *vhostuser_type = NULL;
>      char *trustGuestRxFilters = NULL;
> +    char *domain_name = NULL;
>      virNWFilterHashTablePtr filterparams = NULL;
>      virDomainActualNetDefPtr actual = NULL;
>      xmlNodePtr oldnode = ctxt->node;
> @@ -7423,12 +7427,14 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>                         def->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
>                         xmlStrEqual(cur->name, BAD_CAST "source")) {
>                  bridge = virXMLPropString(cur, "bridge");
> +                domain_name = virXMLPropString(cur, "domain");
>              } else if (!dev &&
>                         (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET ||
>                          def->type == VIR_DOMAIN_NET_TYPE_DIRECT) &&
>                         xmlStrEqual(cur->name, BAD_CAST "source")) {
>                  dev  = virXMLPropString(cur, "dev");
>                  mode = virXMLPropString(cur, "mode");
> +                domain_name = virXMLPropString(cur, "domain");
>              } else if (!vhostuser_path && !vhostuser_mode && !vhostuser_type
>                         && def->type == VIR_DOMAIN_NET_TYPE_VHOSTUSER &&
>                         xmlStrEqual(cur->name, BAD_CAST "source")) {
> @@ -7802,6 +7808,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;
> @@ -8061,6 +8071,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>      VIR_FREE(addrtype);
>      VIR_FREE(trustGuestRxFilters);
>      VIR_FREE(ips);
> +    VIR_FREE(domain_name);
>      virNWFilterHashTableFree(filterparams);
>  
>      return def;
> @@ -16544,6 +16555,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
>              virBufferAddLit(buf, "<source");
>              virBufferEscapeString(buf, " file='%s'", src->path);
>              virBufferEscapeString(buf, " startupPolicy='%s'", startupPolicy);
> +            virBufferEscapeString(buf, " domain='%s'", src->domain_name);
>  
>              virDomainDiskSourceDefFormatSeclabel(buf, src->nseclabels,
>                                                   src->seclabels, flags,
> @@ -16554,6 +16566,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
>              virBufferAddLit(buf, "<source");
>              virBufferEscapeString(buf, " dev='%s'", src->path);
>              virBufferEscapeString(buf, " startupPolicy='%s'", startupPolicy);
> +            virBufferEscapeString(buf, " domain='%s'", src->domain_name);
>  
>              virDomainDiskSourceDefFormatSeclabel(buf, src->nseclabels,
>                                                   src->seclabels, flags,
> @@ -17713,8 +17726,14 @@ virDomainNetDefFormat(virBufferPtr buf,
>              break;
>  
>          case VIR_DOMAIN_NET_TYPE_ETHERNET:
> -            virBufferEscapeString(buf, "<source dev='%s'/>\n",
> -                                  def->data.ethernet.dev);
> +            if (def->data.ethernet.dev || def->domain_name) {
> +                virBufferAddLit(buf, "<source");
> +                virBufferEscapeString(buf, " dev='%s'",
> +                                      def->data.ethernet.dev);
> +                virBufferEscapeString(buf, " domain='%s'",
> +                                      def->domain_name);
> +                virBufferAddLit(buf, "/>\n");
> +            }
>              break;
>  
>          case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
> @@ -17730,8 +17749,14 @@ virDomainNetDefFormat(virBufferPtr buf,
>              break;
>  
>          case VIR_DOMAIN_NET_TYPE_BRIDGE:
> -            virBufferEscapeString(buf, "<source bridge='%s'/>\n",
> -                                  def->data.bridge.brname);
> +            if (def->data.bridge.brname || def->domain_name) {
> +                virBufferAddLit(buf, "<source");
> +                virBufferEscapeString(buf, " bridge='%s'",
> +                                      def->data.bridge.brname);
> +                virBufferEscapeString(buf, " domain='%s'",
> +                                      def->domain_name);
> +                virBufferAddLit(buf, "/>\n");
> +            }
>              break;
>  
>          case VIR_DOMAIN_NET_TYPE_SERVER:
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 93f2314..28c6920 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -995,6 +995,7 @@ struct _virDomainNetDef {
>          unsigned long sndbuf;
>      } tune;
>      char *script;
> +    char *domain_name; /* backend domain name */
>      char *ifname;
>      char *ifname_guest;
>      char *ifname_guest_actual;
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index 8d3d1f5..c2703b7 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -1835,7 +1835,8 @@ virStorageSourceCopy(const virStorageSource *src,
>          VIR_STRDUP(ret->backingStoreRaw, src->backingStoreRaw) < 0 ||
>          VIR_STRDUP(ret->snapshot, src->snapshot) < 0 ||
>          VIR_STRDUP(ret->configFile, src->configFile) < 0 ||
> -        VIR_STRDUP(ret->compat, src->compat) < 0)
> +        VIR_STRDUP(ret->compat, src->compat) < 0 ||
> +        VIR_STRDUP(ret->domain_name, src->domain_name))
>          goto error;
>  
>      if (src->nhosts) {
> @@ -2023,6 +2024,7 @@ virStorageSourceClear(virStorageSourcePtr def)
>  
>      VIR_FREE(def->path);
>      VIR_FREE(def->volume);
> +    VIR_FREE(def->domain_name);
>      virStorageSourcePoolDefFree(def->srcpool);
>      VIR_FREE(def->driverName);
>      virBitmapFree(def->features);
> diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
> index b4c3808..a3c7e1e 100644
> --- a/src/util/virstoragefile.h
> +++ b/src/util/virstoragefile.h
> @@ -241,6 +241,7 @@ struct _virStorageSource {
>      char *snapshot; /* for storage systems supporting internal snapshots */
>      char *configFile; /* some storage systems use config file as part of
>                           the source definition */
> +    char *domain_name; /* name of domain holding backing storage file/dev */
>      size_t nhosts;
>      virStorageNetHostDefPtr hosts;
>      virStorageSourcePoolDefPtr srcpool;
>   




More information about the libvir-list mailing list