On Fri, 2016-06-17 at 11:36 -0400, Laine Stump wrote:
On 06/17/2016 08:43 AM, Andrea Bolognani wrote:
> There has been some progress lately in enabling virtio-pci on
> aarch64 guests; however, guest OS support is still spotty at best,
> so most guests are going to be using virtio-mmio instead.
>
> Currently, mach-virt guests are closely modeled after q35 guests,
> and that includes always adding a dmi-to-pci-bridge that's just
> impossible to get rid of.
Yeah. Sorry my simple patches from yesterday didn't get you as far as
you needed to go.
That's quite all right, you did a bunch of work and I merely
walked the last mile :)
> * other than the pcie-root. This is so that there
will be hot-pluggable
> - * PCI slots available
> + * PCI slots available.
> + *
> + * We skip this step for aarch64 mach-virt guests, where we want to
> + * be able to have a pure virtio-mmio topology
> */
> if (virDomainControllerFind(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 1) < 0
&&
> + !qemuDomainMachineIsVirt(def) &&
You're assuming that the only virt* machinetypes will be aarch64, which
may be reasonable now, but not in the future (periodically someone from
qemu will mention the idea of a "virt" machinetype for x86, which is
legacy-free and accepts only virtio devices). Wouldn't a more specific
comparison be better here (and in the other places in this patch)?
I'll reply to this one in the sub-thread Martin started.
> !virDomainDefAddController(def,
VIR_DOMAIN_CONTROLLER_TYPE_PCI, 1,
> VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE))
> goto cleanup;
Okay, so pcie-root is still always "there", which isn't a problem since
the presence of pcie-root in the config doesn't actually change anything
in the qemu commandline or resulting virtual machine (it's a default
device in qemu that can't be removed).
Exactly, that's why it *has* to be in the domain XML. Since
it can't be removed or disabled, it should always be displayed
to the user.
> diff --git a/src/qemu/qemu_domain_address.c
b/src/qemu/qemu_domain_address.c
> index ca3adc0..883264a 100644
> --- a/src/qemu/qemu_domain_address.c
> +++ b/src/qemu/qemu_domain_address.c
> @@ -1483,9 +1483,15 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
> }
>
> /* Reserve 1 extra slot for a (potential) bridge only if buses
> - * are not fully reserved yet
> + * are not fully reserved yet.
> + *
> + * We don't reserve the extra slot for aarch64 mach-virt guests
> + * either because we want to be able to have pure virtio-mmio
> + * guests, and reserving this slot would force us to add at least
> + * a dmi-to-pci-bridge to an otherwise PCI-free topology
> */
> if (!buses_reserved &&
> + !qemuDomainMachineIsVirt(def) &&
> virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
> goto cleanup;
You could save some time by just putting the whole thing from "for (i =
0; i < addrs->nbuses; i++)" down to that "goto cleanup" inside an
"if
(!qemuDomainMachineIsVirt(def)) { ... }". (maybe replacing
qemuDomainMachineIsVirt() with something more specific, as noted above).
I didn't change that because it would have added one level
of nesting to the code, and qemuDomainPCIBusFullyReserved()
should be fairly cheap anyway. We can always revisit it
later.
As we've discussed in IRC, eventually there should be a way to
disable
this for *every* platform, not just aarch64/virt. Possibly an
"openPCISlots" attribute somewhere in the domain that tells how many
slots should be left open for hotplug (with default being 1 for
x86/440fx, and up for discussion on other platforms).
Agreed. We're not quite there yet, unfortunately, so for now
this mach-virt specific fix will have to do :)
> <target dev='sda' bus='scsi'/>
> <address type='drive' controller='0' bus='0'
target='0' unit='0'/>
> </disk>
> + <controller type='pci' index='0'
model='pcie-root'/>
This surprised me for a minute, since you're now explicitly adding
pcie-root even though it's still implicitly added for you (and, for
example, qemuxml2argvtest completes successfully without it). But I
guess it doesn't hurt anything to have it in the file, as it makes it
obvious that the dmi-to-pci-bridge isn't just being added on top of nothing.
Yeah, that was the pretty much my reasoning :)
(Hopefully all of this will soon be a thing of the past - for *all*
arches/machinetypes if you put in a device with <address type='pci'/>
(or a device that can only be connected via PCI), then all the necessary
pci controllers should just magically appear, otherwise not).
I think we're all looking forward to that brighter day! :)
ACK.
Thanks, I've pushed it.
--
Andrea Bolognani
Software Engineer - Virtualization Team