
On Thu, 2016-07-21 at 16:31 +0100, Daniel P. Berrange wrote:
It seems that we could solve this by just changing the logic in qemuDomainAssignDevicePCISlots() so that when it is auto-assigning addresses, it always uses 00:00.0 for the USB controller when guest arch is ppc64. Existing guests deployed from a libvirt version using -device won't be affected, because we'll have recorded a PCI address for that in the XML and continue to use that. ie the auto-allocation logic won't run for them. Existing guests deployed from a libvirt version using -usb should then get the fixed PCI address of 00:00.0 when they upgrade to the fix libvirt (assuming they didn't get run with a broken libvirt in between). Mh, that could actually work! Thanks :) I'll try to cook up a patch tomorrow. Unfortunately Martin pointed out a problem with this plan: even though they're not actually using it, old guests have been assigned a PCI address for the USB controller. Which means we can't tell whether <controller type='usb' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </controller is an old guest that should be assigned the 00:00.0 address or a new guest that should keep using the 00:03.0 address :( If we revert 8156493d8db95de91dd9ace743df0fd4dff98281 we'll go back to using -usb and the PCI addr reported in the XML is just completely wrong vs what's actually being used. If the user requests an explicit addr for the USB controller, we'll ignore it and that could cause boot failure if the user has requested something else in addr 00:00.0 I think we have no choice but to stick with using -device, because that is clearly the preferred syntax long term, and it allows us to actually honour the addresses requested in the XML, which the original code was not doing. IOW the old code < 1.3.1 using -usb was clearly broken, so I don't think reverting is an option we can take. Furthermore reverting it will instead break anyone with libvirt 1.3.1 -> 2.0.0
It was actually more broken than I remembered - it used -usb on ppc64 because the condition for not using it was to have PIIX3, which is IIUC x86-specific hardware.
So no matter what we do some portion of users are screwed. On balance I think users of libvirt < 1.3.1 will just have to take the pain. We can document a procedure to minimize that pain. Specifically if you have libvirt < 1.3.1 and want to upgrade them 1. Use virsh save-image-edit to change the XML for all existing saved images, and fix the PCI address slot to be 0 instead of 3. This should allow new libvirt to load the image, since itsXML will now reflect the reality of what was used.
I tried this with libvirt-1.2.17-13.el7.ppc64le. The save image contains just <controller type='usb' index='0'/> If you add a PCI address that's not 00:00.0, it will be ignored; 00:00.0 will cause save-image-edit to fail with XML error: Invalid PCI address 0000:00:00, at least one of domain, bus, or slot must be > 0
2. For any running guests edit /var/run/libvirt/qemu/*.xml to again fix the PCI address slot from 3 to 0. Then restart libvirtd so it reloads its config. This should then allow those running guests to be live migrated
This fails with the same error as above; moreover, the guest will disappear. The QEMU process will still be running, of course. I'm afraid the only way for people running libvirt < 1.3.1 to make their guests live migratable is to tweak the XML so that it looks like <controller type='usb' model='pci-ohci' ... and shutdown the guests. When they are started again, they will get -device pci-ohci,... on the command line and live migration (back and forth) will work as expected. I'd be extremely happy if I were proven wrong, though :) -- Andrea Bolognani / Red Hat / Virtualization