[libvirt] [PATCH RFC] auto-create pci-bridge controller info

li guang lig.fnst at cn.fujitsu.com
Tue Jan 22 01:45:21 UTC 2013


在 2013-01-21一的 12:11 +0000,Daniel P. Berrange写道:
> On Mon, Jan 21, 2013 at 02:04:00PM +0800, liguang wrote:
> > 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.
> > it based on previous add pci-bridge support patches,
> > https://www.redhat.com/archives/libvir-list/2013-January/msg00577.html
> > 
> > Signed-off-by: liguang <lig.fnst at cn.fujitsu.com>
> > ---
> >  src/conf/domain_conf.c |   57 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 files changed, 57 insertions(+), 0 deletions(-)
> > 
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 8ebe77d..988e4f2 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -11756,6 +11756,60 @@ 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_PCIBRIDGE,
> > +                                           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_PCIBRIDGE,
> > +                                           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_PCIBRIDGE,
> > +                                           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_PCIBRIDGE,
> > +                                       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_PCIBRIDGE,
> > +                                       idx) < 0)
> > +        return -1;
> > +
> > +    return 0;
> > +}
> > +
> 
> You're missing quite a few device types here - 'disks' (eg virtio-blk uses
> PCI addresses), 'controllers' (eg USB controllers use PCI addresses),
> hostdevs (eg PCI host device passthrough), fss (virtio-9p filesystem uses
> PCI addresses).

Thanks! will fix like following

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 988e4f2..b0da5b4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11791,6 +11791,46 @@
virDomainDefMaybeAddPcibridgeController(virDomainDefPtr def)
             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_PCIBRIDGE,
+                                           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_PCIBRIDGE,
+                                           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_PCIBRIDGE,
+                                           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_PCIBRIDGE,
+                                           idx) < 0)
+            return -1;
+    }
+
     if (def->watchdog->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
         idx = def->watchdog->info.addr.pci.bus;


> 
> Regards,
> Daniel

-- 
regards!
li guang





More information about the libvir-list mailing list