On 06/23/2017 11:03 AM, Andrea Bolognani wrote: > pSeries guests will soon need the new information; luckily, > we can figure it out automatically most of the time, so > users won't have to worry about it. > > Signed-off-by: Andrea Bolognani <abologna@xxxxxxxxxx> Reviewed-by: Laine Stump <laine@xxxxxxxxx> (assuming name change from idx to targetIdx in all appropriate places) > --- > src/qemu/qemu_domain_address.c | 88 +++++++++++++++++++++- > .../qemuargv2xmldata/qemuargv2xml-pseries-disk.xml | 5 +- > .../qemuargv2xml-pseries-nvram.xml | 5 +- > .../qemuxml2xmlout-panic-pseries.xml | 5 +- > .../qemuxml2xmlout-ppc64-usb-controller-legacy.xml | 5 +- > .../qemuxml2xmlout-ppc64-usb-controller.xml | 5 +- > .../qemuxml2xmlout-pseries-nvram.xml | 5 +- > .../qemuxml2xmlout-pseries-panic-missing.xml | 5 +- > .../qemuxml2xmlout-pseries-panic-no-address.xml | 5 +- > 9 files changed, 118 insertions(+), 10 deletions(-) > > diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c > index b5b863f..960ea04 100644 > --- a/src/qemu/qemu_domain_address.c > +++ b/src/qemu/qemu_domain_address.c > @@ -1861,6 +1861,7 @@ qemuDomainSupportsPCI(virDomainDefPtr def, > > static void > qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont, > + virDomainDefPtr def, > virQEMUCapsPtr qemuCaps) > { > int *modelName = &cont->opts.pciopts.modelName; > @@ -1897,6 +1898,9 @@ qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont, > *modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB_PCIE; > break; > case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: > + if (qemuDomainIsPSeries(def)) > + *modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE; > + break; > case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: > case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: > break; > @@ -1904,6 +1908,63 @@ qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont, > } > > > +/** > + * qemuDomainAddressFindNewTargetIndex: > + * @def: domain definition > + * > + * Find a target index that can be used for a PCI controller. > + * > + * Returns: an unused target index, or -1 if all available target > + * indexes are already taken. > + */ > +static int > +qemuDomainAddressFindNewTargetIndex(virDomainDefPtr def) > +{ > + int idx; > + int ret = -1; > + > + /* Try all indexes between 1 and 31 - QEMU only supports 32 > + * PHBs, and 0 is reserved for the default, implicit one */ > + for (idx = 1; idx <= 31; idx++) { > + bool found = false; > + size_t i; > + > + for (i = 0; i < def->ncontrollers; i++) { > + virDomainControllerDefPtr cont = def->controllers[i]; > + virDomainPCIControllerOptsPtr opts; > + > + /* We only care about pci-root controllers */ > + if (cont->type != VIR_DOMAIN_CONTROLLER_TYPE_PCI || > + cont->model != VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) { > + continue; > + } > + > + opts = &cont->opts.pciopts; > + > + /* More specifically, we only care about PHBs */ > + if (opts->modelName != VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE) > + continue; > + > + /* Stop looking as soon as we find a PHB that's > + * already using this specific target index */ > + if (opts->idx == idx) { > + found = true; > + break; > + } > + } > + > + /* If no existing PCI controller uses this index, great, > + * it means it's free and we can return it to the caller */ > + if (!found) { > + ret = idx; > + break; > + } > + } > + > + return ret; > +} > + > + > static int > qemuDomainAddressFindNewBusNr(virDomainDefPtr def) > { > @@ -2164,7 +2225,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, > * device in qemu) for any controller that doesn't yet > * have it set. > */ > - qemuDomainPCIControllerSetDefaultModelName(cont, qemuCaps); > + qemuDomainPCIControllerSetDefaultModelName(cont, def, qemuCaps); > > /* set defaults for any other auto-generated config > * options for this controller that haven't been > @@ -2201,9 +2262,32 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, > goto cleanup; > } > break; > + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: > + if (!qemuDomainIsPSeries(def)) > + break; > + if (options->idx == -1) { > + if (cont->idx == 0) { > + /* The pci-root controller with controller index 0 > + * must always be assigned target index 0, because > + * it represents the implicit PHB which is treated > + * differently than all other PHBs */ > + options->idx = 0; > + } else { > + /* For all other PHBs the target index doesn't need > + * to match the controller index or have any > + * particular value, really */ > + options->idx = qemuDomainAddressFindNewTargetIndex(def); > + } > + } > + if (options->idx == -1) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > + _("No usable target index found for %d"), > + addr->bus); > + goto cleanup; > + } > + break; > case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: > case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: > - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: > case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: > case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: > break; > diff --git a/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml b/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml > index 1bad8ee..601d0f7 100644 > --- a/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml > +++ b/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml > @@ -30,7 +30,10 @@ > <controller type='usb' index='0'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <controller type='scsi' index='0'> > <address type='spapr-vio' reg='0x2000'/> > </controller> > diff --git a/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml b/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml > index 7e9f864..7787847 100644 > --- a/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml > +++ b/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml > @@ -17,7 +17,10 @@ > <controller type='usb' index='0'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <memballoon model='none'/> > <nvram> > <address type='spapr-vio' reg='0x4000'/> > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml > index 1ed11ce..7fb49fe 100644 > --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml > @@ -17,7 +17,10 @@ > <controller type='usb' index='0'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <serial type='pty'> > <target port='0'/> > <address type='spapr-vio' reg='0x30000000'/> > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml > index b7bde24..673b81d 100644 > --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml > @@ -22,7 +22,10 @@ > <controller type='usb' index='0'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <memballoon model='virtio'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> > </memballoon> > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml > index 82aaaca..68995a9 100644 > --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml > @@ -22,7 +22,10 @@ > <controller type='usb' index='0' model='pci-ohci'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <memballoon model='virtio'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> > </memballoon> > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml > index 713f31c..f89b23b 100644 > --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml > @@ -17,7 +17,10 @@ > <controller type='usb' index='0'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <memballoon model='none'/> > <nvram> > <address type='spapr-vio' reg='0x4000'/> > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml > index 1ed11ce..7fb49fe 100644 > --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml > @@ -17,7 +17,10 @@ > <controller type='usb' index='0'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <serial type='pty'> > <target port='0'/> > <address type='spapr-vio' reg='0x30000000'/> > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml > index 1ed11ce..7fb49fe 100644 > --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml > @@ -17,7 +17,10 @@ > <controller type='usb' index='0'> > <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> > </controller> > - <controller type='pci' index='0' model='pci-root'/> > + <controller type='pci' index='0' model='pci-root'> > + <model name='spapr-pci-host-bridge'/> > + <target index='0'/> > + </controller> > <serial type='pty'> > <target port='0'/> > <address type='spapr-vio' reg='0x30000000'/> > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list