[libvirt] [PATCH v2 01/42] conf: add enum constants for default controller models

Daniel P. Berrangé berrange at redhat.com
Tue Feb 20 10:13:04 UTC 2018


On Tue, Feb 20, 2018 at 10:38:41AM +0100, Ján Tomko wrote:
> On Thu, Feb 15, 2018 at 04:43:06PM +0000, Daniel P. Berrangé wrote:
> > The controller model is slightly unusual in that the default value is
> > -1, not 0. As a result the default value is not covered by any of the
> > existing enum cases. This in turn means that any switch() statements
> > that think they have covered all cases, will in fact not match the
> > default value at all. In the qemuDomainDeviceCalculatePCIConnectFlags()
> > method this has caused a serious mistake where we fallthough from the
> 
> s/fallthough/fallthrough/
> 
> > SCSI controller case, to the VirtioSerial controller case, and from
> > the USB controller case to the IDE controller case.
> > 
> > By adding explicit enum constant starting at -1, we can ensure switches
> > remember to handle the default case.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> > ---
> > src/conf/domain_addr.c         |  5 +++++
> > src/conf/domain_conf.c         |  1 +
> > src/conf/domain_conf.h         |  4 ++++
> > src/qemu/qemu_command.c        | 17 ++++++++++++++---
> > src/qemu/qemu_domain.c         | 10 +++++++++-
> > src/qemu/qemu_domain_address.c | 22 ++++++++++++++++++++++
> > src/vbox/vbox_common.c         | 13 +++++++++----
> > 7 files changed, 64 insertions(+), 8 deletions(-)
> > 
> > diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
> > index 6422682391..df19c6be1a 100644
> > --- a/src/conf/domain_addr.c
> > +++ b/src/conf/domain_addr.c
> > @@ -39,6 +39,7 @@ virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model)
> >      * the equivalent VIR_PCI_CONNECT_TYPE_*.
> >      */
> >     switch (model) {
> > +    case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT:
> >     case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
> >     case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
> >     case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
> > @@ -344,6 +345,9 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus,
> >         bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST;
> >         break;
> > 
> > +    case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT:
> > +        break;
> > +
> 
> Unlike '-usb' for USB controllers, there is no -pci for pci controllers
> - we need to know the model at the time of building the command line.
> 
> Not having one set here is either an error in the user input or the
> part of our code that should have filled the model in. If we want to be
> robust, this should be grouped with the next case.

Yes, I've checked test and latter it fallthrough to _LAST works too

> 
> >     case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
> >         virReportError(VIR_ERR_INTERNAL_ERROR,
> >                        "%s", _("PCI controller model was not set correctly"));
> > @@ -1746,6 +1750,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont)
> >             return cont->opts.usbopts.ports;
> >         return 8;
> > 
> > +    case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT:
> >     case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE:
> >     case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST:
> >         break;
> 
> > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> > index 6c73cd7bfe..2a75a169c2 100644
> > --- a/src/qemu/qemu_command.c
> > +++ b/src/qemu/qemu_command.c
> > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> > index 178ec24ae7..e114f5dfcf 100644
> > --- a/src/qemu/qemu_domain.c
> > +++ b/src/qemu/qemu_domain.c
> > @@ -4098,11 +4098,16 @@ qemuDomainCheckSCSIControllerModel(virQEMUCapsPtr qemuCaps,
> >     case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO:
> >     case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC:
> >     case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI:
> > -    case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST:
> >         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> >                        _("Unsupported controller model: %s"),
> >                        virDomainControllerModelSCSITypeToString(model));
> >         return false;
> > +    case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT:
> > +    case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST:
> > +        virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                       _("Unexpected SCSI controller model %d"),
> > +                       model);
> > +        return false;
> >     }
> > 
> >     return true;
> 
> [...]
> 
> > diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
> > index e28119e4b1..de565dbf74 100644
> > --- a/src/qemu/qemu_domain_address.c
> > +++ b/src/qemu/qemu_domain_address.c
> > @@ -513,6 +513,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
> > 
> >         case VIR_DOMAIN_CONTROLLER_TYPE_USB:
> >             switch ((virDomainControllerModelUSB) cont->model) {
> > +            case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT:
> > +                /* XXX it isn't clear that this is the right
> > +                 * thing to do here. We probably ought to
> > +                 * return 0, but that breaks test suite right
> > +                 * now because we call this method before we
> > +                 * have turned the _DEFAULT case into a
> > +                 * specific choice
> > +                 */
> 
> qemuDomainControllerDefPostParse should have filled this one in for
> most QEMU machine/capabilities combinations.
> If it's still at default at this point, we're going to use "-usb",
> which should be a PCI device.

Ok, that's a useful explanation. I'll use that as the comment.

> 
> > +                return pciFlags;
> > +
> >             case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI:
> >             case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI:
> >                 return pcieFlags;
> > @@ -540,6 +550,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
> > 
> >         case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
> >             switch ((virDomainControllerModelSCSI) cont->model) {
> > +            case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT:
> > +                /* XXX it isn't clear that this is the right
> > +                 * thing to do here. We probably ought to
> > +                 * return 0, but that breaks test suite right
> > +                 * now because we call this method before we
> > +                 * have turned the _DEFAULT case into a
> > +                 * specific choice
> > +                 */
> > +                return pciFlags;
> > +
> 
> Slightly different: a default SCSI controller cannot be formatted unless
> we turn it into a model. qemuDomainSetSCSIControllerModel in qemuDomainControllerDefPostParse
> errors out if we have no QEMU capabilities, (which probably should be
> relaxed as it might break loading of existing domains if the QEMU binary
> is not present). But the test suite passes even with return 0, so the
> comment is misleading.

Yes, my bad I'll remove that.



Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list