[libvirt] [PATCH v4 4/4] auto-create pci-bridge controller info

liguang lig.fnst at cn.fujitsu.com
Tue Feb 19 01:59:25 UTC 2013


if some devices specify a pci bus number that
haven't been defined by a pci-bridge controller
then fill the required correct controller info
silently.

Acked-by: Daniel P. Berrange <berrange at redhat.com>
Signed-off-by: liguang <lig.fnst at cn.fujitsu.com>
---
 src/conf/domain_conf.c |   95 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 95 insertions(+), 0 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b64e5b5..5cf8e04 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11813,6 +11813,98 @@ virDomainDefMaybeAddSmartcardController(virDomainDefPtr def)
 }
 
 
+static int
+virDomainDefMaybeAddPcibridgeController(virDomainDefPtr def)
+{
+    int i, idx = 0;
+
+    for (i = 0; i < def->nnets; i++) {
+        if (def->nets[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+            continue;
+        idx = def->nets[i]->info.addr.pci.bus;
+        if (virDomainDefMaybeAddController(def,
+                                           VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
+    for (i = 0; i < def->nsounds; i++) {
+        if (def->sounds[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+            continue;
+        idx = def->sounds[i]->info.addr.pci.bus;
+        if (virDomainDefMaybeAddController(def,
+                                           VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
+    for (i = 0; i < def->nvideos; i++) {
+        if (def->videos[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+            continue;
+        idx = def->videos[i]->info.addr.pci.bus;
+        if (virDomainDefMaybeAddController(def,
+                                           VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
+    for (i = 0; i < def->ncontrollers; i++) {
+        if (def->controllers[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+            continue;
+        idx = def->controllers[i]->info.addr.pci.bus;
+        if (virDomainDefMaybeAddController(def,
+                                           VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
+    for (i = 0; i < def->nfss; i++) {
+        if (def->fss[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+            continue;
+        idx = def->fss[i]->info.addr.pci.bus;
+        if (virDomainDefMaybeAddController(def,
+                                           VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
+    for (i = 0; i < def->nhostdevs; i++) {
+        if (def->hostdevs[i]->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+            continue;
+        idx = def->hostdevs[i]->info->addr.pci.bus;
+        if (virDomainDefMaybeAddController(def,
+                                           VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
+    for (i = 0; i < def->ndisks; i++) {
+        if (def->disks[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+            continue;
+        idx = def->disks[i]->info.addr.pci.bus;
+        if (virDomainDefMaybeAddController(def,
+                                           VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
+    if (def->watchdog->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+        idx = def->watchdog->info.addr.pci.bus;
+    if (virDomainDefMaybeAddController(def,
+                                       VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                       idx) < 0)
+        return -1;
+
+    if (def->memballoon->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
+        idx = def->memballoon->info.addr.pci.bus;
+    if (virDomainDefMaybeAddController(def,
+                                       VIR_DOMAIN_CONTROLLER_TYPE_PCI_BRIDGE,
+                                       idx) < 0)
+        return -1;
+
+    return 0;
+}
+
 /*
  * Based on the declared <address/> info for any devices,
  * add necessary drive controllers which are not already present
@@ -11847,6 +11939,9 @@ int virDomainDefAddImplicitControllers(virDomainDefPtr def)
     if (virDomainDefMaybeAddSmartcardController(def) < 0)
         return -1;
 
+    if (virDomainDefMaybeAddPcibridgeController(def) < 0)
+        return -1;
+
     return 0;
 }
 
-- 
1.7.2.5




More information about the libvir-list mailing list