[libvirt] [PATCH 1/2] qemu: assign correct type of PCI address for vhost-scsi when using pcie-root

John Ferlan jferlan at redhat.com
Tue Dec 19 12:21:01 UTC 2017

On 12/18/2017 10:35 AM, Laine Stump wrote:
> Commit 10c73bf1 fixed a bug that I had introduced back in commit
> 70249927 - if a vhost-scsi device had no manually assigned PCI
> address, one wouldn't be assigned automatically. There was a slight
> problem with the logic of the fix though - in the case of domains with
> pcie-root (e.g. those with a q35 machinetype),
> qemuDomainDeviceCalculatePCIConnectFlags() will attempt to determine
> if the host-side PCI device is Express or legacy by examining sysfs
> based on the host-side PCI address stored in
> hostdev->source.subsys.u.pci.addr, but that part of the union is only
> valid for PCI hostdevs, *not* for SCSI hostdevs. So we end up trying
> to read sysfs for some probably-non-existent device, which fails, and
> the function virPCIDeviceIsPCIExpress() returns failure (-1). By
> coincidence, the return value is being examined as a boolean, and
> since -1 is true, we still end up assigning the vhost-scsi device to
> an Express slot, but that is just be chance (and could fail in the
> case that the gibberish in the "hostside PCI address" was the address
> of a real device that happened to be legacy PCI).

^^  Probably something that should be fixed as a separate patch?
Hazards of the undocumented virPCIDeviceIsPCIExpress return values.

> Since (according to Paolo Bonzini at least) vhost-scsi devices appear
> just like virtio-scsi devices in the guest, they should follow the
> same rules as virtio devices when deciding whether they should be
> placed in an Express or a legacy slot. That's accomplished in this
> patch by returning early with virtioFlags, rather than erroneously
> using hostdev->source.subsys.u.pci.addr. It also adds a test case for
> PCIe to assure it doesn't get broken in the future.
> ---
>  src/qemu/qemu_domain_address.c                     |  7 ++++
>  .../hostdev-scsi-vhost-scsi-pcie.args              | 25 ++++++++++++++
>  .../hostdev-scsi-vhost-scsi-pcie.xml               | 23 +++++++++++++
>  tests/qemuxml2argvtest.c                           |  7 ++++
>  .../hostdev-scsi-vhost-scsi-pcie.xml               | 40 ++++++++++++++++++++++
>  tests/qemuxml2xmltest.c                            |  7 ++++
>  6 files changed, 109 insertions(+)
>  create mode 100644 tests/qemuxml2argvdata/hostdev-scsi-vhost-scsi-pcie.args
>  create mode 100644 tests/qemuxml2argvdata/hostdev-scsi-vhost-scsi-pcie.xml
>  create mode 100644 tests/qemuxml2xmloutdata/hostdev-scsi-vhost-scsi-pcie.xml

Reviewed-by: John Ferlan <jferlan at redhat.com>


Thanks - I was wondering about PCIE, but figured/assumed that since it's
an HBA sitting on a bus as opposed to a LUN that we're making it look
like a disk on the guest, that the code would magically work. Just
seemed different enough from a MDEV which is to me more like how a vHBA
LUN would be handled as a "child" (so to speak) of some device that's
sitting on a bus.

More information about the libvir-list mailing list