[libvirt] [PATCH] Allow PCI virtio on ARM "virt" machine

Cole Robinson crobinso at redhat.com
Tue May 26 00:03:20 UTC 2015


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'"),
> 




More information about the libvir-list mailing list