On 05/24/2015 09:38 AM, Pavel Fedin wrote:
Virt machine in qemu has PCI generic host controller, and can use
PCI devices. This
provides performance improvement as well as vhost-net with irqfd support for
virtio-net.
However libvirt still insists on virtio devices attached to Virt machine to have MMIO
bindings.
This patch allows to use both. If the user doesn't specify <address
type='virtio-mmio'>,
PCI will be used by default.
This patch breaks make check, since there's test cases that depend on the
virtio-mmio behavior. I think you'll need to add a new qemu capabilities flag
like QEMU_CAPS_AARCH64_VIRT_PCI that's enabled for qemu 2.3.0 or later... if
it's available, then we default to PCI.
After that we will definitely want to add test cases to exercise this new
behavior.
Another thing is we probably need to extend the XML parser to add a
<controller type='pci'> automatically like we do for x86.
I can help with some of this if you want, just let me know.
"virt-" prefix is intentionally ignored in third chunk
because it is a temporary thing
and qemu developers agreed to use "gic version" option, for which there is
already support
in libvirt.
I don't follow this, can you expand a bit? Maybe Michal can explain too since
he did the libvirt gic patches
Thanks,
Cole
---
src/qemu/qemu_command.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 81e89fc..0580a37 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -457,7 +457,7 @@ qemuDomainSupportsNicdev(virDomainDefPtr def,
/* non-virtio ARM nics require legacy -net nic */
if (((def->os.arch == VIR_ARCH_ARMV7L) ||
(def->os.arch == VIR_ARCH_AARCH64)) &&
- net->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO)
+ strcmp(net->model, "virtio"))
return false;
return true;
@@ -1374,9 +1374,7 @@ qemuDomainAssignARMVirtioMMIOAddresses(virDomainDefPtr def,
{
if (((def->os.arch == VIR_ARCH_ARMV7L) ||
(def->os.arch == VIR_ARCH_AARCH64)) &&
- (STRPREFIX(def->os.machine, "vexpress-") ||
- STREQ(def->os.machine, "virt") ||
- STRPREFIX(def->os.machine, "virt-")) &&
+ STRPREFIX(def->os.machine, "vexpress-") &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO)) {
qemuDomainPrimeVirtioDeviceAddresses(
def, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO);
@@ -2501,6 +2499,12 @@ qemuAssignDevicePCISlots(virDomainDefPtr def,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW)
continue;
+ if (((def->os.arch == VIR_ARCH_ARMV7L) ||
+ (def->os.arch == VIR_ARCH_AARCH64)) &&
+ STREQ(def->os.machine, "virt") &&
+ def->disks[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO)
+ continue;
+
if (def->disks[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("virtio disk cannot have an address of type
'%s'"),