On Thu, 2016-08-04 at 14:32 +0200, Ján Tomko wrote:
> + } else if (cont->type ==
VIR_DOMAIN_CONTROLLER_TYPE_USB &&
> + cont->model == -1) {
> + /* Pick a suitable default model for the USB controller if none
> + * has been selected by the user.
> + *
> + * We rely on device availability instead of setting the model
> + * unconditionally because, for some machine types, there's a
> + * chance we will get away with using the legacy USB controller
> + * when the relevant device is not available.
> + *
> + * See qemuBuildControllerDevCommandLine() */
> + if (ARCH_IS_PPC64(def->os.arch)) {
> + /* Default USB controller for ppc64 is pci-ohci */
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI))
> + cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI;
<thinking_out_loud>
So, if I understand correctly, if we left the model for PPC64 at -1:
[A] before 8156493 Fix USB model defaults for ppc64 [v1.3.1-rc1~47]
we pass -usb on the command line, drop the controller from migration
XML and possibly re-add it on the destination
[B] after that commit
we pass -device pci-usb-ohci, lose that information in migration
[C] after 192a53e0 send default USB controller in xml [v1.3.5-rc1~459]
We use -device pci-usb-ohci, passing the address to the
destination
Migration between [A] and anything else is AFAIK broken since the
address used by -usb never matches the one we pick for the -device,
https://bugzilla.redhat.com/show_bug.cgi?id=1357468
Migration between [C] and [B] should just work as long as hotplugging
did not change the order of the devices and the controller auto-added on
the destination gets the same address as the one that was removed.
You mean between [B] and [C]? When migrating between [C] and
[B], the destination will receive the <controller> element,
including the PCI address, so it should have no problem just
using it.
</thinking_out_loud>
Is it possible to create a -device syntax that will match the -usb
command line generated by [A] (e.g. by specifying a 0000:00.00 PCI
addr)?
Yes, something like
-device pci-ohci,id=usb,bus=pci.0,addr=0x0
will work for QEMU, but we have no way of representing that in
the guest configuration:
<address type='pci'
domain='0x0000' bus='0x00'
slot='0x00' function='0x0'/>
will result in libvirt assigning a new PCI address for the
device in recent libvirt versions, and an outright error in
older libvirt versions, including [A].
Assuming that we made it possible to specify such an address,
it would be impossible for the target of the migration to make
out whether the migration is coming from [A] or [B] - one of
the two would be broken anyway.
This change should fix migration from [B] and [C] and back:
* model=-1 coming from those hosts will get adjusted to OHCI on parsing
* we should not format model=-1 when migrating back to those hosts
Migration between [B] and [C] should already work in both
directions AFAICT. Can you give me an example where it
wouldn't?
> + } else {
> + /* Default USB controller for anything else is piix3-uhci */
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI))
> + cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
For non-PPC64, migration was not broken before.
Ancient QEMUs not supporting QEMU_CAPS_PIIX3_USB_UHCI will still get
model=-1 (or not, I doubt anyone will run new libvirt with them).
Should we set it unconditionally for i440fx machines?
Everything else gets the model changed to PIIX3-UHCI.
I think we still want to make a last-ditch effort to provide
some sort, any sort, of USB controller. Or rather, that we
have to. Honestly, I'd rather just drop the -usb handling
altogether and expect users not to mix modern-day libvirt
with QEMU versions from 5+ years ago.
Of course, this breaks migration to pre-0.9.x libvirt which did not
support USB controllers. I am okay with that, but you might want to get
a second opinion on that.
How far back can you reasonably expect to migrate a guest? How
would you even migrate a guest that uses USB controllers to a
version of libvirt that doesn't support USB controllers?
--
Andrea Bolognani / Red Hat / Virtualization