]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Clear assigned PCI devices at shutdown
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 6 Jan 2010 10:35:30 +0000 (10:35 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 18 Jan 2010 13:35:51 +0000 (13:35 +0000)
The PCI device addresses are only valid while the VM is running,
since they are auto-assigned by QEMU. After shutdown they must
all be cleared. Future QEMU driver enhancement will allow for
persistent PCI address assignment

* src/conf/domain_conf.h, src/conf/domain_conf.c, src/libvirt_private.syms
  Add virDomainDefClearPCIAddresses() method for wiping out auto assigned
  PCI addresses
* src/qemu/qemu_driver.c: Clear PCI addresses at VM shutdown

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_driver.c

index b3b102b3a60917f51e88db304f066b5699165e93..b2c8104e6142c1661c89ac4e693e06c88deaca99 100644 (file)
@@ -817,6 +817,42 @@ void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info)
 }
 
 
+static void virDomainDeviceInfoClearField(virDomainDeviceInfoPtr info)
+{
+    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+        memset(&info->addr, 0, sizeof(info->addr));
+        info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
+    }
+}
+
+
+static void virDomainDefClearDeviceInfo(virDomainDefPtr def)
+{
+    int i;
+
+    for (i = 0; i < def->ndisks ; i++)
+        virDomainDeviceInfoClearField(&def->disks[i]->info);
+    for (i = 0; i < def->nnets ; i++)
+        virDomainDeviceInfoClearField(&def->nets[i]->info);
+    for (i = 0; i < def->nsounds ; i++)
+        virDomainDeviceInfoClearField(&def->sounds[i]->info);
+    for (i = 0; i < def->nhostdevs ; i++)
+        virDomainDeviceInfoClearField(&def->hostdevs[i]->info);
+    for (i = 0; i < def->nvideos ; i++)
+            virDomainDeviceInfoClearField(&def->videos[i]->info);
+    for (i = 0; i < def->ncontrollers ; i++)
+            virDomainDeviceInfoClearField(&def->controllers[i]->info);
+    if (def->watchdog)
+        virDomainDeviceInfoClearField(&def->watchdog->info);
+}
+
+
+void virDomainDefClearPCIAddresses(virDomainDefPtr def)
+{
+    virDomainDefClearDeviceInfo(def);
+}
+
+
 /* Generate a string representation of a device address
  * @param address Device address to stringify
  */
index 1831d17bcd253157969d1959e2fa2da7915ca186..a6f7ab25513e73313498aec3db681d0933bd1694 100644 (file)
@@ -736,6 +736,8 @@ int virDomainDevicePCIAddressIsValid(virDomainDevicePCIAddressPtr addr);
 int virDomainDeviceDriveAddressIsValid(virDomainDeviceDriveAddressPtr addr);
 int virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info);
 void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info);
+void virDomainDefClearPCIAddresses(virDomainDefPtr def);
+
 void virDomainDefFree(virDomainDefPtr vm);
 void virDomainObjRef(virDomainObjPtr vm);
 /* Returns 1 if the object was freed, 0 if more refs exist */
index 0d1a82ca51573cf794e097be4730a546c7b4029f..46c0902d640d050f11f5eae413e71efe26bee9e0 100644 (file)
@@ -187,6 +187,7 @@ virDomainControllerTypeToString;
 virDomainControllerDefFree;
 virDomainDeviceAddressTypeToString;
 virDomainDefAddDiskControllers;
+virDomainDefClearPCIAddresses;
 
 
 # domain_event.h
index bc809001063506e1b52ff3bea7c20ab3d6e158a7..0a35b97bde5972656b5a231ccf3871aac429df34 100644 (file)
@@ -3048,6 +3048,8 @@ static void qemudShutdownVMDaemon(virConnectPtr conn,
         VIR_FREE(vm->def->seclabel.imagelabel);
     }
 
+    virDomainDefClearPCIAddresses(vm->def);
+
     if (qemuDomainSetAllDeviceOwnership(conn, driver, vm->def, 1) < 0)
         VIR_WARN("Failed to restore all device ownership for %s",
                  vm->def->name);