]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: simplify link from hostdev back to network device
authorDaniel P. Berrangé <berrange@redhat.com>
Thu, 26 Jul 2018 16:24:30 +0000 (17:24 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Tue, 16 Apr 2019 13:44:53 +0000 (14:44 +0100)
hostdevs have a link back to the original network device. This is fairly
generic accepting any type of device, however, we don't intend to make
use of this approach in future. It can thus be specialized to network
devices.

Reviewed-by: Cole Robinson <crobinso@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libxl/libxl_driver.c
src/network/bridge_driver.c
src/qemu/qemu_command.c
src/qemu/qemu_domain_address.c
src/qemu/qemu_hotplug.c
src/util/virhostdev.c

index 025cc4a994212e8ed32ca565a074bc14b790ddd6..1ec6455d14c9a8bdd664c7cb2f40825816b20760 100644 (file)
@@ -2848,10 +2848,10 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
      * such resource is the virDomainDeviceInfo.
      */
 
-    /* If there is a parent device object, it will handle freeing
+    /* If there is a parentnet device object, it will handle freeing
      * def->info.
      */
-    if (def->parent.type == VIR_DOMAIN_DEVICE_NONE)
+    if (!def->parentnet)
         virDomainDeviceInfoFree(def->info);
 
     switch (def->mode) {
@@ -2919,10 +2919,10 @@ void virDomainHostdevDefFree(virDomainHostdevDefPtr def)
     /* free all subordinate objects */
     virDomainHostdevDefClear(def);
 
-    /* If there is a parent device object, it will handle freeing
+    /* If there is a parentnet device object, it will handle freeing
      * the memory.
      */
-    if (def->parent.type == VIR_DOMAIN_DEVICE_NONE)
+    if (!def->parentnet)
         VIR_FREE(def);
 }
 
@@ -5490,7 +5490,7 @@ virDomainDefCollectBootOrder(virDomainDefPtr def ATTRIBUTE_UNUSED,
         return 0;
 
     if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
-        dev->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE) {
+        dev->data.hostdev->parentnet) {
         /* This hostdev is a child of a higher level device
          * (e.g. interface), and thus already being counted on the
          * list for the other device type.
@@ -6340,7 +6340,7 @@ virDomainDeviceDefValidateAliasesIterator(virDomainDefPtr def,
         return 0;
 
     if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
-        dev->data.hostdev->parent.type == VIR_DOMAIN_DEVICE_NET) {
+        dev->data.hostdev->parentnet) {
         /* This hostdev is a copy of some previous interface.
          * Aliases are duplicated. */
         return 0;
@@ -11156,8 +11156,7 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
     } else if (actual->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
         virDomainHostdevDefPtr hostdev = &actual->data.hostdev.def;
 
-        hostdev->parent.type = VIR_DOMAIN_DEVICE_NET;
-        hostdev->parent.data.net = parent;
+        hostdev->parentnet = parent;
         hostdev->info = &parent->info;
         /* The helper function expects type to already be found and
          * passed in as a string, since it is in a different place in
@@ -11809,8 +11808,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
 
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         hostdev = &def->data.hostdev.def;
-        hostdev->parent.type = VIR_DOMAIN_DEVICE_NET;
-        hostdev->parent.data.net = def;
+        hostdev->parentnet = def;
         hostdev->info = &def->info;
         /* The helper function expects type to already be found and
          * passed in as a string, since it is in a different place in
@@ -28509,11 +28507,11 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     }
 
     for (n = 0; n < def->nhostdevs; n++) {
-        /* If parent.type != NONE, this is just a pointer to the
+        /* If parentnet != NONE, this is just a pointer to the
          * hostdev in a higher-level device (e.g. virDomainNetDef),
          * and will have already been formatted there.
          */
-        if (def->hostdevs[n]->parent.type == VIR_DOMAIN_DEVICE_NONE &&
+        if (!def->hostdevs[n]->parentnet &&
             virDomainHostdevDefFormat(buf, def->hostdevs[n], flags) < 0) {
             goto error;
         }
index 8ef6d507b86b13a6e584015c6b64922daf2cbce5..c1bdf42c100087fd6fb414cdb543cd5816fa445a 100644 (file)
@@ -331,7 +331,13 @@ struct _virDomainHostdevCaps {
 
 /* basic device for direct passthrough */
 struct _virDomainHostdevDef {
-    virDomainDeviceDef parent; /* higher level Def containing this */
+    /* If 'parentnet' is non-NULL it means this host dev was
+     * not originally present in the XML. It was copied from
+     * a network interface for convenience when handling
+     * hostdevs internally. This hostdev should never be
+     * visible to the user except as part of the interface
+     */
+    virDomainNetDefPtr parentnet;
 
     int mode; /* enum virDomainHostdevMode */
     int startupPolicy; /* enum virDomainStartupPolicy */
index 506dcdfbebd3d54e0a0740962246774fe37be4c4..42221cb925d341e13ee80813604beb220c804b35 100644 (file)
@@ -3915,9 +3915,9 @@ libxlDomainDetachDeviceLive(libxlDriverPrivatePtr driver,
             /* If this is a network hostdev, we need to use the higher-level
              * detach function so that mac address / virtualport are reset
              */
-            if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET)
+            if (hostdev->parentnet)
                 ret = libxlDomainDetachNetDevice(driver, vm,
-                                                 hostdev->parent.data.net);
+                                                 hostdev->parentnet);
             else
                 ret = libxlDomainDetachHostDevice(driver, vm, hostdev);
             break;
index a10013d6a11d0f04df9d7e597a8e4d3aebb2afdc..eb9a00f5cf23e8146d75b03aa84e46a52bf34ba6 100644 (file)
@@ -4509,8 +4509,7 @@ networkAllocateActualDevice(virNetworkPtr net,
                            netdef->name);
             goto error;
         }
-        iface->data.network.actual->data.hostdev.def.parent.type = VIR_DOMAIN_DEVICE_NET;
-        iface->data.network.actual->data.hostdev.def.parent.data.net = iface;
+        iface->data.network.actual->data.hostdev.def.parentnet = iface;
         iface->data.network.actual->data.hostdev.def.info = &iface->info;
         iface->data.network.actual->data.hostdev.def.mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
         iface->data.network.actual->data.hostdev.def.managed = netdef->forward.managed ? 1 : 0;
index 2acc0b56eab48f6d0e829fdb911b321df45b0475..df60a3653b5c4c15416c30f2f9a11e264fb39da1 100644 (file)
@@ -5739,8 +5739,7 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
             /* bootNet will be non-0 if boot order was set and no other
              * net devices were encountered
              */
-            if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET &&
-                bootIndex == 0) {
+            if (hostdev->parentnet && bootIndex == 0) {
                 bootIndex = *bootHostdevNet;
                 *bootHostdevNet = 0;
             }
index 2ec21e65acaee965cf91429c15d9a53d69a11c5f..e28f8394a7c514713dace25d1feacb8cf5e5fada 100644 (file)
@@ -1503,7 +1503,7 @@ qemuDomainCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
 
     if (!virDeviceInfoPCIAddressIsPresent(info) ||
         ((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) &&
-         (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) {
+         device->data.hostdev->parentnet)) {
         /* If a hostdev has a parent, its info will be a part of the
          * parent, and will have its address collected during the scan
          * of the parent's device type.
@@ -1598,7 +1598,7 @@ qemuDomainCollectPCIAddressExtension(virDomainDefPtr def ATTRIBUTE_UNUSED,
 
     if (!virDeviceInfoPCIAddressExtensionIsPresent(info) ||
         ((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) &&
-         (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) {
+         device->data.hostdev->parentnet)) {
         /* If a hostdev has a parent, its info will be a part of the
          * parent, and will have its address collected during the scan
          * of the parent's device type.
index 7275bc19385ea4fa85ab9d9426414e55f7484b2f..228ce2a76f0682edf5a41d267cee0752fa71626a 100644 (file)
@@ -4713,11 +4713,9 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
             goto cleanup;
     }
 
-    if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET) {
-        net = hostdev->parent.data.net;
-
+    if (hostdev->parentnet) {
         for (i = 0; i < vm->def->nnets; i++) {
-            if (vm->def->nets[i] == net) {
+            if (vm->def->nets[i] == hostdev->parentnet) {
                 virDomainNetRemove(vm->def, i);
                 break;
             }
index 6be395cddac766ec3e7fb1b95f2853067e2f2f02..19ae001971f78b834cef30e83d5c8d0563d007d2 100644 (file)
@@ -333,8 +333,7 @@ virHostdevIsPCINetDevice(virDomainHostdevDefPtr hostdev)
 {
     return hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
         hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
-        hostdev->parent.type == VIR_DOMAIN_DEVICE_NET &&
-        hostdev->parent.data.net;
+        hostdev->parentnet != NULL;
 }
 
 
@@ -427,7 +426,7 @@ virHostdevSaveNetConfig(virDomainHostdevDefPtr hostdev,
     int vf = -1;
 
     if (!virHostdevIsPCINetDevice(hostdev) ||
-        virDomainNetGetActualVirtPortProfile(hostdev->parent.data.net))
+        virDomainNetGetActualVirtPortProfile(hostdev->parentnet))
        return 0;
 
     if (virHostdevIsVirtualFunction(hostdev) != 1) {
@@ -474,8 +473,8 @@ virHostdevSetNetConfig(virDomainHostdevDefPtr hostdev,
     if (virHostdevNetDevice(hostdev, -1, &linkdev, &vf) < 0)
         return -1;
 
-    vlan = virDomainNetGetActualVlan(hostdev->parent.data.net);
-    virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parent.data.net);
+    vlan = virDomainNetGetActualVlan(hostdev->parentnet);
+    virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parentnet);
     if (virtPort) {
         if (vlan) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -485,11 +484,11 @@ virHostdevSetNetConfig(virDomainHostdevDefPtr hostdev,
             return -1;
         }
         if (virHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort,
-                                               &hostdev->parent.data.net->mac,
+                                               &hostdev->parentnet->mac,
                                                uuid, port_profile_associate) < 0)
             return -1;
     } else {
-        if (virNetDevSetNetConfig(linkdev, vf, &hostdev->parent.data.net->mac,
+        if (virNetDevSetNetConfig(linkdev, vf, &hostdev->parentnet->mac,
                                   vlan, NULL, true) < 0)
             return -1;
     }
@@ -535,10 +534,10 @@ virHostdevRestoreNetConfig(virDomainHostdevDefPtr hostdev,
     if (virHostdevNetDevice(hostdev, 0, &linkdev, &vf) < 0)
         return -1;
 
-    virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parent.data.net);
+    virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parentnet);
     if (virtPort) {
         return virHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort,
-                                                  &hostdev->parent.data.net->mac,
+                                                  &hostdev->parentnet->mac,
                                                   NULL,
                                                   port_profile_associate);
     } else {