[libvirt] [PATCH 09/26] conf: Move index number checking to drivers
Laine Stump
laine at laine.org
Tue Jun 13 02:14:22 UTC 2017
On 06/12/2017 10:08 PM, Laine Stump wrote:
> On 06/02/2017 12:07 PM, Andrea Bolognani wrote:
>> pSeries guests will soon be allowed to have multiple
>> PHBs (pci-root controllers), which of course means that
>> all but one of them will have a non-zero index; hence,
>> we'll need to relax the current check.
>>
>> However, right now the check is performed in the conf
>> module, which is generic rather than tied to the QEMU
>> driver, and where we don't have information such as the
>> guest machine type available.
>>
>> To make this change of behavior possible down the line,
>> we need to move the check from the XML parser to the
>> driver. Unfortunately, this means duplicating code :(\
>
>
> Maybe instead we should just eliminate this check (since the pSeries
> case shows that it's an invalid assumption). And since the index is
> really just something used internally by libvirt, we really don't even
> need to verify that one of the pci controllers has index=0. All we
> *really* care about is that there is at least one "root" PCI bus, and
> that no device includes a bus# in its PCI address that isn't represented
> by the index in one of the PCI controllers.
>
> (But for the purposes of this patch, I think we can just remove the
> validation in conf and not worry about adding it elsewhere).\\
After looking at the next patch, I may have changed my mind. If we
remove the validation here, then we would still have to add in
validation when the commandline is generated. But I suppose it's better
to give an error at domain definition time rather than domain runtime,
so this makes sense. I don't think all of those drivers actually use PCI
controllers though, do they? (Look for which ones actually call the
functions to assign PCI addresses).
>
>> ---
>> src/bhyve/bhyve_domain.c | 15 +++++++++++++++
>> src/conf/domain_conf.c | 6 ------
>> src/libxl/libxl_domain.c | 14 ++++++++++++++
>> src/lxc/lxc_domain.c | 14 ++++++++++++++
>> src/openvz/openvz_driver.c | 14 ++++++++++++++
>> src/qemu/qemu_domain.c | 9 +++++++++
>> src/uml/uml_driver.c | 14 ++++++++++++++
>> src/vz/vz_driver.c | 14 ++++++++++++++
>> src/xen/xen_driver.c | 14 ++++++++++++++
>> 9 files changed, 108 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
>> index 76b4fac..05c1508 100644
>> --- a/src/bhyve/bhyve_domain.c
>> +++ b/src/bhyve/bhyve_domain.c
>> @@ -122,6 +122,21 @@ bhyveDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>> bhyveDomainDiskDefAssignAddress(driver, disk, def) < 0)
>> return -1;
>> }
>> +
>> + if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>> + virDomainControllerDefPtr cont = dev->data.controller;
>> +
>> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>> + (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> + }
>> +
>> return 0;
>> }
>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index c7e20b8..d5dff8e 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -9059,12 +9059,6 @@ virDomainControllerDefParseXML(xmlNodePtr node,
>> "have an address"));
>> goto error;
>> }
>> - if (def->idx > 0) {
>> - virReportError(VIR_ERR_XML_ERROR, "%s",
>> - _("pci-root and pcie-root controllers "
>> - "should have index 0"));
>> - goto error;
>> - }
>> if ((rc = virDomainParseScaledValue("./pcihole64", NULL,
>> ctxt, &bytes, 1024,
>> 1024ULL * ULONG_MAX, false)) < 0)
>> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
>> index 256cf1d..59ef2fb 100644
>> --- a/src/libxl/libxl_domain.c
>> +++ b/src/libxl/libxl_domain.c
>> @@ -379,6 +379,20 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>> virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW);
>> }
>>
>> + if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>> + virDomainControllerDefPtr cont = dev->data.controller;
>> +
>> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>> + (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> + }
>> +
>> return 0;
>> }
>>
>> diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c
>> index 3a7404f..a50f6fe 100644
>> --- a/src/lxc/lxc_domain.c
>> +++ b/src/lxc/lxc_domain.c
>> @@ -389,6 +389,20 @@ virLXCDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>> dev->data.chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE)
>> dev->data.chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC;
>>
>> + if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>> + virDomainControllerDefPtr cont = dev->data.controller;
>> +
>> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>> + (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> + }
>> +
>> return 0;
>> }
>>
>> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
>> index 9c4a196..058d830 100644
>> --- a/src/openvz/openvz_driver.c
>> +++ b/src/openvz/openvz_driver.c
>> @@ -127,6 +127,20 @@ openvzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>> return -1;
>> }
>>
>> + if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>> + virDomainControllerDefPtr cont = dev->data.controller;
>> +
>> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>> + (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> + }
>> +
>> return 0;
>> }
>>
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index 0a85ee9..18512cb 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -3404,6 +3404,15 @@ qemuDomainControllerDefPostParse(virDomainControllerDefPtr cont,
>> break;
>>
>> case VIR_DOMAIN_CONTROLLER_TYPE_PCI:
>> + if ((cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> +
>> if (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS &&
>> !qemuDomainIsI440FX(def)) {
>> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
>> index 03edc89..d9df3c5 100644
>> --- a/src/uml/uml_driver.c
>> +++ b/src/uml/uml_driver.c
>> @@ -426,6 +426,20 @@ umlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>> return -1;
>> }
>>
>> + if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>> + virDomainControllerDefPtr cont = dev->data.controller;
>> +
>> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>> + (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> + }
>> +
>> return 0;
>> }
>>
>> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
>> index ef7b453..e988e7c 100644
>> --- a/src/vz/vz_driver.c
>> +++ b/src/vz/vz_driver.c
>> @@ -283,6 +283,20 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>> VIR_STRDUP(dev->data.net->model, "e1000") < 0)
>> return -1;
>>
>> + if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>> + virDomainControllerDefPtr cont = dev->data.controller;
>> +
>> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>> + (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> + }
>> +
>> return 0;
>> }
>>
>> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
>> index 4d14089..b681764 100644
>> --- a/src/xen/xen_driver.c
>> +++ b/src/xen/xen_driver.c
>> @@ -362,6 +362,20 @@ xenDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>> }
>> }
>>
>> + if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>> + virDomainControllerDefPtr cont = dev->data.controller;
>> +
>> + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
>> + (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
>> + cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) &&
>> + cont->idx != 0) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s",
>> + _("pci-root and pcie-root controllers "
>> + "should have index 0"));
>> + return -1;
>> + }
>> + }
>> +
>> return 0;
>> }
>>
>>
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>
More information about the libvir-list
mailing list