[libvirt] [PATCH v2 12/25] qemu: Support disk model=virtio-{non-}transitional
Cole Robinson
crobinso at redhat.com
Wed Feb 6 17:17:42 UTC 2019
On 1/29/19 5:25 AM, Andrea Bolognani wrote:
> On Wed, 2019-01-23 at 16:32 -0500, Cole Robinson wrote:
> [...]
>> + switch (devtype) {
>> + case VIR_DOMAIN_DEVICE_DISK:
>> + has_tmodel = device.data.disk->model == VIR_DOMAIN_DISK_MODEL_VIRTIO_TRANSITIONAL;
>> + has_ntmodel = device.data.disk->model == VIR_DOMAIN_DISK_MODEL_VIRTIO_NON_TRANSITIONAL;
>> + tmodel_cap = QEMU_CAPS_DEVICE_VIRTIO_BLK_PCI_TRANSITIONAL;
>> + ntmodel_cap = QEMU_CAPS_DEVICE_VIRTIO_BLK_PCI_NON_TRANSITIONAL;
>> + break;
>
> I wonder if this would look slightly nicer as
>
> case VIR_DOMAIN_DEVICE_DISK: {
> virDomainDiskDefPtr disk = (virDomainDiskDefPtr) devdata;
>
> has_tmodel = disk->model == VIR_DOMAIN_DISK_MODEL_VIRTIO_TRANSITIONAL;
> has_ntmodel = disk->model == VIR_DOMAIN_DISK_MODEL_VIRTIO_NON_TRANSITIONAL;
> tmodel_cap = QEMU_CAPS_DEVICE_VIRTIO_BLK_PCI_TRANSITIONAL;
> ntmodel_cap = QEMU_CAPS_DEVICE_VIRTIO_BLK_PCI_NON_TRANSITIONAL;
>
> break;
> }
>
> but up to you, really.
>
Makes for shorter lines which is nice but kind of offsets the benefit of
converting to virDomainDeviceSetData in the first place...
> [...]
>> + if (has_tmodel) {
>> + if (virQEMUCapsGet(qemuCaps, tmodel_cap))
>> + virBufferAddLit(buf, "-transitional");
>
> You're definitely using qemuCaps now, so you should remove
> ATTRIBUTE_UNUSED from the parameter in the function signature.
>
>> + /* No error for if -transitional is not supported: our address
>> + * allocation will force the device into plain PCI bus, which
>> + * is functionally identical to standard 'virtio-XXX' behavior
>> + */
>
> While this is absolutely correct and we should definitely not error
> out if the transitional device is not available, perhaps for the
> benefit of someone looking at the generated QEMU command line for
> debugging purposes we could do the same as below and also print
>
> disable-legacy=off,disable-modern=off
>
> if the corresponding options are available - we would still not
> error out if they aren't, of course. Sounds reasonable?
>
Good point, i'll change it
> [...]
>> + } else if (has_ntmodel) {
>> + if (virQEMUCapsGet(qemuCaps, ntmodel_cap)) {
>> + virBufferAddLit(buf, "-non-transitional");
>> + } else if (virQEMUCapsGet(qemuCaps,
>> + QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY)) {
>> + virBufferAddLit(buf, ",disable-legacy=on,disable-modern=off");
>
> Maybe add something like
>
> /* Even if the QEMU binary doesn't support the non-transitional
> * device, we can still make it work by manually disabling legacy
> * VirtIO and enabling modern VirtIO */
>
> here.
>
> [...]
>> }
>>
>> +
>> static int
>> qemuBuildVirtioOptionsStr(virBufferPtr buf,
>> virDomainVirtioOptionsPtr virtio,
>
> Extraneous whitespace change.
>
> [...]
>> @@ -720,6 +720,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
>> case VIR_DOMAIN_DEVICE_DISK:
>> switch ((virDomainDiskBus) dev->data.disk->bus) {
>> case VIR_DOMAIN_DISK_BUS_VIRTIO:
>> + /* Transitional devices only work in conventional PCI slots */
>> + if (dev->data.disk->model == VIR_DOMAIN_DISK_MODEL_VIRTIO_TRANSITIONAL)
>> + return pciFlags;
>> return virtioFlags; /* only virtio disks use PCI */
>
> Can please you use the same kind of switch statement you later use
> for eg. input devices here?
>
ACK to all these changes too
Thanks,
Cole
More information about the libvir-list
mailing list