[libvirt] [PATCH v3 18/18] [RFC] qemu: try to put ich9 sound device at 00:1B.0

Andrea Bolognani abologna at redhat.com
Thu Oct 13 18:07:27 UTC 2016


On Tue, 2016-09-20 at 15:14 -0400, Laine Stump wrote:
> Real Q35 hardware has an ICH9 chip that includes several integrated
> devices at particular addresses (see the file docs/q35-chipset.cfg in
> the qemu source). libvirt already attempts to put the first two sets
> of ich9 USB2 controllers it finds at 00:1D.* and 00:1A.* to match the
> real hardware. This patch does the same for the ich9 "HD audio"
> device.
> 
> The reason I made this patch is that currently the *only* device in a
> reasonable "workstation" type virtual machine config that requires a
> legacy PCI slot is the audio device, Without this patch, the standard
> Q35 machine created by virt-manager will have a dmi-to-pci-bridge and
> a pci-bridge just for the sound device; with the patch (and if you
> change the sound device model from the default "ich6" to "ich9"), the
> machine definition constructed by virt-manager has absolutely no
> legacy PCI controllers - any legacy PCI devices (e.g. video and sound)
> are on pcie-root as integrated devices.

Everything past this point, while valuable for the discussion,
should IMHO be left out of the commit message.

> As cool as it is to have virt-manager making a legacy-PCI-free config
> so easily, I'm undecided whether or not this is a worthwhile patch. On
> one hand, it's following an existing convention of trying to place
> devices that are known to be integrated chipset devices on Q35
> hardware at the same address they appear in real life (but doesn't
> insist on this address, and doesn't add any new device if one isn't
> already present in the config). On the other hand it creates yet
> another exception to "follow the same formula for everything", while
> it's probably better for us to be trying to *get away* from that.

I'm for merging this: it's straighforward enough, and if we
ever decide to start moving stuff off pcie.0 we can just get
rid of the code you're adding without affecting existing
guests at all.

> Two alternate solutions:
> 
> 1) convince virt-manager to use "ich9" as the default sound for Q35,
>    and explicitly place it at 00:1B.0 in the definition it sends to
>    libvirt.

After this has been merged, virt-manager will still want to
change its default to ich9 (based on information retrieved
from libosinfo, I assume), but it will not need to hardcode
this kind of knowledge, which sounds perfectly fine to me.

> 2) convince qemu to add a PCI Express sound device (I'm not sure which
>    one would be most appropriate).

That would probably be nice to have, but I'd rather have
generic PCI/PCIe controllers than a PCIe sound card, if any
QEMU developer is reading this ;)

> ---
>  src/qemu/qemu_domain_address.c                     |  25 +++++
>  .../qemuxml2argv-q35-virt-manager-basic.args       |  56 ++++++++++
>  .../qemuxml2argv-q35-virt-manager-basic.xml        |  76 ++++++++++++++
>  tests/qemuxml2argvtest.c                           |  31 ++++++
>  .../qemuxml2xmlout-q35-virt-manager-basic.xml      | 116 +++++++++++++++++++++
>  tests/qemuxml2xmltest.c                            |  23 ++++
>  6 files changed, 327 insertions(+)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-q35-virt-manager-basic.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-q35-virt-manager-basic.xml
>  create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virt-manager-basic.xml
> 
> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
> index a9c4c32..6cfd710 100644
> --- a/src/qemu/qemu_domain_address.c
> +++ b/src/qemu/qemu_domain_address.c
> @@ -1218,6 +1218,31 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
>              goto cleanup;
>          }
>      }
> +
> +    memset(&tmp_addr, 0, sizeof(tmp_addr));
> +    tmp_addr.slot = 0x1B;
> +    if (!virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) {
> +        /* Since real Q35 hardware has an ICH9 chip that has an
> +         * integrated HD audio device at 0000:00:1B.0 put any
> +         * unaddressed ICH9 audio device at that address if it's not
> +         * already taken. If there's something already there, let the
> +         * normal device addressing assign something later.
> +         */
> +        for (i = 0; i < def->nsounds; i++) {
> +            virDomainSoundDefPtr sound = def->sounds[i];
> +
> +            if (sound->model != VIR_DOMAIN_SOUND_MODEL_ICH9)
> +                continue;
> +            if (!virDeviceInfoPCIAddressWanted(&sound->info))
> +                break;

Mh, why break instead of continue here?

I'm assuming people won't have more than one ich9 sound card
per guest, but if they did and one of them already had a PCI
address assigned (which is not 0000:00:1B.0 because of the
outer check) why wouldn't we want to try assigning the next
one to 0000:00:1B.0?

> +            if (virDomainPCIAddressReserveSlot(addrs, &tmp_addr, flags) < 0)
> +                goto cleanup;

Add an empty line here, please.

> +            sound->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
> +            sound->info.addr.pci = tmp_addr;
> +            break;
> +        }
> +    }
> +
>      ret = 0;
>   cleanup:
>      VIR_FREE(addrStr);

ACK

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list