You need to sign in or sign up before continuing.
  • L
    qemu: assign correct type of PCI address for vhost-scsi when using pcie-root · 18c24bc6
    Laine Stump 提交于
    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 by 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).
    
    Since (according to Paolo Bonzini) 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.
    18c24bc6
qemuxml2xmltest.c 47.0 KB